2011-12-15 70 views
27

我面對的問題有點微不足道。 我想在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. 

而且我沒有得到我想要的結果: (

+6

你想要什麼結果? – 2011-12-15 16:51:36

+2

什麼是你得到的結果也將是很好的問題可讀性btw – m09 2011-12-15 16:54:34

+0

我希望它爲我打印課程名稱的組合,其中兩個不相等,我的意思是:ai-pl ai-os pl-ai pl -os os-ai os-pl – 2011-12-15 16:55:53

回答

12

在這兩個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). 
33

在地方的not(X = Y)你需要寫\+ X = YX \= 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中。

1

就像你說的,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). 

這將防止重複逆轉結果。

@<指的是原子小於。 <用於整數,@<用於原子。

3

如用戶上面的 「假」,即

附屬於回答 「在地方的不(X = Y),你需要寫\ + X = Y,」

這可能會給印象:

a。 「不」和「\ +」是不同的東西

b。 \ +將起作用,而不會,錯,不會。

我的理解是「不」和「\ +」是等價的,但\ +在現代Prolog程序中是首選,因爲它傳達了一種更直觀的感覺。具體來說,雖然「不」可能暗示對不謹慎的編碼者「不正確」,但「\ +」暗示「不可證明」,這更接近該操作實際所說的真相。在Prolog中,「不是」是「否定爲失敗」的例子,但是人們認爲\ +會讓程序員更清楚地知道在任何給定的規則中究竟是什麼。所以你可以使用「不」(大多數PL實現爲了向後兼容性而保留它),但是要成爲一個慣用的現代PL程序員,你可能應該更喜歡使用\ +。