一阶逻辑 Prolog 匿名变量
First order logic Prolog anonymous variables
以下 Prolog 规则:
grandparent(X,Z) :- parent(X,Y) , parent(Y,Z)
一阶逻辑将是:
∀x ∀y ∀z ((P (x, y) ∧ P (y, z)) → G(x, z))
理论上,如果我们的 Prolog 规则中有一个匿名变量,例如:
grandparent(X,Z) :- parent(X,Y, _ ) , parent(Y,Z, _ )
假设它是一个姓氏,我们如何以一阶逻辑呈现它?
只需使用规则:
"Give the child a name"
请注意,下划线不是单个变量。 Prolog中的两个下划线没有任何关系。
我们可以简单地将代码替换为:
grandparent(X,Z) :-
parent(X,Y,<b>A</b>),
parent(Y,Z,<b>B</b>).
现在合乎逻辑的“等效”将是:
∀x∀y∀z∀a∀b:((P(x,y,a)∧P(y,z,b))→G(x,z))
但是请注意,这两者 不等价 :从理论上讲(可能不在这里),第一个 parent/3
调用可能有副作用,基础术语进一步等。只有 Prolog 的一个子集映射到这样的逻辑结构。
以下 Prolog 规则:
grandparent(X,Z) :- parent(X,Y) , parent(Y,Z)
一阶逻辑将是:
∀x ∀y ∀z ((P (x, y) ∧ P (y, z)) → G(x, z))
理论上,如果我们的 Prolog 规则中有一个匿名变量,例如:
grandparent(X,Z) :- parent(X,Y, _ ) , parent(Y,Z, _ )
假设它是一个姓氏,我们如何以一阶逻辑呈现它?
只需使用规则:
"Give the child a name"
请注意,下划线不是单个变量。 Prolog中的两个下划线没有任何关系。
我们可以简单地将代码替换为:
grandparent(X,Z) :-
parent(X,Y,<b>A</b>),
parent(Y,Z,<b>B</b>).
现在合乎逻辑的“等效”将是:
∀x∀y∀z∀a∀b:((P(x,y,a)∧P(y,z,b))→G(x,z))
但是请注意,这两者 不等价 :从理论上讲(可能不在这里),第一个 parent/3
调用可能有副作用,基础术语进一步等。只有 Prolog 的一个子集映射到这样的逻辑结构。