我面對的問題有點微不足道。 我想在Prolog的使用邏輯沒有,但似乎not/1
是不是我想要的東西:我查詢Prolog中符合邏輯的'not'是什麼?
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X),course(Y),not(X = Y).
:
have(X,Y), write(X-Y), nl , fail.
而且我沒有得到我想要的結果: (
我面對的問題有點微不足道。 我想在Prolog的使用邏輯沒有,但似乎not/1
是不是我想要的東西:我查詢Prolog中符合邏輯的'not'是什麼?
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X),course(Y),not(X = Y).
:
have(X,Y), write(X-Y), nl , fail.
而且我沒有得到我想要的結果: (
在這兩個SWI-Prolog的和GNU Prolog的,下面應該工作:
have(X, Y) :- course(X), course(Y), X \= Y.
在SWI-Prolog的,你也可以使用dif/2
,從而可以更方便,因爲你可以在謂語較早使用它:
have(X, Y) :- dif(X, Y), course(X), course(Y).
在地方的not(X = Y)
你需要寫\+ X = Y
或X \= Y
。但考慮改用dif(X,Y)
。 B,SWI,YAP,SICStus中存在dif/2
。要看到區別:
?- X = b, dif(a, X).
X = b.
?- X = b, \+ a = X.
X = b.
所以到現在一切似乎都很好。但是,如果我們簡單地用 交換兩個目標的順序呢?
?- \+ a = X, X = b.
false.
?- dif(a, X), X = b.
X = b.
(\+)/1
現在給我們帶來了不同的結果,因爲沒有爲a = X
答案 ,目標\+ a = X
將失敗。
(\+)/1
因此不否定,而是意味着此時 時刻不可證明。
A safe approximation of dif/2
也可能在ISO Prolog中。
就像你說的,OP,這是微不足道的。
嘗試
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X), course(Y), X \== Y).
這應該解決您的謂語。
展望一步,雖然在數學上的措辭,你可能尋找的解決方案(N ç 2),而不是(N P 2)你的謂詞目前提供的組合,而不是排列,選擇而不是選擇選擇的安排。這是我的想法。
如果這是你想要的,我建議你嘗試
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X), course(Y), X @< Y).
這將防止重複逆轉結果。
@<
指的是原子小於。 <
用於整數,@<
用於原子。
如用戶上面的 「假」,即
附屬於回答 「在地方的不(X = Y),你需要寫\ + X = Y,」
這可能會給印象:
a。 「不」和「\ +」是不同的東西
b。 \ +將起作用,而不會,錯,不會。
我的理解是「不」和「\ +」是等價的,但\ +在現代Prolog程序中是首選,因爲它傳達了一種更直觀的感覺。具體來說,雖然「不」可能暗示對不謹慎的編碼者「不正確」,但「\ +」暗示「不可證明」,這更接近該操作實際所說的真相。在Prolog中,「不是」是「否定爲失敗」的例子,但是人們認爲\ +會讓程序員更清楚地知道在任何給定的規則中究竟是什麼。所以你可以使用「不」(大多數PL實現爲了向後兼容性而保留它),但是要成爲一個慣用的現代PL程序員,你可能應該更喜歡使用\ +。
你想要什麼結果? – 2011-12-15 16:51:36
什麼是你得到的結果也將是很好的問題可讀性btw – m09 2011-12-15 16:54:34
我希望它爲我打印課程名稱的組合,其中兩個不相等,我的意思是:ai-pl ai-os pl-ai pl -os os-ai os-pl – 2011-12-15 16:55:53