【问题标题】:Predicate Prints Out "Unexpected" false谓词打印出“意外”错误
【发布时间】:2015-01-28 00:50:18
【问题描述】:

我正在尝试编写谓词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.

【问题讨论】:

标签: prolog prolog-toplevel


【解决方案1】:

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

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

【讨论】:

  • 我很困惑如何阻止虚假信息的出现。我无法摆脱等式的右侧,因为名称可以按任何顺序给出。我该怎么办?或者这是应该发生的事情?
  • @TheHound 你为什么担心false 的回复?这是完全正常的,并且是 Prolog 所期望的。表示在已经显示的解决方案之后找不到更多解决方案。
  • @lurker 啊,我不知道。我是 Prolog 的新手,所以我仍然习惯一切。
  • @TheHound 对于刚开始使用 Prolog 的人来说,这是一个常见的误解。有时 Prolog 知道没有更多的解决方案,所以不会回溯,也不会显示 false。 Paulo 的回答详细说明了您的具体情况,为什么 Prolog 需要返回一个 选择点。并非所有谓词都会留下这样的选择点。但如果他们这样做了,这不一定是个问题。
猜你喜欢
  • 2018-05-14
  • 2016-04-03
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多