Ein Quine in reinem Lambda


13

Ich hätte gerne ein Beispiel für ein Quin in reinem Lambda-Kalkül . Ich war ziemlich überrascht, dass ich durch googeln keinen finden konnte. Die Quine-Seite listet Quines für viele "echte" Sprachen auf, jedoch nicht für die Lambda-Rechnung.

Dies bedeutet natürlich, zu definieren, was ich mit einem Quin im Lambda-Kalkül meine, was ich unten tue. (Ich bitte um etwas ganz bestimmtes.)

An einigen Stellen, z. B. bei Larkin und Stocks (2004), sehe ich das Folgende als einen "selbstreplizierenden" Ausdruck zitiert: (λx.xx)(λx.xx) . Dies reduziert sich nach einem einzigen Beta-Reduktionsschritt auf sich selbst und verleiht ihm ein irgendwie quineartiges Gefühl. Es ist jedoch insofern ungewöhnlich, als es nicht beendet wird: Weitere Beta-Reduktionen produzieren weiterhin den gleichen Ausdruck, sodass es niemals auf die normale Form reduziert wird. Für mich ist ein Quine ein Programm, das sich selbst beendet und ausgibt, und daher möchte ich einen Lambda-Ausdruck mit dieser Eigenschaft.

Natürlich ist jeder Ausdruck, der keine Redexes enthält, bereits in normaler Form und wird sich daher selbst beenden und ausgeben. Aber das ist zu trivial. Daher schlage ich die folgende Definition vor, in der Hoffnung, dass eine nicht triviale Lösung zugelassen wird:

Definition (vorläufig): Ein Quine im Lambda-Kalkül ist ein Ausdruck der Form

(λx.EIN)
(wobei EIN für einen bestimmten Lambda-Kalkül-Ausdruck steht), so dass ((λx.EIN)y) wird(λx.EIN) oder etwas Äquivalentes unter Änderungen von Variablennamen, wenn es auf die normale Form reduziert wird, fürjedeEingabey .

Angesichts der Tatsache, dass der Lambda-Kalkül genauso aussieht wie jede andere Sprache, scheint dies möglich zu sein, aber mein Lambda-Kalkül ist rostig, sodass ich mir kein Beispiel vorstellen kann.

Referenz

James Larkin und Phil Stocks. (2004) "Selbstreplizierende Ausdrücke in der Lambda-Rechnung" Konferenzen in Forschung und Praxis in der Informationstechnologie, 26 (1), 167-173. http://epublications.bond.edu.au/infotech_pubs/158


Keine Antwort auf meine Frage, aber für meine eigene zukünftige Referenz (und für zukünftige Besucher) wird es nützlich sein, einen Link zu wiki.haskell.org/Combinatory_logic zu haben , in dem sich jemand viel tiefer mit Quines befasst als ich.
Nathaniel

Beachten Sie, dass ein Quine seinen eigenen Quellcode erzeugen muss . Das Produzieren der Funktion, die es darstellt, ist nicht ausreichend.
PyRulez

@ PyRulez Was ist der Quellcode für einen Lambda-Ausdruck? Wenn es sich um eine Folge von Zeichen handelt, kann ein Lambda-Ausdruck diese nicht ausgeben, und folglich können wir das Wort "quine" so definieren, dass es für Lambda-Ausdrücke etwas anderes bedeutet, ohne dass Mehrdeutigkeiten befürchtet werden. Wenn Sie andererseits den Quellcode als Lambda-Expession selbst betrachten, sind "der Quellcode" und "die Funktion, die er darstellt" dasselbe. Also denke ich, dass es mir hier gut geht.
Nathaniel

Es gibt eine Kirche, die für Streicher kodiert. Ein Lambda Calculus Quine sollte die Kirchencodierung der Zeichenfolge ausgeben, die es darstellt.
PyRulez

Klar, das ist nicht schwer, wenn man es so definiert. Bei dieser Frage ging es um etwas anderes.
Nathaniel

Antworten:


8

Sie möchten einen Begriff , so dass M & egr ; & Lgr; :QMΛ

QMβQ

Ich werde nicht weiter einschränken (z. B. in Bezug auf seine Form und ob es normalisiert) und ich werde Ihnen zeigen, dass es definitiv nicht normalisiert sein muss.Q

  1. Angenommen, ist in normaler Form. Wählen Sie M x (wir können dies tun, weil der Satz für alle M gelten muss ). Dann gibt es drei Fälle.QMxM

    • ist ein Atom a . Dann ist Q M a x . Dies ist nicht reduzierbar ein .QaQMaxa
    • ist irgendeine Anwendung ( R S ) . Dann ist Q M ( R S ) x . ( R S ) ist hypothetisch eine Normalform, daher ist ( R S ) x auch in Normalform und nicht auf ( R S ) reduzierbar.Q(RS)QM(RS)x(RS)(RS)x(RS)
    • ist eine Abstraktion ( λ x . A ) (wenn x in A frei sein soll, könnenwir der Einfachheit halber einfach M wählen, das der Variablen λ entspricht,über die abstrahiert wird). Dann Q M ( λ x . A ) x & bgr; A [ x / x ] A . Da ( λ x . A ) in normaler Form vorliegt, gilt dies auch für AQ(λx.A)xAMλQM(λx.A)xβA[x/x]A(λx.A)A. Folglich können wir auf ( λ x . A ) reduzieren .A(λx.A)

    Wenn also ein solches existiert, kann es nicht in normaler Form vorliegen.Q

  2. Der Vollständigkeit halber suppose hat eine normale Form, ist aber nicht in Normalform (vielleicht ist es schwach Normalisieren ist), dh N & egr ; & bgr; -nf mit N Q , so dass M & egr ; & Lgr; : Q M & bgr; Q & bgr; NQ Nβ-nfNQMΛ

    QMβQβN

    Dann muss mit auch eine Reduktionsfolge Q x β N x β N existieren , weil:MxQxβNxβN

    • ist möglich durch die Tatsachedass Q & bgr; N .QxβNxQβN
    • muss sich normalisieren, da N ein β- nf und x nur ein Atom ist.NxNβx
    • Wenn sich auf etwas anderes als N normalisieren sollte , dann hat Q x zwei β- nfs, was durch eine Folgerung aus dem Church-Rosser-Theorem nicht möglich ist. (Der Church-Rosser-Satz besagt im Wesentlichen, dass Reduktionen konfluent sind, wie Sie wahrscheinlich bereits wissen.)NxNQxβ

    Beachten Sie jedoch, dass durch das obige Argument (1) nicht möglich ist, sodass unsere Annahme, dass Q eine normale Form hat, nicht haltbar ist.NxβNQ

  3. Wenn wir ein solches zulassen , sind wir sicher, dass es nicht normalisierend sein darf. In diesem Fall können wir einfach einen Kombinator verwenden, der alle Argumente eliminiert, die er erhält. Denis Vorschlag funktioniert gut: Q ( λ z . ( Λ x . Λ z . ( X x ) ) ( λ x . Λ z . ( X x ) ) ) Dann in nur zwei β -Reduktionen: 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

Dieses Ergebnis ist nicht sehr überraschend, da Sie im Wesentlichen nach einem Begriff fragen, der alle Argumente beseitigt, und dies ist etwas, das ich oft als direkte Anwendung des Festkomma-Theorems erwähne.


Wenn ich Denis 'Antwort auch akzeptieren könnte, würde ich es tun, aber (nachdem ich ein bisschen mehr gelernt und es vollständig verstanden hatte) war es diese Antwort, die mich wirklich davon überzeugt hat, dass dieser "Quine Combinator" nicht von einem implementiert werden kann Lambda-Ausdruck in normaler Form.
Nathaniel

9

Einerseits ist dies unmöglich, da ein Quine seinen eigenen Code ausgeben soll und der reine Lambda-Kalkül keine Möglichkeit zur Ausgabe hat.

Wenn Sie andererseits annehmen, dass der resultierende Term die Ausgabe ist, ist jede normale Form eine Quine.

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


2
Das ist ein interessanter Punkt. In der Frage habe ich versucht, eine Definition dessen zu geben, was im Lambda-Kalkül als nicht-triviales Quin gelten könnte: eine Funktion, die, wenn sie auf eine Eingabe angewendet wird, das Beta auf sich selbst reduziert (bis zu Variablennamensubstitutionen). Es mag sein, dass dies unmöglich ist, aber es ist zumindest für mich nicht offensichtlich.
Nathaniel

8

Hier ist ein Vorschlag:

EINf=λ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
yyyEIN(λz.EIN)yEINAλz.AA

1
λcalculus

Ahh, du hast natürlich recht. Ich hätte das sehen sollen. Ich bin nicht sicher, ob ich Ihre Antwort akzeptieren oder die Frage bearbeiten soll, um eine bessere Definition zu erhalten. Ich werde es mir etwas überlegen. (Es scheint mir immer noch, dass es möglich sein sollte, eine nicht triviale Definition zu geben, in der Sie nach etwas fragen, das enden wird, aber ich bin nicht sicher, wie.)
Nathaniel

zzAAif z==p then return q, otherwise return q
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.