【问题标题】:yes/no return in PROLOG queryPROLOG 查询中的是/否返回
【发布时间】:2018-04-14 18:07:20
【问题描述】:

我刚刚学习 PROLOG,我很难理解为什么我正在执行的查询会以“是/否”结尾。这是我的知识库:

male(albert).
male(bob).
male(bill).
male(carl).
male(charlie).
male(dan).
male(edward).

female(alice).
female(betsy).
female(diana).

parent(albert, bob).
parent(albert, betsy).
parent(albert, bill).

parent(alice, bob).
parent(alice, betsy).
parent(alice, bill).

parent(bob, carl).
parent(bob, Charlie).

然后我执行以下查询:

 ?-female(X).

返回:

X = alice ? ; 
X = betsy ? ;
X = diana
yes

当我查询时:

 ?-parent(X, bob).

我回来了:

 X = albert ?;
 X = alice ?;
 no

为什么一个结果是“是”,另一个结果是“否”?

【问题讨论】:

  • 在 Prolog 中,您有 谓词,它们不是 函数。这意味着当您调用一个时,它是一个 查询,它将成功(可能多次使用多个解决方案)或失败(没有解决方案)。在这种情况下,“是”表示成功,“否”表示失败。当 Prolog 在解决方案后提示 ? 时,这意味着它有更多的选项可供探索,这可能会成功也可能不会成功。如果您按;,Prolog 会尝试该选项,如果无法找到其他解决方案,则说“不”。如果您没有收到? 提示,则意味着没有选择点,Prolog 只会响应“是”。

标签: prolog prolog-toplevel


【解决方案1】:

顶层如何显示答案替换取决于 Prolog 系统。 特别是顶层是否可以检测确定性查询成功。 后者表示查询成功,没有留下一些选择点。

例如 GNU-Prolog、SWI-Prolog、Jekejeke Prolog 都可以检测确定性查询是否成功,并且不会提示最终用户是否需要进一步的答案替换。既然没有选择点,那么就只有进一步的回答没有了。

使用确定性查询成功检测:

?- female(X).
X = alice ;
X = betsy ;
X = diana.

没有确定性的查询成功检测:

?- female(X).
X = alice ;
X = betsy ;
X = diana ;
no

实际上没有 Prolog 系统会像您在帖子中最后一个分号后显示的那样显示“是”。这是不可能的,我认为 Prolog 系统已损坏。

【讨论】:

  • “实际上没有 Prolog 系统会像您在帖子中最后一个分号后显示的那样显示“是”。这个系统存在并被称为“GNU Prolog”。 | ?- female(X). X = diana (1 ms) yes | ?-
【解决方案2】:

正如 lurker 已经解释的那样,问题是 Prolog 系统是否知道没有进一步的答案,或者它不知道(还)。

  • 如果 Prolog 系统知道没有进一步的答案,并且至少有一个答案,它会在最后一个答案之后打印是,并且不会等待您决定是否需要另一个答案(因为没有答案) .
  • 如果Prolog系统不知道是否还有更多答案,可以按“;”让 Prolog 搜索更多答案。如果没有找到,它将打印“否”,因为它无法满足您修改后的查询(“还有更多答案吗?”)。

在您的查询女性(X)的情况下,程序子句已用尽:没有更多关于女性的子句。因此,很明显没有更多的答案。

在查询 parent(X, bob) 的情况下,当系统找到答案 X=alice 时,有更多关于 parent 的事实。 Prolog 系统此时刚刚停止执行证明。它不会先计算所有答案,然后一一显示。

当你按下“;”时,Prolog 会继续下一个事实 parent(alice, betsy)。但是,谓词的第二个参数不匹配,因此它尝试以下事实,依此类推。最后,关于父母的所有事实都用尽了,没有找到任何其他答案。因此 Prolog 通过打印“no”来报告失败。

大多数 Prolog 系统都有索引结构来加快搜索速度。因此,您可能会注意到并非总是尝试所有规则。例如,您可以检查 parent(alice, X)。根据您的 Prolog 系统,Prolog 可能会在三个答案后立即停止。这将表明它在每个谓词的(最外层的)第一个参数上都有一个索引,这很常见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多