lambda-calculus - 何时重命名 lambda 演算中的变量?
问题描述
我理解为什么重命名变量以避免捕获很重要,但是在下面的示例中,我不明白为什么它不会发生。
(λf.λx.f(fx))(λf.λx.fx)
显然减少到
λx.(λf.λx.fx)((λf.λx.fx)x)
但不应该在其中一个或x
中重命名?他们不是指不同的s吗?(λf.λx.f(fx))
(λf.λx.f(fx))
x
解决方案
捕获避免是为了避免捕获自由变量。“捕获”绑定变量并没有那么大的伤害:在
λx.(λf.λx.fx)((λf.λx.fx)x)
的两种用法x
确实是不同的变量,但这已经在术语中进行了编码:通常,子术语中的新抽象将“覆盖”更远的抽象的绑定。这仅仅是由于 lambda 项的求值方式:如果对同一个变量有一个新的抽象,那么旧的抽象最终将在具有新抽象的子项中失去作用,并且由内部抽象实际上将是与仅受外部抽象约束的变量不同的变量。
你可以试试这个:如果你应用λx.(λf.λx.fx)((λf.λx.fx)x)
到某个term ,那么根据betaN
归约的定义,这个term会(λf.λx.fx)((λf.λx.fx)x)[N/x]
归约为根据定义)。该术语中唯一自由出现的是最后一个;两个子项中的其他两个es 受其各自的约束。因此,唯一将被替换的是最后一个,因此将减少到- 子项中的' 界限保持不变。 x
(λf.λx.fx)((λf.λx.fx)x)
N
x
x
(λf.λx.fx)
λx
x
N
(λx.(λf.λx.fx)((λf.λx.fx)x))N
(λf.λx.fx)((λf.λx.fx)N)
x
(λf.λx.fx)
所以x
被内部抽象约束的 ' 和x
术语末尾的 the 确实是属于不同抽象的不同变量。因此,在应用程序期间不重命名它们是没有问题的。
话虽如此,有时为了更易读而进行此类重命名会很有用。结果项将与通过直接替换而不重命名获得的项是 alpha 一致的。
推荐阅读
- google-bigquery - 为什么 BigQuery 在保存表时会耗尽内存,而不是对于不保存的相同查询?
- keycloak - 尝试在两个 Keycloak 之间联合用户时出现意外错误(来自令牌的错误受众)
- python - 列表中的重复字符串不会被删除,除非最相似的字符串在子列表中
- openssl - 将普通公钥转换为 PEM
- java - 在项目中添加 Java 代码模板 XML 文件
- sql - 如何强制生成新的 sysdatetime()?
- authentication - 如何使用 Postman 创建 oAuth 随机数、时间戳和签名?
- c# - 为什么 jquery datable 显示旧记录而不是新记录?
- powershell - 如何快速更改 shell 文件夹以匹配当前打开的文件
- angular - NumbersOnly 指令 - 检测复制和粘贴键盘组合