sitting(mary, james).
sitting(rosie, andrew).
sitting(kiera, tom).
issitting(X, Y) :- sitting(X, Y).
嘿伙计们,我基本上想检查一下谁坐在谁旁边的真假价值,
当我输入编译器
时issitting(rosie, andrew).
但是,当我输入
时,会返回一个真值issitting(andrew, rosie).
返回false值(这应该是真的,因为它们彼此相邻)。如果用户检查谁坐在彼此旁边(所有可能的组合),我不想添加三行额外的代码。
你如何改变规则让Prolog明白,如果用户改变名字,他们仍然是真的(不是假的)。
我不明白为什么它给我“假”。
我被困住了,这是迄今为止我能做的最好的事情:/
谢谢。
答案 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).
但重点是向您展示一个良好的通用调试策略:
如果出现意外故障,请尝试概括您的查询(以及您的程序)。