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

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

嘿伙计们,我基本上想检查谁坐在谁旁边的真假值,

当我在编译器中输入

issitting(rosie, andrew). 

但是,当我键入时,会返回一个真值

issitting(andrew, rosie). 

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

您将如何更改规则以使 Prolog 了解如果用户切换名称,它们仍然是正确的(不是错误的)。

我不明白为什么它给了我 'false' 。

我被卡住了,这是迄今为止我能做到的最好的:/

谢谢你。

4

1 回答 1

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

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

如果发生意外失败,请尝试概括您的查询(和您的程序)。

于 2013-01-09T02:39:47.643 回答