谁能解释 Prolog 中自由变量的概念。它类似于匿名变量吗?或者有什么不同。如果给出一个例子来解释,也可能很棒。
3 回答
tl;dr:free 是一个概念,用于区分普遍绑定(子句中的 free 表示法)与 , 等中的存在绑定变量setof/3
-bagof/3
有些人使用 free 表示“当前未实例化”,有些人使用它来表示输出参数的意思由谓词实例化,但这不是标准使用它的方式。
长版:我将引用 Prolog 标准的定义:
7.1.1.4 项的自由变量集 项 T 相对于项 v 的自由变量集 FVt 是一组变量,定义为 T 和 BV 的变量集 (7.1.1.1) 的集差,其中 BV是一组变量,定义为 v 的变量集和 T 的存在变量集 (7.1.1.3) 的并集。
他们明确指出:
定义 bagof/3 (8.10.2) 和 setof/3 (8.10.3) 时需要自由变量集的概念。
也许作为背景:在逻辑中,自由变量是不受量词约束的变量(例如 x 是绑定的,y 在 中是自由的∀x p(x,y)
)。(纯)序言子句head(X) :- goal1(X), goal2(X).
可以理解为逻辑公式∀X goal1(X) ∧ goal2(X) → head(X)
。在实践中,只要我们在尝试用一个子句统一一个目标时使用新变量,我们就可以忽略全称量词。因此,出于我们的目的,我们可以X
在上面的条款中将其视为免费的。
这一切都很好,直到元谓词出现:假设我们对元组列表中的第一个元素集感兴趣:
?- setof(X, member(X-Y, [1-2, 2-2, 1-3]), Xs).
Y = 2,
Xs = [1, 2] ;
Y = 3,
Xs = [1].
但是我们得到了两个解决方案:那些 whereY=2
和那些 where Y=3
。我实际上想说的是:存在一些Y
这样X-Y
的列表成员。这种模式的 Prolog 符号是这样写的Var^Term
:
?- setof(X, Y^member(X-Y, [1-2, 2-2, 1-3]), Xs).
Xs = [1, 2].
在第一个例子中,两者X
都是Y
自由的,在第二个例子X
中是自由的并且Y
是绑定的。
如果我们把它写成一个公式,我们得到setof(X, ∃Y member(X-Y, [1-2, 2-3, 1-3]), Xs)
的不再是一阶公式(有一个等效的一阶公式,但这就是名称元谓词的来源)。现在的问题是Var^Term
符号是纯粹的语法 - 内部只有一种类型的变量。但是当我们描述 setof 和朋友的行为时,我们需要区分自由变量和存在绑定变量。因此,除非您使用元谓词,否则您的所有变量都可以被视为自由变量 (1)。
@Reema Q Khan 提供的Learning Prolog链接在使用免费时有点模糊。只看语法,X 在X=5, X is 2 + 3
. 但是当我们运行这个查询时,一旦我们到达第二个目标,X 就被实例化为 5,所以我们实际上是在运行查询5 is 2 + 3
(2)。在这种情况下,我们期望is/3
统一它的第一个参数(通常称为“输出”参数)。为了确保这总是成功,我们将在这里传递一个变量(即使不这样做也很好)。文本试图将这种期望描述为“自由变量”(3)。
(1) 好的,正式地,任何看起来都Var^Term
认为Var
存在存在约束但没有元谓词的东西都没关系。(2) 我认为有些文本在这里使用“X is bound to 5”的符号存在冲突,这可能会增加混淆。(3) 应该说的是,他们期望该参数尚未实例化,但即使这样也不能正确捕捉语义 - Paulo Moura 已经给出了初始基础示例 5 是 3 + 2。
自由变量:
"is" 是 Prolog 中的内置算术评估器。"X is E" 要求 X 是free variable
并且 E 是可以计算的算术表达式。E 可以包含变量,但这些变量必须绑定到数字,例如,“X=5,Y 是 2*X”是正确的 Prolog 目标。
更多解释:
http://kti.ms.mff.cuni.cz/~bartak/prolog.old/learning/LearningProlog11.html
匿名变量:
The name of every anonymous variable is _ .
更多解释: