为了详细说明保罗的答案...
您已经确定了以下事实:
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)
这只是说,这是对的X
和Y
其中_G2215
和_G2217
是任意变量这些值如此。根据您所陈述的规则和事实,这些值都是真实的。特别是,这意味着,这是真的:
sisters(woman(david), woman(xxxxxx))
因为X
可能是david
和Y
可能是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