Prolog 谓词,其中两个项目关联但不等效



我已经很多年没有用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谓词,可以确保AB都将实例化,从而使比较有意义。

最新更新