Prolog 序言复合词

Prolog 序言复合词,prolog,Prolog,我不想在这里问一些基本的问题,但是,似乎很难找到好的Prolog手册 我有两个任期: woman(alice). woman(janice). 现在,我想做以下复合词: sisters(woman(X), woman(Y)). 当我运行查询姐妹(X,Y)时,我得到一个混乱的结果: X=女性(_G2215), Y=女性(_G2217) 事实上,一切都满足了它 sisters(woman(david), woman(xxxxxx)) 这也是事实 为什么它不能按预期的方式工作?prolog似乎从

我不想在这里问一些基本的问题,但是,似乎很难找到好的Prolog手册

我有两个任期:

woman(alice).
woman(janice).
现在,我想做以下复合词:

sisters(woman(X), woman(Y)).
当我运行查询姐妹(X,Y)时,我得到一个混乱的结果: X=女性(_G2215), Y=女性(_G2217)

事实上,一切都满足了它

sisters(woman(david), woman(xxxxxx))
这也是事实

为什么它不能按预期的方式工作?prolog似乎从来没有看过前两个术语

我知道我会成功的

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

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

在条款的情况下:

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

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

要详细说明保罗的答案

你已经证实了以下事实:

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并没有递归地查询它们,你们已经朝着你们不想去的方向前进了。在本文中,您已经陈述了一个事实,
姐妹(女人(X),女人(Y))
有两个独立的、未经证明的变量。因为它们是变量,并且没有任何
姐妹/2
子句来约束它们的值,所以它们可以是任何东西

因此,对于以下查询:

sisters(X, Y).
Prolog查看您的事实和谓词是否匹配,并找到姐妹(女人(X),女人(Y))。因此,合乎逻辑的答案是:

X = woman(_G2215)
Y = woman(_G2217)
这只是说,对于
X
Y
的这些值是正确的,其中
\u G2215
\u 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.
然后,您将开始获得对查询的合理答案,
姐妹(X,Y)

或者更简单地说,正如您所说:

sisters(X, Y) :- woman(X), woman(Y), X \= Y.
结果:

X = alice
Y = janice
X = alice
Y = janice