Prolog中返回的值为False?

Prolog中返回的值为False?,prolog,Prolog,嘿,我基本上想看看谁坐在谁旁边的是真的还是假的 当我输入编译器时 sitting(mary, james). sitting(rosie, andrew). sitting(kiera, tom). issitting(X, Y) :- sitting(X, Y). 但是,当我键入 issitting(rosie, andrew). 返回一个假值(应该是真的,因为它们坐在一起)。我不想在用户检查谁坐在旁边时再添加三行代码(包括所有可能的组合) 您将如何修改规则以使Prolog理解,如果用

嘿,我基本上想看看谁坐在谁旁边的是真的还是假的

当我输入编译器时

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

issitting(X, Y) :- sitting(X, Y).
但是,当我键入

issitting(rosie, andrew). 
返回一个假值(应该是真的,因为它们坐在一起)。我不想在用户检查谁坐在旁边时再添加三行代码(包括所有可能的组合)

您将如何修改规则以使Prolog理解,如果用户切换名称,它们仍然是真的(不是假的)

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

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

多谢各位

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

让我重申一下你的问题所在:你期望
issiting(andrew,rosie)
是真的。但事实并非如此。如果你问别人这个问题,你会怎么做?也许你会问为什么?为什么安德鲁不坐在罗西旁边?比如说,你不理解这些解释,你可能会问另一个问题:

安德鲁至少坐在任何人旁边吗

所以这个问题是原始问题的一个推广。在Prolog中,我们可以借助如下变量做同样的事情:

?- issitting(andrew, rosie).
false.
那么现在我们知道安德鲁和谁都不在一起了?困惑的那么,我们可以再次概括查询:

是否至少有一个人坐在任何人旁边

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

?- issitting(Person, Anyone).
Person = mary,
Anyone = james ;
Person = rosie,
Anyone = andrew ;
Person = kiera,
Anyone = tom.
但重点是向您展示一个良好的通用调试策略:

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


回答得很好。你能称之为添加交换规则吗?@DanielLyons:谢谢。如果它是同一谓词的规则,我更愿意称之为交换的(这里我试图避免明显的终止问题)。当然,它是可交换的。
?- issitting(andrew, Anyone).
false.
?- issitting(Person, Anyone).
Person = mary,
Anyone = james ;
Person = rosie,
Anyone = andrew ;
Person = kiera,
Anyone = tom.
issitting(X, Y) :- sitting(Y, X).