2014-10-09 92 views
1

我讨厌在这里提出基本问题,但看起来好像很难找到有关Prolog的良好手册。Prolog复合术语

我有两个方面:

woman(alice). 
woman(janice). 

现在,我想作以下复合词:

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

当我运行查询姐妹(X,Y),我得到这个天书jumbo: X =女人(_G2215), Y =女人(_G2217)

事实上,一切都满足它。

sisters(woman(david), woman(xxxxxx)) 

也是如此。

为什么它不按预期的方式工作?看起来,prolog从未看过前两个术语。

我知道我应该让

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

,但我想知道为什么第一种方式是行不通的。

回答

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(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 
1

在条款的情况下:

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

的参数是术语women/1来电来women/1谓语。请注意,Prolog不是一种功能性语言。