Prolog返回虚假值?

Adz*_*Adz 2 prolog

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

issitting(X, Y) :- sitting(X, Y).
Run Code Online (Sandbox Code Playgroud)

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

当我输入编译器时

issitting(rosie, andrew). 
Run Code Online (Sandbox Code Playgroud)

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

issitting(andrew, rosie). 
Run Code Online (Sandbox Code Playgroud)

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

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

我不明白为什么它给我"假".

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

谢谢.

fal*_*lse 6

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

?- issitting(andrew, rosie).
false.
Run Code Online (Sandbox Code Playgroud)

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

andrew至少坐在旁边的人吗?

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

?- issitting(andrew, Anyone).
false.
Run Code Online (Sandbox Code Playgroud)

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

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

?- issitting(Person, Anyone).
Person = mary,
Anyone = james ;
Person = rosie,
Anyone = andrew ;
Person = kiera,
Anyone = tom.
Run Code Online (Sandbox Code Playgroud)

所以周围有一些人.实际上,原因是你有sitting/2另一种关系issitting/2.您需要issitting/2通过添加以下规则进行概括:

issitting(X, Y) :- sitting(Y, X).
Run Code Online (Sandbox Code Playgroud)

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

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