【发布时间】:2021-06-10 18:05:59
【问题描述】:
我试图了解存在量化的用法。我现在知道的是这种技术与setof、findall、bagof 一起使用。此外,我找到了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