谓词打印出“意外”错误

时间:2015-01-28 00:50:18

标签: prolog prolog-toplevel

我正在尝试编写一个谓词likes/2,其运行方式如下:

?- likes(A,alan).
A = lindsay ;
A = chloe ;
A = cheyanne ;
A = britney ;

以下是我解决问题的方法:

% Define your facts:
combo(lindsay,alan).
combo(chloe,alan).
combo(cheyanne,alan).
combo(britney,alan).

% Define your predicate:
likes(A,B) :- combo(A,B); combo(B,A).

现在,我面临的问题是,虽然我的程序按照预期运行,但在大多数情况下,它会在最后打印出错误而我不明白为什么。这是完整的输出:

?- likes(A,alan).
A = lindsay ;
A = chloe ;
A = cheyanne ;
A = britney ;
false.

1 个答案:

答案 0 :(得分:1)

简短回答。 Prolog顶级解释器并不总是能够检测到没有更多的查询证明。因此,在您的情况下,在给出解决方案A = britney后,它会询问您是否还需要其他解决方案。

likes(A,alan)查询的特定情况下,谓词的单个子句意味着推理引擎试图证明combo(A,alan); combo(alan,A)。这个分离中的左侧目标为您提供了四种解决方案。但正确的解决方案也可能提供一个或多个解决方案,但引擎只能通过尝试目标来排序,但由于combo/2的任何子句都没有作为第一个参数的原子alan,因此失败了。未能证明正确的目标可以为您提供false打印。