Prolog复合术语

3
我很不好意思在这里问一些基础问题,但是好像很难找到关于Prolog的好手册。
我有两个术语:
woman(alice).
woman(janice).

现在,我想要创建以下复合术语:
sisters(woman(X), woman(Y)).

当我运行查询sisters(X,Y)时,我得到了这个混乱的结果: X = woman(_G2215), Y = woman(_G2217)
实际上,所有的东西都符合它。
sisters(woman(david), woman(xxxxxx))

这也是正确的。

为什么它不能按照预期的方式工作?似乎,Prolog从不查看前两个术语。

我知道我应该这样做

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

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

3
为了详细说明Paulo的答案...
您已经确认了以下事实:
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)

这只是说在XY的这些值上是正确的,其中_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

1
在该条款中:
sisters(woman(X), woman(Y)).

参数是术语women/1,而不是women/1谓词的调用。请注意,Prolog不是一种函数式语言。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接