我已经很多年没有用Prolog编程了,并且正在努力解决一个简单的测试代码块(我正在尝试解决一个逻辑难题以获得乐趣......
aboard(jack, blackbird).
aboard(jim, blackbird).
aboard(donna, blackbird).
aboard(david, north_star).
aboard(sandy, north_star).
shipmates(A, B) :- A = B, aboard(A, X), aboard(B, X).
shipmates1(A, A) :- !, fail.
shipmates1(A, B) :- aboard(A, X), aboard(B, X).
shipmates
规则和shipmates1
规则是实现以下目标的两种不同尝试:我想将所有在同一艘船上但彼此不等效的乘客配对。
例如,我希望shipmates(jack, jack).
false
。
当我使用完全限定的参数查询时,我得到了预期的答案:
3 ?- shipmates(jack, david).
false.
4 ?- shipmates(jack, jack).
false.
5 ?- shipmates(jack, jim).
true.
然而,当我想要唐娜的所有船友时,它似乎不起作用:
6 ?- shipmates(donna, X).
false.
我期待:
X = jack ;
X = jim ;
注意:我得到与shipmates1
相同的错误结果。
所以请怜悯一个非常业余的Prolog程序员(他没有为课堂做作业!我做错了什么非常明显的事情?
版本:SWI-Prolog(线程,64位,版本8.0.2(
尝试:
shipmates(A, B) :-
aboard(A, X),
aboard(B, X),
A = B.
通过在A = B
目标之前调用aboard/2
谓词,可以确保A
和B
都将实例化,从而使比较有意义。