Prolog 序言:存在量化

Prolog 序言:存在量化,prolog,prolog-setof,existential-operator,Prolog,Prolog Setof,Existential Operator,我试图理解存在主义量化的用法。我现在知道的是,这项技术与setof,findall,bagof一起使用。此外,我还发现了一个问题。但是,我不确定何时以及如何在Prolog中实现Vars^Goal(存在量化) 下面是一个例子,我的目标是找到两个相互认识但在不同公司工作的员工,将结果与L绑定,显示Name1-Name2: company('Babbling Books', 500, 10000000). company('Crafty Crafts', 5, 250000). company('Ha

我试图理解存在主义量化的用法。我现在知道的是,这项技术与
setof
findall
bagof
一起使用。此外,我还发现了一个问题。但是,我不确定何时以及如何在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)^(员工(N1,C1),员工(N2,C2),C1\=C2,知道(N1,N2))
?它的概念是什么?谢谢

我不确定何时以及如何在Prolog中实现Vars的目标(存在量化)

最简单的答案是:永远不要这样做。您总是可以引入一个辅助谓词,它准确地捕获您想要的查询,准确地公开您想要的参数,而不公开任何其他内容(这将需要量化),并且具有一个很好的自文档化名称

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

different_company_acquaintances(N1, N2) :-
    employee(N1, C1),
    employee(N2, C2),
    C1 \= C2,
    knows(N1, N2).
然后将您的
查询集表示为:

?- setof(N1-N2, different_company_acquaintances(N1, N2), L).
L = [javier-michelle].
由于谓词名称以及隐藏了不相关的实现细节,因此更易于阅读。注意,在谓词定义中,参数只是调用者关心的数据(员工),而调用者不关心的数据(公司)没有参数

我如何理解
(C1,C2)^(员工(N1,C1),员工(N2,C2),C1\=C2,知道(N1,N2))


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

什么是“正确的格式”?答案是
L=[javier michelle]。
。可以使用对存在限定变量进行分组的任何术语:
(C1,C2)
[C1,C2]
v(C1,C2)
。。。所有的工作都假设符合标准的实现
bagof/3
@GuyCoder我很好奇,你从哪里得到的惯例是使用方括号。我一直看到
Var1^Var2^…^VarN^Goal
,您发布的感兴趣的链接也有SWI创建者声明,约定使用Var^Var2…^Goal这已经在SWI Prolog对话论坛上了。感谢您的解释!清清楚楚。。。。或者,使用!