Prolog 中的自由变量

Free Variable in Prolog

提问人:Devansh Shah 提问时间:1/26/2021 最后编辑:Erik KaplunDevansh Shah 更新时间:3/23/2023 访问量:1443

问:

谁能解释一下 Prolog 中自由变量的概念。它与匿名变量相似吗?还是有区别。如果举个例子来解释,那也可能很棒。

Prolog 自由变量

评论

1赞 David Tonhofer 1/26/2021
“自由变量”如“不受量词约束的(逻辑)变量”(例如,在 bagof/3 参数中未入符号约束的变量),这是一阶逻辑中“自由”的含义,或者“自由变量”作为“未绑定(Prolog)变量”的草率用法,即“变量名称当前指定内存中的空单元格 - 又名。一个空项——而不是目前指定一个实际的非空项”。可悲的是,后一种用法时不时会遇到。😅

答:

2赞 David Tonhofer 1/26/2021 #1

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

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

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

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

Prolog lingo: terms, variables and all that

评论

0赞 Reema Q Khan 1/26/2021
你能举个例子,如果 X 是以这种方式编写的,那么它是一个自由变量,如果 X 是以这种方式编写的,那么它被认为是一个匿名变量?
1赞 David Tonhofer 1/28/2021
@ReemaQKhan 这两个词不是反义词。“自由变量”是不受量词(在逻辑公式中)或 Lambda(在 lambda 表达式中)约束的变量。用它来表示变量当前在运行时未绑定是......“甚至没有错”。“匿名变量”只是Prolog代码的一种符号现象:无论它在代码中出现在哪里,它都应该被认为是一个新变量。这意味着它始终是未绑定的,至少在一开始是这样。它可能会像 in 一样被绑定,但这样你就永远无法阅读它,因为你不能将它命名为 ._ = 2=/2
0赞 David Tonhofer 1/28/2021
我真的需要向这个 Excel 工作表添加更多解释。不开心,
0赞 Reema Q Khan 1/26/2021 #2

自由变量:

“is”是 Prolog 中内置的算术计算器。“X is E”要求 X 是,E 是可以计算的算术表达式。E 可以包含变量,但这些变量必须绑定到数字,例如,“X=5,Y 是 2*X”是正确的 Prolog 目标。free variable

更多解释:

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

评论

3赞 Paulo Moura 1/26/2021
“X is E”要求 X 是自由变量”。不,它没有。例如 是一个完全有效的目标。4 is 4
0赞 Reema Q Khan 1/26/2021
试着把它作为一个整体来阅读。它是在 X 是自由变量的上下文中编写的。
4赞 lambda.xy.x 1/27/2021 #3

TL的;博士: free 是一个概念,用于区分 、 等中的普遍绑定变量(子句表示法中的 free)和存在绑定变量 - 有些人使用 free 来表示“当前未实例化”,有些人用它来表示由谓词实例化的输出参数,但这不是标准使用它的方式。setof/3bagof/3

长版: 我将引用 Prolog 标准的定义:

7.1.1.4 项的自由变量集 自由变量集,项 T 的 FVt 相对于 项 V 是一组定义为集合差的变量 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].

但是我们得到了两个解决方案:一个在哪里和那些在哪里.我真正想说的是:存在一些这样的成员,他们是列表中的成员。此模式的 Prolog 表示法是:Y=2Y=3YX-YVar^Term

?- setof(X, Y^member(X-Y, [1-2, 2-2, 1-3]), Xs).
Xs = [1, 2].

在第一个示例中,两者都是自由的,在第二个示例中是自由的,并且是绑定的。XYXY

如果我们把它写成一个公式,我们得到的不再是一阶公式(有一个等效的一阶公式,但这就是名称元谓词的用武之地)。现在的问题是符号纯粹是语法的 - 内部只有一种类型的变量。但是,当我们描述集合和友的行为时,我们需要区分自由变量和存在约束变量。因此,除非您使用元谓词,否则您的所有变量都可以被视为自由变量 (1)。setof(X, ∃Y member(X-Y, [1-2, 2-3, 1-3]), Xs)Var^Term

@Reema Q Khan提供的Learning Prolog链接在使用free方面有点模糊。仅看语法,X 在 .但是当我们运行这个查询时,一旦我们到达第二个目标,X 就被实例化为 5,所以我们实际上是在运行查询 (2)。在这种情况下,这意味着我们期望统一它的第一个参数(通常称为“输出”参数)。为了确保这总是成功的,我们将在这里传递一个变量(即使不这样做是完全可以的)。文本试图将这种期望描述为“自由变量”(3)。X=5, X is 2 + 35 is 2 + 3is/3

(1)好吧,从形式上讲,任何看起来像的东西都被认为是存在绑定的,但没有元谓词,这并不重要。 (2) 我认为有些文本在这里使用“X 绑定到 5”在符号上存在冲突,这可能会增加混淆。 (3) 应该说的是,他们希望参数尚未实例化,但即使这样也无法正确捕获语义 - Paulo Moura 已经给出了初始基础示例:5 是 3 + 2。Var^TermVar

0赞 JeanHuguesRobert 3/23/2023 #4

如果您了解 C,则可以将 Prolog 变量与包含指针的 C 变量进行比较。只要该指针为 null,变量就是空闲的。一旦设置了指针,变量就不再是空闲的。

当尝试匹配两个带有指针的复杂数据结构时,这变得很有趣。基本上,当并行遍历两个结构时,如果比较两端的指针为 null,那么它就像一个通配符。

Prolog走得更远。当一侧为 null 而另一侧不为 null 时,则 null 侧获取另一侧的值,并且它是匹配项。因此,“free”变量不再是自由的。

当试图将一个模式与多个其他模式相匹配时,这种“统一”过程变得更加有趣,一个接一个

在Prolog中,这涉及到另一个不寻常的概念,称为“回溯”。这就像在迷宫中倒退,遇到死胡同。