纯lambda演算中的奎因


13

我想举一个纯λ演算中的奎因的例子。我无法通过谷歌搜索找到一个,我感到非常惊讶。quine页面列出了许多“真实”语言的quines,但没有列出lambda演算。

当然,这意味着要在lambda演算中定义我的意思,这是我下面要做的。(我要的是非常具体的内容。)

在一些地方,例如Larkin和Stocks(2004),我看到以下内容被引用为“自我复制”表达式:。经过一个单独的beta降低步骤,它本身就减少了,从而给人一种类似于藜的感觉。但是,它像unquine一样,不会终止:进一步的β减少将继续产生相同的表达,因此它永远不会减少为正常形式。对我来说,quine是一个终止并输出自身的程序,所以我想要具有该属性的lambda表达式。(λx.xx)(λx.xx)

当然,任何不包含redexe的表达式都已经是正常形式,因此将终止并输出自身。但这太琐碎了。因此,我提出以下定义,希望它可以接受非平凡的解决方案:

定义(暂定):lambda演算中的喹是形式 x。A)的表达式 (其中表示某些特定的lambda演算表达式),使得变为或对变量更改后的等效值,当对任何输入简化为标准形式时。

(λx.A)
A((λx.A)y)(λx.A)y

鉴于lambda演算与其他任何语言都具有图灵等效性,看来这应该是可行的,但是我的lambda演算是生锈的,因此我想不出一个例子。

参考

詹姆斯·拉金(James Larkin)和菲尔·斯托克斯(Phil Stocks)。(2004)“在Lambda微积分中的自我复制表达式”,信息技术研究与实践会议,26(1),167-173。 http://epublications.bond.edu.au/infotech_pubs/158


并不是我的问题的答案,但是对于我自己(以及以后的访问者)来说,拥有一个链接到wiki.haskell.org/Combinatory_logic很有用,在该链接中,有人对藜的想法比我要深得多。
纳撒尼尔(Nathaniel)

注意,quine需要产生自己的源代码。产生它所代表的功能是不够的。
PyRulez

@PyRulez lambda表达式的源代码是什么?如果是字符序列,则lambda表达式不可能输出它,因此,我们可以定义单词“ quine”来表示lambda表达式略有不同的东西,而不必担心歧义。另一方面,如果您认为源代码本身就是lambda表达式,那么“源代码”和“它表示的功能”是同一回事。所以我觉得我还可以。
纳撒尼尔(Nathaniel)'18

有一个教会编码的字符串。Lambda演算奎纳应该输出代表它的字符串的教堂编码。
PyRulez

当然,如果您这样定义的话,这并不难。这个问题是关于另一回事。
纳撒尼尔(Nathaniel)'18

Answers:


8

您想要一个术语例如:中号∈ ΛQMΛ

QMβQ

我将不再对任何进一步的限制(例如,关于其形式以及是否正则化),并且我将向您展示它肯定必须是非正则化的。Q

  1. 假设是正常的形式。选择(我们可以这样做,因为该定理需要对所有)。然后有三种情况。QMxM

    • Q是原子。然后。这不能归结为。aQMaxa
    • Q是某些应用。然后。是假设的正常形式,因此也是正常形式,并且不能归结为。(RS)QM(RS)x(RS)(RS)x(RS)
    • Q是某种抽象(如果应该在是自由,那么为简单起见,我们可以选择等效于抽象的变量)。然后。由于为标准形式,因此也是如此。因此,我们无法将减少为。(λx.A)xAMλQM(λx.A)xβA[x/x]A(λx.A)AA(λx.A)

    所以,如果这样的存在,它不能正常形式。Q

  2. 为了完整起见,假设具有正常的形态,而不是正常形式(或许是弱正火),即与使得: Q Nβ-nfNQMΛ

    QMβQβN

    然后,对于,还必须存在一个归约序列,因为:MxQxβNxβN

    • QxβNx是可能的事实,。QβN
    • Nx必须归一化,因为是 -nf并且只是一个原子。Nβx
    • 如果要归一化为以外的任何其他值,则具有两个 -nfs,这是Church-Rosser定理的必然结果。(正如您可能已经知道的那样,Church-Rosser定理从本质上说,归约是合计的。NxNQxβ

    但是请注意,不可能通过上面的论点(1)来实现,因此我们假设具有正常形式是不成立的。NxβNQ

  3. 如果我们允许这样的,那么我们可以肯定它必须是非标准化的。在这种情况下,我们可以简单地使用一个组合器来消除它收到的任何参数。Denis的建议效果很好: 然后只有两个归约: Q

    Q(λz.(λx.λz.(xx))(λx.λz.(xx)))
    β
    QM(λz.(λx.λz.(xx))(λx.λz.(xx)))M1β(λx.λz.(xx))(λx.λz.(xx))1β(λz.((λx.λz.(xx))(λx.λz.(xx)))Q

这个结果是不是很奇怪,因为你本质要求,消除了任何参数收到的术语,这是我经常看到提到的不动点定理的直接应用。


如果我也可以接受Denis的答案,那么我会,但是(在我学到了更多东西并能够完全理解它之后),正是这个答案使我确信,这个“ quine组合器”不能由一个实现。正常形式的lambda表达。
纳撒尼尔(Nathaniel)

9

一方面,这是不可能的,因为一个木箱应该输出自己的代码,并且纯lambda演算无法执行输出。

另一方面,如果您假设结果项是输出,那么每个范式都是一个quine。

例如,lambda项已经是正常形式,然后假设其输出是结果正常形式,则输出为。因此 x。x是一个quine。(λx.x)(λx.x)(λx.x)


2
这是一个有趣的观点。在这个问题中,我试图给出一个定义,在lambda演算中什么可以算作非平凡的奎因:一个函数,当将其应用于任何输入时,其自身会减少beta(最多可进行变量名替换)。可能这是不可能的,但至少在我看来并不明显。
纳撒尼尔(Nathaniel)2014年

8

这是一个命题:

我们选择作为函数的固定点。Af=λt.(λz.t)

这可以通过使用定点组合器并设置。Y=λg.((λx.g (x x)) (λx.g (x x)))A=Yf=(λx.λz.(x x)) (λx.λz.(x x))

现在我们证明是一个喹。实际上降低为,因此它意味着对于任何,。AAλz.Ay(λz.A)yβAβ(λz.A)


这很简洁,可以按我的要求回答问题,所以我为不接受而感到难过---但不幸的是,我在指定所需内容时犯了一个小错误。我实际上希望还原为正常形式时,而不是仅在beta还原步骤之后成为 。(有关原因,请参阅更新的问题。)这意味着不能包含任何redex,因为如果包含,则还原将不会终止。(λz.A)y(λz.A)A
纳撒尼尔(Nathaniel)2014年

1
在这种情况下,我非常确定这是不可能的,因为以下直觉(不是证明,而是几乎):您希望不起作用,因为它必须对每个起作用,因此在不应该自由。然后只是减少了。现在,您希望减少为。最后一个表达式不能为正则形式,因为内部的可以再次减小……yyyA(λz.A)yAAλz.AA
Denis 2014年

1
这种行为不是很令人惊讶,因为的“打印” 又是指令,所以打印自己的代码的木马 总是可执行的。您要问的内容类似于要求一个quine,以便执行输出时不输出任何内容(根据定义,这是不可能的)。λcalculus
丹尼斯2014年

啊,你当然是对的。我应该已经看到了。我不确定是否接受您的答案或编辑问题以寻求更好的定义。我会考虑一下。(在我看来,您仍然可以在要求终止的地方给出一个简单的定义,但我不确定如何定义。)
Nathaniel 2014年

尽管已经说过了,但(我假设您是说)必须在不自由是真的吗?例如可能类似于。(伪代码,因为我不确定是否甚至可以为lambda演算中的任意表达式定义相等运算符,但我想您明白我的意思。)zzAAif z==p then return q, otherwise return q
Nathaniel 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.