详细说明保罗的回答...
您已确定以下事实:
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
因此您可以看到,由于 Paulo 指出复合术语以及 Prolog 不递归查询它们的原因,您已经朝着您不打算的方向前进。在这种情况下,您已经陈述了一个事实,sisters(woman(X), woman(Y)) 有两个独立的、未实例化的变量。由于它们是变量,并且您没有任何 sisters/2 子句来限制它们的值,因此它们可以是任何值。
所以对于下面的查询:
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