2015-10-29 30 views
0

我正在制定時間表計劃。給定[t,t,t,f,t][f,f,t,f,f]。 我想有後續功能如何在序言中實現列表的AND運算符?

and(L,[t,t,t,f,t],[f,f,t,f,f]). 
L = [f,f,t,f,f]. 

我知道如何實施和2元的運營商。但我不知道如何實現列表版本。

這是我已經做了:

available(Z,X,Y):- Z = t, X = t, Y = t. 
available(Z,X,Y):- Z = f, X = f. 
available(Z,X,Y):- Z = f, Y = f. 

回答

3

我會先定義二進制和band/3如下:

band(t,t,t). 
band(t,f,f). 
band(f,t,f). 
band(f,f,f). 

,然後用maplist/3收集所有的答案:

and(L, Left, Right):- 
    maplist(band, Left, Right, L). 

樣品查詢:

?- and(L,[t,f,t,f],[t,t,f,f]). 
L = [t, f, f, f] 
1

首先,讓我們來修復and/3覆蓋所有的可能性。請注意,您可以在規則的頭原子結合,所以不是

xyz(X) := X=a; 

你可以寫

xyz(a). 

,並跳過身體。這裏是and/3

and(t, t, t). 
and(t, f, f). 
and(f, t, f). 
and(f, f, f). 

你可以縮小這兩個規則,但它不是上榜的工作很重要。

有幾種使用內置列表謂詞製作and_list/3的方法,例如maplist/4。然而,人們應該學會寫這個的基本遞歸的方式,因爲它有助於瞭解Prolog的其餘部分:

and_list([], [], []). 
and_list([H1|T1], [H2|T2], [R|RT]) :- 
    and(H1, H2, R), 
    and_list(T1, T2, RT). 

,第一款基本條款。它告訴Prolog當列表爲空時該怎麼做。第二個子句將and_list/3的遞歸調用與and/3的調用組合在兩個列表頭上。

Demo.

+0

這就是我一直在使用你的方法 - and_list([T,T,F,T] ,[F,F,T,T],L)。 L = [f | _G883] –

+0

感謝您的回答。你給了我一個主意 –

+0

你輸入了錯誤的變量.LOL.So不小心。它應該是RT,而不是TR –

0

你應該遵循你從其他答案中得到的指示。 但只是爲了顯示你當前的代碼是如何工作的,考慮

and(F,X,Y) :- maplist(available, F,X,Y), !. 

能產生

?- and(L,[t,t,t,f,t],[f,f,t,f,f]). 
L = [f, f, t, f, f].