Um quine no cálculo lambda puro


13

Eu gostaria de um exemplo de quine no cálculo lambda puro . Fiquei bastante surpreso por não encontrar um pesquisando no Google. A página quine lista os quines para muitos idiomas "reais", mas não para o cálculo lambda.

Obviamente, isso significa definir o que quero dizer com uma solução no cálculo lambda, o que eu faço abaixo. (Estou pedindo algo bastante específico.)

Em alguns lugares, por exemplo, Larkin e Stocks (2004), vejo o seguinte citado como uma expressão "auto-replicante": (λx.xx)(λx.xx) . Isso se reduz a si próprio após uma única etapa de redução beta, dando a ele uma sensação de quine. No entanto, é incomparável, pois não termina: reduções beta adicionais continuarão produzindo a mesma expressão, portanto nunca se reduzirá à forma normal. Para mim, um quine é um programa que termina e gera saída, e, portanto, eu gostaria de uma expressão lambda com essa propriedade.

Obviamente, qualquer expressão que não contenha redexes já está na forma normal e, portanto, será encerrada e gerada por si mesma. Mas isso é muito trivial. Portanto, proponho a seguinte definição na esperança de que ela admita uma solução não trivial:

definição (provisória): Um quine no cálculo lambda é uma expressão da forma (onde representa alguma expressão específica de cálculo lambda) de forma que torna-se , ou algo equivalente a ele sob alterações de nomes de variáveis, quando reduzidas à forma normal, para qualquer entrada .

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

Dado que o cálculo lambda é tão equivalente a Turing quanto qualquer outro idioma, parece que isso seria possível, mas meu cálculo lambda está enferrujado, então não consigo pensar em um exemplo.

Referência

James Larkin e Phil Stocks. (2004) "Expressões auto-replicantes no Lambda Calculus" Conferences in Research and Practice in Information Technology, 26 (1), 167-173. http://epublications.bond.edu.au/infotech_pubs/158


Não é uma resposta para minha pergunta, mas, para minha própria referência futura (e para futuros visitantes), será útil ter um link para wiki.haskell.org/Combinatory_logic , no qual alguém tenha pensamentos muito mais profundos sobre o quines do que eu.
— Nathaniel #

Observe que um quine precisa produzir seu próprio código-fonte . Produzir a função que representa não é suficiente.
— precisa saber é o seguinte

@PyRulez, qual é o código fonte de uma expressão lambda? Se for uma sequência de caracteres, é impossível que uma expressão lambda a produza e, consequentemente, podemos definir a palavra "quine" para significar algo ligeiramente diferente para expressões lambda sem medo de ambiguidade. Por outro lado, se você pensa no código fonte como sendo a própria expansão lambda, "o código fonte" e "a função que ele representa" são a mesma coisa. Então eu acho que estou bem aqui.
— Nathaniel

há uma igreja que codifica para cordas. Um cálculo lambda quine deve produzir a codificação da igreja da sequência de caracteres que a representa.
— PyRulez

Claro, isso não é difícil de fazer, se você definir dessa maneira. Esta pergunta era sobre uma coisa diferente.
— Nathaniel

Respostas:


8

Você quer um termo tal que ∀ M ∈ Λ :Q∀M∈Λ

QM⊳βQ

Não especificarei mais restrições ao (por exemplo, em relação à sua forma e se está normalizando) e mostrarei que ele definitivamente deve estar não normalizado.Q

  1. Suponha que esteja na forma normal. Escolha M ≡ x (nós podemos fazê-lo porque as necessidades teorema de segurar para todos M ). Depois, há três casos.QM≡xM

    • é algum átomo a . Então Q M ≡ a x . Esta não é redutível a um .QaQM≡axa
    • é alguma aplicação ( R S ) . Em seguida, Q H ≡ ( R S ) x . ( R S ) é uma forma normal por hipótese, então ( R S ) x também está na forma normal e não pode ser reduzida a ( R S ) .Q(RS)QM≡(RS)x(RS)(RS)x(RS)
    • é alguma abstração ( λ x . A ) (se x deve estar livre em A , então, por simplicidade, podemos simplesmente escolher M equivalente a qualquer variável que λ abstraia acima). Em seguida, Q H ≡ ( λ x . A ) x ⊳ p Um [ x / x ] ≡ Uma . Como ( λ x . A ) está na forma normal, o mesmo ocorre com AQ(λx.A)xAMλQM≡(λx.A)x⊳βA[x/x]≡A(λx.A)A. Consequentemente, não podemos reduzir para ( λ x . A ) .A(λx.A)

    Portanto, se esse existe, ele não pode estar na forma normal.Q

  2. Para completar, suponhamos que tem uma forma normal, mas não é em forma normal (talvez seja normalizadora fracamente), ou seja, ∃ N ∈ p -nf com N ≢ Q de tal modo que ∀ M ∈ Ganhe muitos : Q H ⊳ p Q ⊳ p NQ ∃N∈β-nfN≢Q∀M∈Λ

    QM⊳βQ⊳βN

    Em seguida, com deve haver também existir uma sequência de redução Q x ⊳ p N x ⊳ p N , porque:M≡xQx⊳βNx⊳βN

    • é possível pelo facto de Q ⊳ p N .Qx⊳βNxQ⊳βN
    • deve normalizar, pois N é um β- nf e x é apenas um átomo.NxNβx
    • Se foram para normalizar a qualquer coisa que não seja N , então Q x tem dois β -nfs, que não é possível por um corolário do teorema de Church-Rosser. (O teorema de Church-Rosser afirma essencialmente que as reduções são confluentes, como você provavelmente já sabe.)NxNQxβ

    Mas observe que não é possível pelo argumento (1) acima; portanto, nossa suposição de que Q tem uma forma normal não é sustentável.Nx⊳βNQ

  3. Se permitirmos um , então, temos certeza de que ele não deve ser normalizado. Nesse caso, podemos simplesmente usar um combinador que elimina qualquer argumento que recebe. A sugestão de Denis funciona bem: Q ≡ ( λ z . ( Λ x . Λ z . ( X x ) ) ( λ x . Λ z . ( X x ) ) ) Então, em apenas duas reduções β : Q MQ

    Q≡(λz.(λx.λz.(xx))(λx.λz.(xx)))
    β
    QM≡(λz.(λx.λz.(xx))(λx.λz.(xx)))M⊳1β(λx.λz.(xx))(λx.λz.(xx))⊳1β(λz.((λx.λz.(xx))(λx.λz.(xx)))≡Q

Esse resultado não é muito surpreendente, uma vez que você está pedindo um termo que elimine qualquer argumento que receba, e isso é algo que muitas vezes vejo mencionado como uma aplicação direta do teorema do ponto fixo.


Se eu pudesse aceitar a resposta de Denis também, aceitaria, mas (depois que aprendi um pouco mais e fui capaz de entendê-la completamente), foi essa resposta que realmente me convenceu de que esse "combinador quino" não pode ser implementado por um expressão lambda na forma normal.
— Nathaniel

9

Por um lado, isso é impossível, porque um quine deve produzir seu próprio código, e o cálculo lambda puro não tem meios para executar a saída.

Por outro lado, se você assumir que o termo resultante é o resultado, todas as formas normais são válidas.

(λx.x)(λx.x)(λx.x)


2
Esse é um ponto interessante. Na pergunta, tentei definir o que poderia ser considerado um quine não trivial no cálculo lambda: uma função que, quando aplicada a qualquer entrada, reduz beta para si mesma (até substituições de nomes de variáveis). Pode ser que isso seja impossível, mas não é óbvio, pelo menos para mim.
— Nathaniel

8

Aqui está uma proposição:

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)


(λz.A)y(λz.A)A

1
yyyA(λz.A)yAAλz.AA

1
λ−calculus

Ahh, você está certo, é claro. Eu deveria ter visto isso. Não tenho certeza se aceita sua resposta ou edita a pergunta para solicitar uma definição melhor. Vou pensar um pouco. (Ainda me parece que deve ser possível dar uma definição não-trivial onde você está pedindo algo que vai terminar, mas eu não sei como.)
— Nathaniel

zzAAif z==p then return q, otherwise return q
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.