我有幾個事實,如下所示Prolog的問題,與和&或符號
letter(monica, suzane, '2012-02-13').
letter(suzane, janet, '2012-02-14').
letter(suzane, monica, '2012-02-14').
letter(tom, phillip, '2012-02-14').
letter(phillip, suzane, '2012-02-14').
letter(monica, phillip, '2012-02-15').
我想創建一個返回所有誰交換了一封信給X和Y的人的名字的規則,在指定日期之前。例如,如果X是monica,Y是suzane,D是2012-02-16,那麼它應該只返回phillip,因爲monica和suzane與phillip交換了一封信。
目前,我有這個規則;
letterexch(X,Y,D):-
(( (letter(X, Z, D1); letter(Z, X, D1)), \+ Z = Y);
( (letter(Y, Z, D1); letter(Z, Y, D1)), \+ Z = X)), D1 @<D, nl, print(Z),false.
我認爲或符號()之後「+ Z = Y)」應該是一個和(,)符號,而不是一個或符號(;),但是當我設置有與符號的規則( ,)和查詢,如下所示:
?- letterexch(monica, suzane, '2012-02-16').
我得到:
false
但如果我設置規則等上述具有或符號()和查詢它如下:
?- letterexch(monica, suzane, '2012-02-16').
我得到:
phillip
janet
phillip
不過,我只需要菲利普打印。 (我不介意菲利普是否因爲我知道如何擺脫它而重複)。
因此,我需要知道爲什麼當和符號(,)使用時,我得到錯誤,而不是菲利普印兩次。
任何幫助將不勝感激。
預先感謝您。
無論是「和」還是「或」都是在上下文中有意義的邏輯問題。在這種情況下,你的表達'(字母(X,Z,D1);字母(X,Z,D1))'應該是'(字母(X,Z,D1);字母(Z,X,D1) ,除非你想要求X和Z之間的「字母」關係是雙向的,否則「或」是正確的。 – lurker