我讨厌在这里提出基本问题,但似乎很难找到关于Prolog的好手册。
我有两个词:
woman(alice).
woman(janice).
现在,我想制作以下复合词:
sisters(woman(X), woman(Y)).
当我运行查询姐妹(X,Y)时,我得到了这个mumbo jumbo: X =女人(_G2215), Y =女人(_G2217)
事实上,一切都令人满意。
sisters(woman(david), woman(xxxxxx))
也是如此。
为什么它不按预期方式工作?看来,prolog从不关注前两个术语。
我知道我应该成功
sisters(X, Y) :- woman(X), woman(Y), X \= Y
但我想知道为什么第一种方法不起作用。
答案 0 :(得分:1)
对于该条款:
sisters(woman(X), woman(Y)).
参数是women/1
,不对women/1
谓词的调用。请注意,Prolog不是一种功能语言。
答案 1 :(得分: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/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