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理解如果用户切换名称,它们仍然是真的(不是假的).
我不明白为什么它给我"假".
我被卡住了,这是迄今为止我能做到的最好:/
谢谢.
(我可以指出问题,但是你不会学到任何东西.我假设你正在使用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)
但重点是向您展示一个很好的通用调试策略:
如果出现意外故障,请尝试概括您的查询(以及您的程序).