2013-01-09 103 views
2
sitting(mary, james). 
sitting(rosie, andrew). 
sitting(kiera, tom). 

issitting(X, Y) :- sitting(X, Y). 

嗨,我基本上要检查谁谁的true或false值被坐在旁边的是谁,在Prolog中返回False值?

当我在编译器

issitting(rosie, andrew). 

返回true值类型,然而,当我输入

issitting(andrew, rosie). 

返回一个错误的值(这应该是真的,因为它们坐在一起)。如果用户检查谁坐在一起(使用所有可能的组合),我不想添加三行额外的代码。

你会如何改变规则让Prolog明白,如果用户切换名称,他们仍然是真实的(不是假的)。

我不明白为什么它给我'错误'。

我被卡住,这是最好的我能得到这样做的远:/

谢谢。

回答

6

(我可能只是指出问题所在,但你不会学到任何东西。我假设你正在使用SWI,既然你说是返回false。)

?- issitting(andrew, rosie). 
false. 

让我重申你的问题是:你期待issitting(andrew, rosie)是真实的。但事实并非如此。如果你向一个人提出这个问题,你会怎么做?可能你会问为什么?为什么andrew坐在rosie旁边?并且,说,你不明白的解释,你可能会问另一个问题:

andrew至少坐在旁边的人?

所以这个问题是泛化原来的问题。在Prolog,我们可以做同样的事情有变量的帮助下,像这样:

?- issitting(andrew, Anyone). 
false. 

所以,现在我们知道,andrew issitting旁边没人?困惑?那么,我们可以再次推广查询:

至少有一个人坐在旁边的人?

?- issitting(Person, Anyone). 
Person = mary, 
Anyone = james ; 
Person = rosie, 
Anyone = andrew ; 
Person = kiera, 
Anyone = tom. 

所以有周围的一些人。实际上,原因是你有sitting/2和另一个关系issitting/2。您需要通过添加以下规则来概括issitting/2

issitting(X, Y) :- sitting(Y, X). 

但有一点是要告诉你一个好一般调试策略:

在意外失败,试着概括您的查询的情况下(和你的程序)。

+1

梦幻般的答案。你能否称此为添加交换规则? –

+1

@DanielLyons:谢谢。如果它是一个谓词相同的规则(我试图在这里避免显而易见的终止问题),我宁愿称它为交换。但当然,它是可交换的。 – false