Prolog 序言复合词
我不想在这里问一些基本的问题,但是,似乎很难找到好的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似乎从
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