Jede Form der Rekursion oder Iteration in der Programmierung ist tatsächlich ein fester Punkt. Zum Beispiel wird eine while
Schleife durch die Gleichung charakterisiert
while b do c done ≡ if b then (c ; while b do c done)
das heißt, das while b do c done
ist eine Lösung W
der Gleichung
W ≡ Φ(W)
wo Φ(x) ≡ if b then (c ; x)
. Aber was ist, wenn Φ
es viele Fixpunkte gibt? Welches entspricht der while
Schleife? Eine der grundlegenden Erkenntnisse der Programmiersemantik ist, dass dies der am wenigsten festgelegte Punkt ist.
Nehmen wir ein einfaches Beispiel, diesmal Rekursion. Ich werde Haskell benutzen. Die rekursive Funktion f
definiert durch
f :: a -> a
f x = f x
ist die überall undefinierte Funktion, weil sie nur für immer läuft. Wir können diese Definition auf ungewöhnlichere Weise umschreiben (aber es funktioniert immer noch in Haskell) als
f :: a -> a
f = f
So f
ist ein Fixpunkt der Identitätsfunktion:
f ≡ id f
Aber jede Funktion ist ein fester Punkt von id
. Unter der üblichen domänen-theoretischen Reihenfolge ist "undefiniert" das kleinste Element. Und in der Tat ist unsere Funktion f
die überall undefinierte Funktion.
Auf Anfrage hinzugefügt: In den Kommentaren fragte OP nach der Teilreihenfolge für Semantikschleifen while
(Sie haben angenommen, es sei ein Gitter, aber es muss nicht sein). Eine allgemeinere Frage ist die domänen-theoretische Interpretation einer prozeduralen Sprache, die Variablen manipulieren kann und die grundlegenden Kontrollstrukturen (Bedingungen und Schleifen) aufweist. Es gibt verschiedene Möglichkeiten, dies zu tun, je nachdem, was genau Sie erfassen möchten. Um die Dinge einfach zu halten, nehmen wir an, dass wir eine feste Anzahl globaler Variablennx1, … , X.ndass das Programm lesen und aktualisieren kann und sonst nichts (keine E / A oder Ausnahmen oder Zuweisung neuer Variablen). In diesem Fall kann ein Programm als Transformation des Anfangszustands der Variablen in den Endzustand oder als undefinierter Wert angesehen werden, wenn das Programm zyklisch abläuft. Wenn also jede Variable ein Element einer Menge , entspricht ein Programm einer Zuordnung : für jede Anfangskonfiguration der Variablen wird das Programm entweder divergieren und , oder es wird beendet und den Endzustand erzeugt, der ein Element von . Die Menge aller Zuordnungen ist eine Domäne:V.V.n→ V.n∪ { ⊥ }( v1, … , V.n) ∈ V.n⊥V.nV.n→V.n∪ { ⊥ }
- V.n∪ { ⊥ }⊥V.nV.n→ V.n∪ { ⊥ }
- ⊥
while true do skip done
- Jede zunehmende Sequenz hat ein Supremum
Nur um Ihnen eine Vorstellung davon zu geben, wie dies funktioniert, die Semantik des Programms
x_1 := e
( v1, … , V.n) ∈ V.nvee
( v1, … , V.n)( ve, v2, … , V.n)