我只想知道一些可以通过未类型化lambda演算而不是通过类型化lambda演算来计算的函数的示例。
因为我是初学者,所以对背景信息的一些重复将不胜感激。
谢谢。
编辑:通过键入lambda演算,我打算了解系统F和简单键入的lambda演算。按功能,我指的是任何图灵可计算的功能。
我只想知道一些可以通过未类型化lambda演算而不是通过类型化lambda演算来计算的函数的示例。
因为我是初学者,所以对背景信息的一些重复将不胜感激。
谢谢。
编辑:通过键入lambda演算,我打算了解系统F和简单键入的lambda演算。按功能,我指的是任何图灵可计算的功能。
Answers:
Godelization给出了一个很好的例子:在lambda演算中,对函数唯一可以做的就是应用它。结果,无法编写类型为的封闭函数,该函数需要一个函数参数并为其返回Godel代码。
将其作为Heyting算术的公理通常被称为“建设性的教会论点”,并且是强烈反古典的公理。也就是说,将其添加到HA是一致的,但不能添加到Peano算法中!(基本上,每个图灵机都停止或不停止是一个经典事实,并且没有可计算的功能可以证明这一事实。)
最简单的答案是这样的事实,即类型化的lambda演算对应于逻辑(简单类型的lambda演算->谓词逻辑;系统f->二阶逻辑),而一致的逻辑无法证明其自身的一致性。
假设您在输入的lambda演算中有自然数(或自然数的Church编码)。可以进行Gödel编号,将系统F中的每个术语分配给唯一的自然数。然后,有一个函数,它将任何自然数(对应于System F中一个好的类型的项)带到另一个自然数(对应于该F中类型良好的系统F项的正常形式),并为任何与系统F中类型正确的术语不对应的自然数(例如,它返回零)。函数是可计算,因此它可以由无类型演算来计算,但不是类型lambda演算(因为后者将达到二阶逻辑的一致性的证明在˚F 二阶逻辑,这意味着二阶逻辑不一致。
需要注意1:如果二阶逻辑是不一致的,这也许可以写在系统F ...和/或它可能不可能写在无类型演算-你可以写的东西,但它可能不总是终止,这是“可计算”的标准。˚F
警告2:有时通过“简单类型的lambda演算”,人们的意思是“具有定点运算符或递归函数的简单类型的lambda演算”。就像无类型的lambda演算一样,PCF或多或少都可以计算任何可计算的函数。
未类型化的 -calculus具有组合器形式的一般递归。简单类型的 -calculus不会。因此,任何需要一般递归的函数都是候选函数,例如Ackermann函数。(我省略了一些细节,以至于我们如何精确地表示每个系统中的自然数,但基本上任何合理的方法都可以。)ÿ λ
当然,您总是可以扩展简单类型的 -calculus以匹配的幂,但是随后您正在更改游戏规则。ÿ
简单类型的lambda演算实际上令人惊讶地薄弱。例如,它无法识别常规语言。不过,我从未发现STLC可以识别的语言集的精确特征。
我喜欢的高度标准化结石的局限性的一种观点是可计算性角度。在高度归一化类型的演算中,例如核心简单类型的lambda演算,System F或构造演算,您可以证明所有项最终都会终止。
如果该证明是有建设性的,则您将获得固定的算法,以保证计算时间上限的方式评估所有项。或者,您也可以研究(不一定是建设性的)证明,并从中提取一个上限-可能很大,因为这些结石具有表达力。
此界限为您提供了在固定的lambda演算中无法键入的函数的“自然”示例:所有渐近优于此界限的算术函数。
如果我没记错的话,可以在指数塔中对简单类型的lambda演算中键入的项进行求值:O(2^(2^(...(2^n)..)
; 比这种塔的增长速度快的功能在这种计算中无法表达。系统F对应于直觉二阶逻辑,因此可计算性非常简单。为了抓住甚至更强大的理论的可计算性优势,我们通常以集合论和模型论(例如,可以建立什么序数)为依据,而不是以可计算性理论为依据。
如果我正确理解了您的问题,我认为一个简单的示例就是术语,它接受一个函数并将其应用于自身。您可以在未类型化的lambda演算中定义和简化此函数(特别是,您有,但未进行标准化),但是您无法键入,因为将意味着找到类型,使得。
A
这样A \ident A \rightarrow A
不是很奇怪?对我来说这听起来很荒谬,我在俯视什么?