Un quine in puro calcolo lambda


13

Vorrei un esempio di quine in puro calcolo lambda . Sono stato piuttosto sorpreso di non poterne trovare uno cercando su Google. La pagina Quine elenca le quines per molte lingue "reali", ma non per il calcolo lambda.

Naturalmente, questo significa definire cosa intendo per un quine nel calcolo lambda, che faccio di seguito. (Sto chiedendo qualcosa di abbastanza specifico.)

In alcuni punti, ad esempio Larkin and Stocks (2004), vedo quanto segue citato come espressione "autoreplicante": . Questo si riduce a se stesso dopo un singolo passaggio di riduzione beta, dandogli una sensazione in qualche modo simile a quella di un chinino. Tuttavia, è un po 'come se non terminasse: ulteriori riduzioni beta continueranno a produrre la stessa espressione, quindi non si ridurranno mai alla forma normale. Per me un quine è un programma che termina e genera se stesso, e quindi vorrei un'espressione lambda con quella proprietà.(λx.xx)(λx.xx)

Naturalmente, qualsiasi espressione che non contiene redexes è già in forma normale e pertanto terminerà e produrrà se stessa. Ma è troppo banale. Quindi propongo la seguente definizione nella speranza che ammetta una soluzione non banale:

definizione (provvisoria): una quina nel calcolo lambda è un'espressione della forma (dove rappresenta un'espressione specifica del calcolo lambda) tale che diventa (\ lambda x. A) , o qualcosa di equivalente ad esso in caso di modifiche ai nomi delle variabili, quando ridotto alla forma normale, per qualsiasi input y .

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

Dato che il calcolo lambda è equivalente di Turing come qualsiasi altra lingua, sembra che ciò dovrebbe essere possibile, ma il mio calcolo lambda è arrugginito, quindi non riesco a pensare a un esempio.

Riferimento

James Larkin e Phil Stocks. (2004) "Espressioni autoreplicanti nel calcolo di Lambda" Conferenze in ricerca e pratica in informatica, 26 (1), 167-173. http://epublications.bond.edu.au/infotech_pubs/158


Non una risposta alla mia domanda, ma per il mio futuro riferimento (e per i futuri visitatori) sarà utile avere un link a wiki.haskell.org/Combinatory_logic , in cui qualcuno ha pensieri molto più profondi sulle quine di me.
Nathaniel,

Si noti che un quine deve produrre il proprio codice sorgente . Produrre la funzione che rappresenta non è sufficiente.
PyRulez,

@PyRulez qual è il codice sorgente per un'espressione lambda? Se si tratta di una sequenza di caratteri, è impossibile che un'espressione lambda la generi, e di conseguenza possiamo definire la parola "quine" per significare qualcosa di leggermente diverso per le espressioni lambda senza paura dell'ambiguità. D'altra parte, se si considera il codice sorgente come la stessa lambda expesssion, allora "il codice sorgente" e "la funzione che rappresenta" sono la stessa cosa. Quindi penso di stare bene qui.
Nathaniel,

c'è una chiesa che codifica per le stringhe. Un calcolo di lambda quine dovrebbe generare la codifica della chiesa della stringa di caratteri che la rappresenta.
PyRulez,

Certo, non è difficile da fare, se lo definisci in quel modo. Questa domanda riguardava una cosa diversa.
Nathaniel,

Risposte:


8

Vuoi un termine tale che M Λ :QMΛ

QMβQ

Non specificherò ulteriori restrizioni su (ad esempio per quanto riguarda la sua forma e se si sta normalizzando) e ti mostrerò che sicuramente deve essere non normalizzante.Q

  1. Supponiamo che sia in forma normale. Scegli M x (possiamo farlo perché il teorema deve valere per tutte le M ). Quindi ci sono tre casi.QMxM

    • è un atomo a . Quindi Q M a x . Questo non è riducibile a una .QaQMaxa
    • è qualche applicazione ( R S ) . Quindi Q M ( R S ) x . ( R S ) è una forma normale per ipotesi, quindi ( R S ) x è anche in forma normale e non riducibile a ( R S ) .Q(RS)QM(RS)x(RS)(RS)x(RS)
    • è un po 'di astrazione ( λ x . A ) (sesi suppone che x sia libero in A , quindi per semplicità possiamo semplicemente scegliere M equivalente a qualunque variabile λ si astragga sopra). Poi Q M ( λ x . A ) x ß A [ x / x ] A . Poiché ( λ x . A ) è in forma normale, lo è anche AQ(λx.A)xAMλQM(λx.A)xβA[x/x]A(λx.A)A. Di conseguenza non possiamo ridurre da a ( λ x . A ) .A(λx.A)

    Quindi, se esiste una tale , non può essere in forma normale.Q

  2. Per completezza, supponiamo che abbia una forma normale, ma non sia in forma normale (forse è debolmente normalizzante), cioè N β -nf con N Q tale che M Λ : Q M β Q β NQ Nβ-nfNQMΛ

    QMβQβN

    Quindi con deve esistere anche una sequenza di riduzione Q x β N x β N , perché:MxQxβNxβN

    • è possibile dal fatto che Q ß N .QxβNxQβN
    • deve normalizzarsi poiché N è un β -nf e x è solo un atomo.NxNβx
    • Se dovesse normalizzarsi con qualcosa di diverso da N , allora Q x ha due β- nfs, che non è possibile da un corollario al teorema di Church-Rosser. (Il teorema di Church-Rosser afferma essenzialmente che le riduzioni sono confluenti, come probabilmente già sapete.)NxNQxβ

    Ma nota che non è possibile con l'argomento (1) sopra, quindi la nostra ipotesi che Q abbia una forma normale non è sostenibile.NxβNQ

  3. Se permettiamo tale , allora, siamo certi che deve essere non normalizzante. In tal caso possiamo semplicemente usare un combinatore che elimina qualsiasi argomento che riceve. Il suggerimento di Denis funziona bene: Q ( λ z . ( Λ x . Λ z . ( X x ) ) ( λ x . Λ z . ( X x ) ) ) Quindi in solo due riduzioni β : 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

Questo risultato non è molto sorprendente, dal momento che stai essenzialmente chiedendo un termine che elimini qualsiasi argomento che riceve, e questo è qualcosa che vedo spesso menzionato come un'applicazione diretta del teorema del punto fisso.


Se potessi accettare anche la risposta di Denis, lo farei, ma (dopo che avevo imparato un po 'di più e sono stato in grado di comprenderlo appieno) è stata questa risposta che mi ha davvero convinto che questo "quine combinatore" non può essere implementato da un espressione lambda in forma normale.
Nathaniel,

9

Da un lato ciò è impossibile, perché si suppone che un quine produca il proprio codice e il calcolo lambda puro non ha mezzi per eseguire l'output.

D'altra parte, se si assume che il termine risultante sia l'output, allora ogni forma normale è un quine.

Ad esempio, il termine lambda è già una forma normale, quindi supponendo che il suo output sia la forma normale risultante, l'output è ( λ x . X ) . Pertanto ( λ x . X ) è un quine.(λx.x)(λx.x)(λx.x)


2
Questo è un punto interessante. Nella domanda ho cercato di dare una definizione di ciò che potrebbe essere considerato un quine non banale nel calcolo lambda: una funzione che, quando applicata a qualsiasi input, si riduce a se stessa (fino a sostituzioni di nomi variabili). Potrebbe essere impossibile, ma non è ovvio, almeno per me.
Nathaniel,

8

Ecco una proposta:

Scegliamo come punto fisso della funzione f = λ t . ( λ z . t ) .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, hai ragione ovviamente. Avrei dovuto vederlo. Non sono sicuro se accettare la tua risposta o modificare la domanda per chiedere una definizione migliore. Ci penserò un po '. (Mi sembra ancora che dovrebbe essere possibile dare una definizione non banale in cui stai chiedendo qualcosa che finirà, ma non sono sicuro di come.)
Nathaniel

zzAAif z==p then return q, otherwise return q
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.