Prolog 谓词打印“输出”;“意外”;假的

Prolog 谓词打印“输出”;“意外”;假的,prolog,prolog-toplevel,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: lik

我试图编写一个谓词,
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).
现在,我面临的问题是,虽然我的程序按预期运行,但在大多数情况下,它在最后打印出一个false,我不明白为什么。以下是完整的输出:

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

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


likes(A,alan)
查询的特定情况下,谓词的单个子句意味着推理机试图证明
组合(A,alan);组合(艾伦,A)
。这个分离中的左目标给出了四个解决方案。但是正确的解决方案也可能提供一个或多个解决方案,但引擎只能通过尝试目标来解决这个问题,这是失败的,因为
combo/2
的所有子句都没有atom
alan
作为第一个参数。如果无法证明正确的目标,则会导致打印错误。

请看,我不知道如何阻止错误出现。我无法摆脱等式的右边,因为名称可以按任何顺序给出。我该怎么办?或者这是应该发生的事情吗?@猎犬你为什么担心
错误的
响应?这是完全正常的,是Prolog所期望的。它说在已经显示的解决方案之后,它没有找到更多的解决方案。@潜伏者啊,我不知道。我不熟悉Prolog,所以我仍然习惯于一切。@TheHound对于那些刚刚开始学习Prolog的人来说,这是一个常见的误解。有时Prolog知道没有更多的解决方案,因此不会回溯,也不会显示
false
。保罗的回答为你的具体案例提供了细节,为什么Prolog需要回到一个选择点。并非所有谓词都会留下这样的选择点。但如果他们这样做了,这不一定是个问题。