6

谁能解释 Prolog 中自由变量的概念。它类似于匿名变量吗?或者有什么不同。如果给出一个例子来解释,也可能很棒。

4

3 回答 3

4

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。

于 2021-01-26T16:16:48.563 回答
2

也许这会有所帮助。(如果我已经准备好了,我不妨贴出来!仍然很难阅读,需要简化。)

实际上,你需要区分是谈论程序的语法还是谈论程序的运行时状态

在这两种情况下,“变量”一词的含义略有不同。在常用用法中,不做区分,这种流畅的用法提供的理解就足够了。但是对于初学者来说,这可能是一个障碍。

在逻辑上,“变量”一词的含义是“从一组变量符号中选择的一个符号”,它代表它在满足它所参与的逻辑公式给出的任何约束时可能采用的可能无限的术语集. 这不是用于推理实际程序的“变量”。

Prolog 术语:术语、变量和所有这些

于 2021-01-26T13:25:46.153 回答
0

自由变量:

"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 _ .

更多解释:

https://dobrev.com/help/tut/The_anonymous_variable.html#:~:text=The%20anonymous%20variable%20is%20an,of%20_denotes%20a%20distinct%20variable%20

于 2021-01-26T13:59:35.513 回答