2014-10-09 40 views
1

我討厭在這裏提出基本問題,但看起來好像很難找到有關Prolog的良好手冊。Prolog複合術語

我有兩個方面:

woman(alice). 
woman(janice). 

現在,我想作以下複合詞:

sisters(woman(X), woman(Y)). 

當我運行查詢姐妹(X,Y),我得到這個天書jumbo: X =女人(_G2215), Y =女人(_G2217)

事實上,一切都滿足它。

sisters(woman(david), woman(xxxxxx)) 

也是如此。

爲什麼它不按預期的方式工作?看起來,prolog從未看過前兩個術語。

我知道我應該讓

sisters(X, Y) :- woman(X), woman(Y), X \= Y 

,但我想知道爲什麼第一種方式是行不通的。

回答

1

爲了詳細說明保羅的答案...

您已經確定了以下事實:

woman(alice). % 'alice' is a woman 
woman(janice). % 'janice' is a woman 
sisters(woman(X), woman(Y)). % woman(X) is a sister of woman(Y) for ANY X and Y 

所以你可以看到,其原因保羅指出,關於複合詞和Prolog的不遞歸地查詢它們,你已經朝着你不想要的方向前進。在這種情況下,你已經陳述了一個事實,sisters(woman(X), woman(Y))有兩個獨立的,沒有根據的變量。由於它們是變量,並且您沒有任何限制其值的子句,因此它們可以是任何東西。

因此,對於下面的查詢:

sisters(X, Y). 

Prolog的看着你的事實和謂詞進行匹配和發現,sisters(woman(X), woman(Y))。符合邏輯的答案,因此:

X = woman(_G2215) 
Y = woman(_G2217) 

這只是說,這是對的XY其中_G2215_G2217是任意變量這些值如此。根據您所陳述的規則和事實,這些值都是真實的。特別是,這意味着,這是真的:

sisters(woman(david), woman(xxxxxx)) 

因爲X可能是davidY可能是xxxxxx,這將是真實的,因爲你的事實說:

sisters(woman(X), woman(Y)). 

你可以引入一個規則:

sisters(woman(X), woman(Y)) :- woman(X), woman(Y), X \= Y. 

然後你會開始明智地回答查詢,sisters(X, Y)

X = woman(alice) 
Y = woman(janice) 

或者更簡單地說,你有:

sisters(X, Y) :- woman(X), woman(Y), X \= Y. 

有了結果:

X = alice 
Y = janice 
1

在條款的情況下:

sisters(woman(X), woman(Y)). 

的參數是術語women/1來電來women/1謂語。請注意,Prolog不是一種功能性語言。