Lösen von Funktionsgleichungen für unbekannte Funktionen in der Lambda-Rechnung


14

Gibt es Techniken zum Lösen von Funktionsgleichungen für unbekannte Funktionen in der Lambda-Rechnung?

Angenommen, ich habe die Identitätsfunktion ausführlich als solche definiert:

ichx=x

(das heißt, durch das Schreiben eine Gleichung für das erwartete Verhalten dieser Funktion nach unten) , und jetzt will ich es lösen durch eine algebraische Transformation macht die intensionalen Formel für diese Funktion zu erhalten:ich

ich=λx.x

Das zeigt, wie genau die Funktion das tut, was erwartet wurde (dh wie sie in der Lambda-Rechnung implementiert wird).

Natürlich dient die Identitätsfunktion nur als Beispiel. Ich interessiere mich für allgemeinere Methoden zum Lösen solcher Gleichungen. Insbesondere möchte ich eine Funktion , die die folgende Anforderung erfüllt:B

Bf(λx.M)=(λx.fM)

das heißt, "injiziert" die gegebene Funktion in die gegebene Lambda-Funktion vor ihrem "Körper" (was ein beliebiger Lambda-Ausdruck ist), möglicherweise indem sie zerlegt und eine neue konstruiert wird, so dass sie wird Ein Parameter, auf den die Funktion angewendet wird.f(λx.M)Mf

Antworten:


13

Dies ist ein bekanntes Problem, das als Vereinheitlichung höherer Ordnung bezeichnet wird .

Leider ist dieses Problem im Allgemeinen nicht zu entscheiden. Es gibt ein entscheidendes Fragment, das als Millers Pattern Fragment bekannt ist. Es wird unter anderem häufig bei der Typüberprüfung von Programmen verwendet, die mit Metavariablen oder Mustern abgeglichen wurden. In diesem Fragment werden Vereinigungsvariablen nur auf bestimmte gebundene Programmvariablen angewendet.

Dieses Dokument bietet ein großartiges Tutorial, wie die Vereinheitlichung höherer Ordnung funktioniert, und führt durch eine (relativ) einfache Implementierung.

Leider sieht es nicht so aus, als ob Ihre Funktion in dieses Musterfragment fällt. Das heißt, was ich sehe, ist der Funktionskomposition ziemlich ähnlich. Befriedigt die folgende Funktion Ihre Immobilie?

B=λf g x .f (g x)

Wir haben:

  • B f (λx.M)
  • durch α- Äquivalenz=B f (λy.[y/x]M)α
  • =λx.f ((λy.[y/x]M)x)
  • =λx.f ([x/y][y/x]M)
  • =λx.f M

1
Ja, es scheint so :) Das Komische ist, ich habe fast diese Lösung gefunden, aber aus irgendeinem Grund dachte ich, dass das Aufrufen von auf etwas "es ausführen" würde, was den Ausdruck durcheinander bringt: q Was ich vermisst habe, ist dass wir die Variable durch eine andere Variable ersetzen können, die außerhalb gebunden ist. (λx.M)
BarbaraKwarc

1
Danke auch für den Link zum Artikel, ich werde es mir ansehen und in ein paar Tagen deine Antwort annehmen, um auch anderen Leuten eine Chance zu geben.
BarbaraKwarc

3
Ist das eine Vereinigung höherer Ordnung? Die Frage scheint eher nach dem untypisierten Lambda-Kalkül als nach dem einfach typisierten Lambda-Kalkül zu sein.
Peter Taylor

2

Ich glaube, ich habe eine teilweise Antwort bezüglich der Gleichung mit der Identitätsfunktion:

Ix=x

Wir wollen es lösen, indem wir die Formel für , die die Form ( λ p . M ) mit einem noch unbekannten Ausdruck M als Körper hat. Ersetzen wir es in der ursprünglichen Gleichung durch I :I(λp.M)MI

(λp.M)x=x

wende dann die Funktion auf auf der linken Seite an:x

M[p/x]=x

Aber was haben wir hier? :> Diese Gleichung ist die Formel für den Ausdruck , nach dem wir suchen, nachdem wir jedes Vorkommen von p durch x ersetzt haben , und sie besagt, dass es danach wie auf der rechten Seite aussehen soll :) Mit anderen Worten, die Funktion we suchten ist:Mpx

I=(λx.x)

welches ist natürlich die richtige antwort :)


Versuchen wir den gleichen Ansatz, um die Formel für den Kombinator zu finden. Wir möchten, dass es so funktioniert, dass es, wenn es auf sich selbst angewendet wird, sich selbst erzeugt, wenn es auf sich selbst angewendet wird:ω

ωω=ωω

Lassen Sie uns nun die Formel für finden, die für einen noch unbekannten Ausdruck M die Form ( λ x . M ) hat . Wenn wir dies in die Gleichung einsetzen, erhalten wir:ω(λx.M)M

(λx.M)ω=ωω

Wenn Sie es auf den Parameter auf der linken Seite anwenden, erhalten Sie die Formel für :M

M[x/ω]=ωω

Dies besagt , dass nach jedem Auftreten des Ersetzens in M mit ω er hergestellt ωxMω , also können wir schließen, dass der ursprüngliche Ausdruck M vor der Substitution x gewesen sein sollteωωM , also sollte die gesuchte Funktion so aussehen:xx

ω=(λx.xx)

was in der Tat der Fall ist :)


Ich habe jedoch das Gefühl, dass es so einfach werden könnte, nur weil die rechte Seite bereits in der Form war, nach der wir suchen.


M[x/ω]=ωωω=(λx.xx)

In diesen beiden einfachen Fällen - ja, es gibt: einfach die Substitution umkehren. Aber wie gesagt, diese Fälle könnten durch reines "Glück" funktionieren: dass die rechte Seite bereits in der erforderlichen Form vorliegt. Als ich es mit komplexeren Beispielen versuchte, funktionierte es nicht. Das ist es, wonach ich suche: nach einem algorithmischen Weg.
BarbaraKwarc

1
ωω=ωωωω
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.