【问题标题】:Prolog: existentially quantifyingProlog:存在量化
【发布时间】:2021-06-10 18:05:59
【问题描述】:

我试图了解存在量化的用法。我现在知道的是这种技术与setoffindallbagof 一起使用。此外,我找到了tutorial。但是,我不确定何时以及如何在 Prolog 中执行 Vars^Goal(存在量化)。

这里是例子,我的目标是找到两个相互认识但在不同公司工作的员工,将结果与L绑定显示Name1-Name2

company('Babbling Books', 500, 10000000).
company('Crafty Crafts', 5, 250000).
company('Hatties Hats', 25, 10000).

employee(mary, 'Babbling Books').
employee(julie, 'Babbling Books').
employee(michelle, 'Hatties Hats').
employee(mary, 'Hatties Hats').
employee(javier, 'Crafty Crafts').

knows(javier, michelle).

我的第一直觉是使用查询

?-employee(N1,C1),employee(N2,C2),C1\=C2,knows(N1,N2).

查询找到了答案,但未将其呈现为正确的格式。正确的是:

?-setof(N1-N2, (C1,C2)^(employee(N1,C1),employee(N2,C2),C1\=C2,knows(N1,N2)), L).

我怎么能理解 (C1,C2)^(employee(N1,C1),employee(N2,C2),C1\=C2,knows(N1,N2)) ?它的概念是什么?谢谢。

【问题讨论】:

  • 什么是“正确的格式”?
  • 答案是L = [javier-michelle].
  • 可以使用对存在限定变量进行分组的任何术语:(C1,C2)[C1,C2]v(C1,C2)、...所有工作都假设bagof/3 的实现符合标准。跨度>
  • @GuyCoder 我很好奇你从哪里得知约定是使用方括号。我一直看到Var1^Var2^...^VarN^Goal 并且您发布的感兴趣的链接具有 SWI 创建者状态,约定是使用 Var^Var2...^Goal
  • 这是在 SWI-Prolog Discourse 论坛上的 cross posted

标签: prolog prolog-setof existential-operator


【解决方案1】:

我不确定何时以及如何在 Prolog 中执行 Vars^Goal(存在量化)。

最简单的答案是:永远不要这样做。您始终可以引入一个辅助谓词,该谓词准确地捕获您想要的查询,准确地公开您想要的参数而不是其他任何东西(这需要量化),并具有一个很好的自记录名称。

在您的示例中,您可以定义:

different_company_acquaintances(N1, N2) :-
    employee(N1, C1),
    employee(N2, C2),
    C1 \= C2,
    knows(N1, N2).

然后将您的setof 查询表达为:

?- setof(N1-N2, different_company_acquaintances(N1, N2), L).
L = [javier-michelle].

由于谓词名称和隐藏了不相关的实现细节,这更容易阅读。请注意,在谓词定义中,参数只是调用者关心的数据(员工),而调用者不关心的数据(公司)没有参数。

我怎么能理解(C1,C2)^(employee(N1,C1),employee(N2,C2),C1\=C2,knows(N1,N2))

^ 语法,无论确切的正确形式是什么,都是为了表示变量,如果你写出一个单独的谓词定义,它只会出现在谓词的主体中,而不是作为它的参数。这告诉setof 和朋友,每次尝试执行目标(employee(N1,C1),employee(N2,C2),C1\=C2,knows(N1,N2)) 时,都应该使用未绑定的变量C1C2。换句话说,它不应该尝试在一次尝试中保留C1C2 的值。

【讨论】:

  • 感谢您的解释!清晰而健全。
  • ... 或者,使用 library(lambda)!
猜你喜欢
  • 2017-10-04
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多