Prolog返回虚假值?

时间:2013-01-09 01:39:48

标签: prolog

sitting(mary, james).
sitting(rosie, andrew).
sitting(kiera, tom).

issitting(X, Y) :- sitting(X, Y).
嘿伙计们,我基本上想检查一下谁坐在谁旁边的真假价值,

当我输入编译器

issitting(rosie, andrew). 

但是,当我输入

时,会返回一个真值
issitting(andrew, rosie). 

返回false值(这应该是真的,因为它们彼此相邻)。如果用户检查谁坐在彼此旁边(所有可能的组合),我不想添加三行额外的代码。

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

我不明白为什么它给我“假”。

我被困住了,这是迄今为止我能做的最好的事情:/

谢谢。

1 个答案:

答案 0 :(得分:6)

(我可以指出问题,但是你不会学到任何东西。我假设你正在使用SWI,因为你说false被返回了。)

?- issitting(andrew, rosie).
false.

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

  

andrew至少坐在旁边吗?

所以这个问题是原始问题的概括。在Prolog中,我们可以在变量的帮助下做同样的事情:

?- issitting(andrew, Anyone).
false.

所以现在我们知道andrew旁边没有人?困惑?好吧,我们可以再次概括查询:

  

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

?- 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).

但重点是向您展示一个良好的通用调试策略:

  

如果出现意外故障,请尝试概括您的查询(以及您的程序)。