Prolog:正确初始化与运算符连接的谓词变量
Prolog: Initialize predicate variables connected with operators correctly
我创建了一些谓词,类似于我想在下面给你的(希望)最小示例中的谓词。因此,我希望按照以下逻辑方式获得集合 Z
:
给定一些全集 {peter, sandra} 和一些二元运算符 l
和 x
(l
代表爱,x
代表等价物)和一些基本公理(以变量的形式),比如
A l A
(B l A) x (A l B)
我现在想列出所有公理,这些公理可以完全解释我们集合中说明的某个特定公理,并将它们的列表保存在某个变量中。为此,我生成了谓词
find_axioms(Specific, BaseSet, Fullfill)
目标:
BaseSet 是我们可能的公理列表 [A l A, (B l A) x (A l B)]
变量 Fullfill 应该是一些 return 代码,比如 Z
Specific 是一组由公理检查的爱情关系,例如[彼得 l 安娜,彼得 l 彼得]。
现在如果我这三个参数,假设我调用
find_axioms([(peter l anna), (peter l peter)], [(A l A), (B l A) x (A l B)], Z).
我的预期输出应该是:
A = peter
Z = peter l peter
axiom (B l A) x (A l B)
不应该是那个的一部分,因为这个模板不在我们的变量 Specific
中,所以它可以在 Z
.
中忽略
现在我试图用以下逻辑陈述来解释这一点:
∀ x in Specific: x in BaseSet → x in Fullfill
我现在预计,代码应该是这样的:
:-op(900, xfy, l).
:-op(900, xfy, x).
find_axioms(Specific, BaseSet, Fullfill) :-
forall(member(X, Specific),
(member(X, BaseSet) -> member(X, Fullfill))).
但由于某些原因
find_axioms([(peter l anna), (peter l peter)], [(A l A), (B l A) x (A l B)], Z).
只给出错误的输出,并没有按照我期望的方式定义变量。一些语法如
(A l A) = (peter l peter)
反而给了我预期的正确输出:
A = peter
谓词forall/2 is good to prove a relation or to produce some side effects (for example, when used with write/1
or assertz/1
). If you intend to create variable bindings, this predicate is inadequate (since it does not change any variable binding). Instead, you should use the predicate findall/3 (see also bagof/3 and setof/3).
因此,我认为您可以尝试这样的操作:
find_axioms(Specific, BaseSet, Fullfill) :-
findall(X,
( member(X, Specific),
member(X, BaseSet) ),
Fullfill).
我创建了一些谓词,类似于我想在下面给你的(希望)最小示例中的谓词。因此,我希望按照以下逻辑方式获得集合 Z
:
给定一些全集 {peter, sandra} 和一些二元运算符 l
和 x
(l
代表爱,x
代表等价物)和一些基本公理(以变量的形式),比如
A l A
(B l A) x (A l B)
我现在想列出所有公理,这些公理可以完全解释我们集合中说明的某个特定公理,并将它们的列表保存在某个变量中。为此,我生成了谓词
find_axioms(Specific, BaseSet, Fullfill)
目标:
BaseSet 是我们可能的公理列表 [A l A, (B l A) x (A l B)]
变量 Fullfill 应该是一些 return 代码,比如 Z
Specific 是一组由公理检查的爱情关系,例如[彼得 l 安娜,彼得 l 彼得]。
现在如果我这三个参数,假设我调用
find_axioms([(peter l anna), (peter l peter)], [(A l A), (B l A) x (A l B)], Z).
我的预期输出应该是:
A = peter
Z = peter l peter
axiom (B l A) x (A l B)
不应该是那个的一部分,因为这个模板不在我们的变量 Specific
中,所以它可以在 Z
.
现在我试图用以下逻辑陈述来解释这一点:
∀ x in Specific: x in BaseSet → x in Fullfill
我现在预计,代码应该是这样的:
:-op(900, xfy, l).
:-op(900, xfy, x).
find_axioms(Specific, BaseSet, Fullfill) :-
forall(member(X, Specific),
(member(X, BaseSet) -> member(X, Fullfill))).
但由于某些原因
find_axioms([(peter l anna), (peter l peter)], [(A l A), (B l A) x (A l B)], Z).
只给出错误的输出,并没有按照我期望的方式定义变量。一些语法如
(A l A) = (peter l peter)
反而给了我预期的正确输出:
A = peter
谓词forall/2 is good to prove a relation or to produce some side effects (for example, when used with write/1
or assertz/1
). If you intend to create variable bindings, this predicate is inadequate (since it does not change any variable binding). Instead, you should use the predicate findall/3 (see also bagof/3 and setof/3).
因此,我认为您可以尝试这样的操作:
find_axioms(Specific, BaseSet, Fullfill) :-
findall(X,
( member(X, Specific),
member(X, BaseSet) ),
Fullfill).