Una quine en cálculo lambda puro

13

Me gustaría un ejemplo de quine en cálculo lambda puro . Me sorprendió bastante no poder encontrar uno buscando en Google. La página quine enumera quines para muchos idiomas "reales", pero no para el cálculo lambda.

Por supuesto, esto significa definir lo que quiero decir con una quine en el cálculo lambda, que hago a continuación. (Estoy pidiendo algo bastante específico).

En algunos lugares, por ejemplo, Larkin y Stocks (2004), veo lo siguiente citado como una expresión "autorreplicante": (λx.xx)(λx.xx) . Esto se reduce a sí mismo después de un solo paso de reducción beta, dándole una sensación de quine de alguna manera. Sin embargo, no se parece a quine porque no termina: las reducciones beta adicionales seguirán produciendo la misma expresión, por lo que nunca se reducirán a la forma normal. Para mí, un quine es un programa que termina y se genera solo, por lo que me gustaría una expresión lambda con esa propiedad.

Por supuesto, cualquier expresión que no contenga redexes ya está en forma normal y, por lo tanto, terminará y se generará. Pero eso es demasiado trivial. Por lo tanto, propongo la siguiente definición con la esperanza de que admitirá una solución no trivial:

definición (provisional): Una quine en cálculo lambda es una expresión de la forma

(λx.A)
(donde A representa alguna expresión específica de cálculo lambda) tal que ((λx.A)y) convierte en(λx.A) , o algo equivalente a él bajo cambios de nombres de variables, cuando se reduce a la forma normal, paracualquierentraday .

Dado que el cálculo lambda es tan equivalente a Turing como cualquier otro idioma, parece que esto debería ser posible, pero mi cálculo lambda está oxidado, así que no puedo pensar en un ejemplo.

Referencia

James Larkin y Phil Stocks. (2004) "Expresiones autorreplicantes en el cálculo de Lambda" Conferencias en Investigación y práctica en tecnología de la información, 26 (1), 167-173. http://epublications.bond.edu.au/infotech_pubs/158

Nathaniel
fuente
No es una respuesta a mi pregunta, pero para mi propia referencia futura (y para futuros visitantes) será útil tener un enlace a wiki.haskell.org/Combinatory_logic , en el que alguien tiene pensamientos mucho más profundos sobre quines que yo.
Nathaniel
Tenga en cuenta que una quine necesita producir su propio código fuente . Producir la función que representa no es suficiente.
PyRulez
@PyRulez, ¿cuál es el código fuente de una expresión lambda? Si se trata de una secuencia de caracteres, es imposible que una expresión lambda la muestre y, en consecuencia, podemos definir que la palabra "quine" signifique algo ligeramente diferente para las expresiones lambda sin temor a la ambigüedad. Por otro lado, si piensa que el código fuente es la expresión lambda misma, entonces "el código fuente" y "la función que representa" son lo mismo. Entonces creo que estoy bien aquí.
Nathaniel
Hay una iglesia que codifica las cuerdas. Un cálculo lambda quine debería generar la codificación de la iglesia de la cadena de caracteres que lo representan.
PyRulez
Claro, eso no es difícil de hacer, si lo define de esa manera. Esta pregunta era sobre algo diferente.
Nathaniel

Respuestas:

8

Desea un término tal que M Λ :QMΛ

QMβQ

No especificaré más restricciones sobre (por ejemplo, con respecto a su forma y si se está normalizando) y le mostraré que definitivamente no debe estar normalizándose.Q

  1. Suponga que está en forma normal. Elija M x (podemos hacerlo porque el teorema debe mantenerse para todas las M ). Luego hay tres casos.QMxM

    • es un átomo a . Entonces Q M a x . Esto no es reducible a a .QaQMaxa
    • es alguna aplicación ( R S ) . Entonces Q M ( R S ) x . ( R S ) es una forma normal por hipótesis, por lo que ( R S ) x también está en forma normal y no es reducible a ( R S ) .Q(RS)QM(RS)x(RS)(RS)x(RS)
    • es alguna abstracción ( λ x . A ) (sise supone que x es libre en A , entonces, por simplicidad, podemos elegir M equivalente a cualquier variable λ abstracta). Entonces Q M ( λ x . A ) x ß A [ x / x ] A . Como ( λ x . A ) está en forma normal, también lo está AQ(λx.A)xAMλQM(λx.A)xβA[x/x]A(λx.A)A. En consecuencia, no podemos reducir a ( λ x . A ) .A(λx.A)

    Entonces, si tal existe, no puede estar en forma normal.Q

  2. Para completar, suponga que tiene una forma normal, pero no está en forma normal (tal vez se está normalizando débilmente), es decir, N β -nf con N Q tal que M Λ : Q M β Q β NQ Nβ-nfNQMΛ

    QMβQβN

    Entonces con también debe existir una secuencia de reducción Q x β N x β N , porque:MxQxβNxβN

    • es posible por el hecho de que Q ß N .QxβNxQβN
    • debe normalizarse ya que N es un β- nf yx es solo un átomo.NxNβx
    • Si se normalizara a otra cosa que no sea N , entonces Q x tiene dos β- nfs, lo cual no es posible por un corolario del teorema de Church-Rosser. (El teorema de Church-Rosser esencialmente establece que las reducciones son confluentes, como probablemente ya sepa).NxNQxβ

    Pero tenga en cuenta que no es posible mediante el argumento (1) anterior, por lo que nuestra suposición de que Q tiene una forma normal no es sostenible.NxβNQ

  3. Si permitimos tal , entonces, estamos seguros de que debe ser no normalizado. En ese caso, simplemente podemos usar un combinador que elimine cualquier argumento que reciba. La sugerencia de Denis funciona bien: Q ( λ z . ( Λ x . Λ z . ( X x ) ) ( λ x . Λ z . ( X x ) ) ) Luego en solo dos reducciones β : 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

Este resultado no es muy sorprendente, ya que esencialmente está pidiendo un término que elimine cualquier argumento que reciba, y esto es algo que a menudo veo mencionado como una aplicación directa del teorema del punto fijo.

Roy O.
fuente
Si pudiera aceptar la respuesta de Denis también, lo haría, pero (después de haber aprendido un poco más y haberlo entendido completamente) fue esta respuesta la que realmente me convenció de que este "combinador de quine" no puede ser implementado por un expresión lambda en forma normal.
Nathaniel
9

Por un lado, esto es imposible, porque se supone que una quine genera su propio código, y el cálculo lambda puro no tiene medios para realizar la salida.

Por otro lado, si supone que el término resultante es la salida, entonces cada forma normal es una quine.

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

Dave Clarke
fuente
2
Ese es un punto interesante. En la pregunta, traté de dar una definición de lo que podría contar como una quina no trivial en el cálculo lambda: una función que, cuando se aplica a cualquier entrada, beta se reduce a sí misma (hasta sustituciones de nombres variables). Puede ser que esto sea imposible, pero no es obvio, al menos para mí.
Nathaniel
8

Aquí hay una propuesta:

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
fuente
Esto es bastante bueno, y responde la pregunta tal como la hice, así que me siento mal por no aceptarlo, pero desafortunadamente cometí un pequeño error al especificar lo que quiero. En realidad quiero(λz.A)y to become (λz.A) when reduced to normal form, not just after a beta reduction step. (See the updated question for why.) This means that A can't contain any redexes, because if it does then the reduction will not terminate.
Nathaniel
1
Ah in this case i'm pretty sure it is impossible, because of the following intuition (not a proof but almost): you want y to play no role since it has to work for every y, so y should not be free in A. Then (λz.A)y just reduces to A. Now you want A to reduce to λz.A. This last expression cannot be a normal form, since the Aadentro se puede reducir nuevamente ...
Denis
1
Este comportamiento no es muy sorprendente, porque diluye la "impresión" de λ-CunlCtultusson nuevamente instrucciones, una quine que imprime su propio código siempre es ejecutable. Lo que está pidiendo es similar a pedir una cantidad tal que si ejecuta la salida, no imprime nada (lo cual es imposible por definición).
Denis
Ahh, you're right of course. I should have seen that. I'm not sure whether to accept your answer or edit the question to ask for a better definition. I'll give it a bit of thought. (It still seems to me that it should be possible to give a non-trivial definition where you're asking for something that will terminate, but I'm not sure how.)
Nathaniel
Though having said that, is it really true that z (I assume you mean z) has to not be free in A? E.g. A could be something along the lines of if z==p then return q, otherwise return q. (Pseudocode because I'm not sure if it's even possible to define the equality operator for arbitrary expressions in lambda calculus, but I think you see what I mean.)
Nathaniel