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对话论坛上了。感谢您的解释!清清楚楚。。。。或者,使用!