2016-09-21 57 views
1

我對prolog非常陌生。儘可能在儘可能短的時間內儘可能地學習它。任何幫助是極大的讚賞。我正在使用MacOS Sierra。Prolog編譯錯誤?

我想輸入這些行:

nextto(_A,_B). 
nextto(_B,_C). 

當我測試使用,序言命令窗口,並執行以下命令:

?- nextto(A,C). 

是不是應該返回假的?

因爲,我的編譯結果在真正的,就像這樣:

?- nextto(A,C). 
true 
+0

我需要以這樣的方式來代碼,下一步以(A, C)。是錯誤的。 – SAN

+0

我認爲這是不可能的(A,C)。爲什麼不用nextto(a,c)呢? – coder

+0

好吧!非常感謝!!只是因爲好奇而想知道,所以用大寫字母做這件事是不可能的。 – SAN

回答

1

在序言_被認爲是像大寫字母和它有自己的特殊意義是指定匿名變量,所以_A, _B是(匿名)變量(任何以prolog中的大寫字母開頭的變量都不是原子)。您的條款:

nextto(_A,_B). nextto(_B,_C). 

實際上意味着謂詞nexxto成功與兩個變量。所以當你查詢neexto(A,C)時。它返回true。 如果您查詢下一個(a,b),它也會返回true。現在a,b是原子而不是變量,因爲它會檢查是否有旁邊的子句(a,b)。在你的條款中。然而,正如我上面所說,你的條款通過_A,_B的每一次統一而成功。的

nextto(_A,_B). 

代替:也因爲你的謂詞nexxto總是成功的,你甚至會只寫了一個條款得到同樣的結果

nextto(_A,_B). nextto(_B,_C). 
+0

'_'不是真的被認爲是大寫字母。在這種情況下它有其特殊的含義,即指定匿名變量。這意味着你可以告訴序言你不關心它的價值。因此,例如,'foo(_A).'不會生成* singleton變量*警告,但是會有'foo(A).'。 – lurker

+0

是的,你有絕對的權利,我剛纔提到,_被認爲是資本,因爲我想說它會表現得像一個變量,絕不是作爲一個術語感謝指出!我將編輯答案在那一部分更加清晰。 – coder