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

Nathaniel
fonte
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 Λ :QMΛ

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.QMxM

    • é algum átomo a . Então Q M a x . Esta não é redutível a um .QaQMaxa
    • é 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β-nfNQMΛ

    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:MxQxβ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)))M1β(λ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.

Roy O.
fonte
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)

Dave Clarke
fonte
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)

Denis
fonte
(λ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