Prolog化合物术语

时间:2014-10-09 23:48:34

标签: prolog

我讨厌在这里提出基本问题,但似乎很难找到关于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

但我想知道为什么第一种方法不起作用。

2 个答案:

答案 0 :(得分:1)

对于该条款:

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

参数是women/1women/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)

这只是说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