Programmierung und Modellierung Operationelle und Denotationelle Semantik Martin Wirsing in Zusammenarbeit mit Sebastian Bauer und Matthias Hölzl SS 2009 2 Semantik Operationelle und denotationelle Semantik Gegeben sei eine formale Sprache L Die operationelle Semantik beschreibt die Semantik eines Ausdrucks von L durch Rechenregeln, die sukzessive angewandt werden. Wert eines Ausdrucks ist dann das Endergebnis der Rechnung. Beispiel: Auswertungssemantik von SML Vorteile: Konkret, einfach verständlich Die denotationelle Semantik weist jedem Ausdruck von L einen abstrakten mathematischen Wert zu. Beispiel: Fixpunktsemantik für rekursive Funktionen Vorteile: Implementierungsdetails werden versteckt, mathematische Beweismethoden (Gleichungsschließen, Abstiegsfunktion, Induktion) werden verfügbar gemacht). M. Wirsing: Programmierung und Modellierung 3 Semantik Inhalt 12. Operationelle und Denotationelle Semantik 1. Operationelle Semantik von SML-Ausdrücken 2. Fixpunktsätze 3. Denotationelle Semantik rekursiver Funktionen M. Wirsing: Programmierung und Modellierung 4 Semantik 12.1 Operationelle Semantik Die operationelle Semantik legt fest, ob und mit welchem Wert die Auswertung eines Ausdrucks terminiert. Genauer: Die operationelle Semantik einer Sprache L ist eine Funktion, die auf Eingabe eines Ausdrucks von L und zusätzlichen Angaben zur aktuellen Umgebung als Ergebnis den Wert des Ausdrucks liefert. M. Wirsing: Programmierung und Modellierung 5 Semantik Ausdrücke Als Ausdrücke betrachten wir Ganzzahlige Konstanten Bezeichner Arithmetische und Boolesche Ausdrücke gebildet mit • den Operatoren +,*, -, <= und • der Fallunterscheidung if..then ..else Ausdrücke gebildet mit Funktionsanwendung und –abstraktion M. Wirsing: Programmierung und Modellierung 6 Semantik Ausdrücke Abstrakte Syntax (in SML) type id = string; datatype binop = Plus | Minus | Times | Leq; datatype expr = Var of id | Num of int | Op of binop * expr * expr | If of expr * expr * expr | Fun of id * expr | App of expr * expr; Beispiele Konkrete Syntax: Abstrakte Syntax: Konkrete Syntax: Abstrakte Syntax: Konkrete Syntax: Abstrakte Syntax: fn x => x * 2 Fun( "x", Op(Times, Var "x", Num 2)) 12 + y1 Op(Plus, Num 12, Var "y1") (fn x => x * 2)(12 + y1) App( Fun( "x", Op(Times, Var "x", Num 2)), Op(Plus, Num 12, Var "y1") ) M. Wirsing: Programmierung und Modellierung 7 Semantik Umgebung Eine Umgebung (engl. environment) weist endlich vielen Bezeichnern je einen Wert zu. Beispiele (siehe Tafel) In SML: Implementierung als Liste von Paaren: type 'a env = (id * 'a ) list Die Operation lookup liefert den Wert eines Bezeichners x in einer Umgebung env exception undefined_variable; fun lookup (x:id) nil = raise undefined_variable | lookup x ((y,z)::l) = if x=y then z else lookup x l; Die Operation update ändert eine Umgebung env durch Zuordnung eines neuen Wertes z an einen Bezeichner x fun update (x:id) z nil = (x,z)::nil | update x z ((y,z1)::l) = if x = y then ((y,z)::l) else ((y,z1):: (update x z l)); M. Wirsing: Programmierung und Modellierung 8 Semantik Werte Als Werte betrachten wir Konstanten eines Grunddatentyps (z.B. int) • Beispiele: 7, 17, ~3 Funktionsabstraktionen • Beispiele: fn x => 3*x; fn x => x + y; • Bemerkung: Dazu ist es nötig, die aktuellen Werte der im Programm auftretenden freien Bezeichner zu kennen (oben: Wert von y) In SML: datatype value = Intval of int | Funval of id * expr * value env; • Beispiele Intval 7, Intval ~3 Funval(„x“, Op(Times, Num 3, Var „x"), nil) Funval(„x“, Op(Plus, Var „x", Var „y"), [(„y" , Intval 7)]) M. Wirsing: Programmierung und Modellierung 9 Semantik Auswertungsregeln Die Funktion eval zur Auswertung von Ausdrücken - fun eval (Num x) env = Intval x | eval (Var v) env = lookup v env | eval (Op(binop,t1,t2)) env = evalOp binop (eval t1 env) (eval t2 env) | eval (If(t0,t1,t2)) env = (case eval t0 env of Intval 1 => eval t1 env | Intval 0 => eval t2 env | _ => raise Error “Auswertung If”) | eval (Fun(x, t)) env = Funval(x, t, env) | eval (App(t1, t2)) env = (case (eval t1 env, eval t2 env) of (Funval(x, t, env1), v) => eval t (update x v env1) | _ => raise Error “Auswertung App”); val eval = fn : expr -> (id * value) list -> value M. Wirsing: Programmierung und Modellierung 10 Semantik Auswertungsregeln Hilfsfunktion zur Auswertung arithmetischer Ausdrücke - fun | | | evalOp evalOp evalOp evalOp Plus Minus Times Leq | evalOp _ _ _ (Intval x1) (Intval x2) = Intval(x1+x2) (Intval x1) (Intval x2) = Intval(x1-x2) (Intval x1) (Intval x2) = Intval(x1*x2) (Intval x1) (Intval x2) = Intval(if x1<=x2 then 1 else 0) = raise Error “eval Op”; val evalOp = fn : binop -> value -> value -> value M. Wirsing: Programmierung und Modellierung 11 Semantik Auswertungsregeln Beispiele - val e1 = App( Fun( "x", Op(Times, Var "x", Num 2)), Op(Plus, Num 12, Var "y1") ); val e1 = App (Fun ("x",Op #),Op (Plus,Num #,Var #)) : expr - eval e1 [(„y1" , Intval 7)]; val it = Intval 38 : value - eval e1 [(„y" , Intval 7)]; uncaught exception undefined_variable M. Wirsing: Programmierung und Modellierung 12 Semantik 12.2 Fixpunkte Definition Sei M eine Menge mit einer (partiellen) Ordnung ⊆ M x M, f: M → M eine Funktion. Ein Wert x0 ∈ M heißt Fixpunkt von f, wenn gilt x0 = f(x0). Wir bezeichnen mit fix f den kleinsten Fixpunkt von f (sofern dieser existiert), d.h. • • (fix f) y für jeden (anderen) Fixpunkt y von f und (fix f) ist eindeutig bestimmt. M. Wirsing: Programmierung und Modellierung 14 Semantik Fixpunkte: Beispiele Fixpunkt einer stetigen, monoton wachsenden Funktion über dem Intervall [0,1] 1= f(x0) f(x0) 0 x0 1 0 1 = x0 f(x0) 0 = x0 1 Jede stetige, monoton wachsende Funktion f: [0,1] → [0,1] besitzt einen kleinsten Fixpunkt M. Wirsing: Programmierung und Modellierung 15 Semantik Fixpunkte: Beispiele Fixpunkt einer BNF-Grammatik Beispiel sq ::= “0” | “1” sq kann als Gleichung zwischen Mengen aufgefasst werden: X = {0} ∪ {“1x” | x ∈ X} , d.h. wir haben eine Gleichung der Form X = E(X) wobei X eine Variable ist, die eine Menge bezeichnet und E(X) ein Ausdruck, der X enthält. Lösung M0 = { 1…10 | n >= 0} = { 1n0 | n >= 0} M0 ist kleinster Fixpunkt bzgl. der Teilmengenordnung ⊆ zwischen Mengen endlicher Wörter über dem Alphabet {0,1}. M. Wirsing: Programmierung und Modellierung 16 Semantik Fixpunkte: Beispiele Fixpunkte bei rekursiven Funktionen fun fakt = fn x => if x=0 then 1 else x*fakt(x-1) hat die Gestalt (mit f = fakt) f = F(f) wobei F(f) = fn x => if x=0 then 1 else x*f(x-1) bzw.. fun F f = fn x => if x=0 then 1 else x*f(x-1) ist eine Funktion höherer Ordnung des Typs (ein Funktional) (int -> int) -> int -> int Die Fakultätsfunktion x! ist (kleinster) Fixpunkt der Gleichung f = F(f) Allgemein läßt sich die Funktion fix zur Berechnung des kleinsten Fixpunkts eines Funktionals F in SML definieren als: fun fix F x = F (fix F) x vom Typ fix : ((’a -> ’b) -> ’a -> ’b) -> ’a -> ’b M. Wirsing: Programmierung und Modellierung 17 Semantik Fixpunkte in der Informatik Zur genauen Definition von Fixpunkten braucht man folgende grundlegende Begriffe der Mengenlehre, auf die wir hier nicht näher eingehen: Partielle Ordnung, kleinstes Element, kleinste obere Schranke, Kette (unendliche monoton wachsende Folge) Vollständige Kette (kleinste obere Schranke existiert) Monotone und stetige Funktion Einen Menge X mit einer vollständigen partiellen Ordnung bezeichnet man (auf Englisch) als cpo (genauer: ω-complete partial order). Häufig braucht man auch die Existenz eines kleinsten Elements. M. Wirsing: Programmierung und Modellierung 18 Semantik Beispiele Beispiele für cpos mit kleinstem Element sind die flache Ordnung X⊥ , z.B. Z⊥ ... -3 -2 -1 0 1 2 3 … ⊥ die Potenzmenge (℘(X), ⊆ ) mit Teilmengenordnung Seien X ein cpo und Y mit kleinstem Element ⊥ ∈ Y ein cpo. Dann ist [X → Y] ein cpo mit kleinstem Element: [X → Y] = {f : X → Y | f stetig} mit • • f g, wenn f(x) g(x) für alle x ∈ X Kleinstes Element Ω mit Ω(x) = ⊥ für alle x ∈ X M. Wirsing: Programmierung und Modellierung 19 Semantik Fixpunktsätze Fixpunktsatz von Knaster-Tarski* Sei X ein ω-cpo mit kleinstem Element. Dann besitzt jede monotone Funktion f : X → X einen kleinsten Fixpunkt. Bronisław Knaster 1893–1990 Poln. Mathematiker Topologie, Mengenlehre Alfred Tarski 1901–1983 Pole, Prof. Berkeley Bedeutender Logiker *Alfred Tarski: A lattice-theoretical fixpoint theorem and its applications". Pacific J. of Math.5:2: 1955, 285–309. *B. Knaster: Un théorème sur les fonctions d'ensembles. Ann. Soc. Polon. Math. 6, 1928, 133–134 M. Wirsing: Programmierung und Modellierung 20 Semantik Fixpunktsätze Fixpunktsatz von Kleene**: Sei X ein ω-cpo mit kleinstem Element ⊥. Dann besitzt jede stetige Funktion f : X → X einen kleinsten Fixpunkt fix(f), nämlich fix(f) =def sup (fi)i>=0, wobei f0(x) =⊥ für alle x ∈ X fi+1(x) = f(fi(x)) für alle x ∈ X Satz: Die Funktion fix : (X → X) → X ist selbst stetig. **Stephen Kleene: On notation for ordinal numbers, The Journal of Symbolic Logic, 3 (1938), 150-155. M. Wirsing: Programmierung und Modellierung Stephen Kleene 1909–1994 Amerik. Logiker 21 Semantik 12.3 Denotationelle Semantik rekursiver Funktionen Wir geben im Folgenden nur die Konstruktion der Semantik rekursiver Funktionsdeklarationen an. (Fast) allgemeine Konstruktion: • Der CPO für unsere Subsprache von SML wird konstruiert aus den CPOs Z⊥ und [X -> Y⊥] als Interpretationen für int und für Funktionstypen. • Die denotationelle Semantikfunktion für SML [| _ |] : expr -> cpoSML ist definiert für einen Ausdruck E : int ohne freie Variablen als z , falls die Auswertung von eval E nil terminiert und das [| E |] = definierte Ergebnis z liefert ⊥ , sonst Für einen Funktionsausdruck E: typ1 -> typ2 berechnet man die zu eval E nil gehörige stetige Funktion f ∈ [cpotyp1 -> (cpotyp2)⊥] M. Wirsing: Programmierung und Modellierung 22 Semantik Semantik rekursiver Funktionen Zur Definition der Semantik rekursiver Funktionen wenden wir den Satz von Kleene an: Sei E eine rekursive Funktionsdeklaration (ohne freie Variablen) der Gestalt fun f x = E1 Dazu konstruieren wir das (syntaktische) Funktional G mit G = (fn f => fn x => E1) und zugehöriger Semantik [|G|] Und bilden die Funktionalinteration G0 = Ω, (wobei Ω(x) = ⊥ für alle x) Gi+1 = [|G|](Gi). Die Semantik von E ist gegeben als kleinster Fixpunkt gemäß dem Satz von Kleene: fix G = sup (Gi)i ∈ N M. Wirsing: Programmierung und Modellierung 23 Semantik Beispiel: Fakultät Sei E gleich fun fakt = fn x => if x=0 then 1 else x*fakt(x-1) Dann ist das Funktional G gegeben durch fn f => fn x => if x=0 then 1 else x*f(x-1) Für die Semantik [|G|] ∈ [ [Z -> Z⊥] -> [Z -> Z⊥]⊥ ] gilt für alle g ∈ [Z -> Z⊥] und w ∈ Z: [|G|](g)(w) = 1, falls w=0 w*g(w-1), sonst M. Wirsing: Programmierung und Modellierung 24 Semantik Bestimmung des kleinsten Fixpunkts Wir berechnen Gi: Es ergibt sich folgende Wertetabelle: <0 0 1 2 3 4 5 <5 Ω ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ G(Ω) ⊥ 1 ⊥ ⊥ ⊥ ⊥ ⊥ ⊥ G2(Ω) ⊥ 1 1 ⊥ ⊥ ⊥ ⊥ ⊥ G3(Ω) ⊥ 1 1 2 ⊥ ⊥ ⊥ ⊥ G4(Ω) ⊥ 1 1 2 6 ⊥ ⊥ ⊥ G5(Ω) ⊥ 1 1 2 6 24 ⊥ ⊥ Wir sehen, dass fix(G)(w) = sup (Gi) (w) = w! , falls w>=0 ⊥ , sonst M. Wirsing: Programmierung und Modellierung 25 Semantik Zusammenfassung Die operationelle Semantik beschreibt die Semantik eines Ausdrucks durch Rechenregeln, die sukzessive angewandt werden. Wert eines Ausdrucks ist dann das Endergebnis der Rechnung. Die denotationelle Semantik weist jedem Ausdruck von L einen abstrakten mathematischen Wert zu. Die Berechnung von Fixpunkten wird in der Informatik in unterschiedlichen Situationen benötigt, wie etwa zur Beschreibung der Semantik rekursiver Funktionen. Der Satz von Knaster und Tarski besagt, dass jede monotone Funktion f : X → X einen kleinsten Fixpunkt besitz, falls X ein ω-cpo mit kleinstem Element ist. Ist f sogar stetig, so läßt sich der kleinste Fixpunkt nach dem Fixpunktsatz von Kleene als Supremum einer Kette von Approximationen berechnen. Der Satz von Kleene ist auf BNF-Grammatiken anwendbar und liefert für diese eine denotationelle Semantik über dem teilmengengeordneten cpo der Mengen von Wörtern. Ebenso dient der Satz von Kleene als Basis für eine denotationelle Semantik rekursiver Funktionen und damit von SML. M. Wirsing: Programmierung und Modellierung 26 Semantik Appendix: Definitionen Eine binäre Relation auf einer Menge M heißt partielle Ordnung, wenn für alle x, y, z ∈ M Folgendes gilt: x x (Reflexivität) x y, y x => x = y (Antisymmetrie) x y, y z => x z (Transitivität) x ∈ M ist kleinstes Element, wenn x y für alle y ∈ M. Sei U ⊆ M. Ein Element x ∈ M heißt kleinste obere Schranke oder Supremum von U (geschrieben sup U), wenn gilt u x für alle u ∈ U, Falls u y für alle u ∈ U, so gilt x y Eigenschaften Sind x, y beides kleinste Elemente, so folgt x = y. Man bezeichnet das kleinste Element, wenn es existiert, mit dem Symbol ⊥. Sind x, y beides kleinste obere Schranken von U ⊆ M, so folgt x = y. M. Wirsing: Programmierung und Modellierung 27 Semantik Vollständigkeit Sei M eine Menge mit partieller Ordnung (kurz: partielle Ordnung). Eine Folge (xi)i ∈ N von Elementen xi ∈ M heißt ω-Kette, kurz Kette, wenn xi xi+1 für alle i. Eine partielle Ordnung M heißt vollständig (bzgl. ω-Ketten), wenn für jede ω-Kette (xi) das Supremum von {xi | i ∈ N} existiert. Man schreibt sup (xi) für dieses Supremum. Eine vollständige partielle Ordnung bezeichnet man auf Englisch als ω-complete partial order, kurz ω−cpo oder noch kürzer cpo. Bemerkung: Man kann den Begriff der Vollständigkeit auf gerichtete Mengen verallgemeinern. Wir brauchen das hier nicht. M. Wirsing: Programmierung und Modellierung 28 Semantik Stetige Funktionen Seien X, Y partielle Ordnungen. Alle betrachteten Funktionen seien total. f : X → Y heißt monoton, wenn für alle x,y ∈ X gilt: x y impliziert f(x) f(y). Eine monotone Funktion f : X → Y heißt stetig (bzgl. ω-Ketten), wenn für jede Kette (xi)i ∈ N gilt: f( sup (xi)i ∈ N ) = sup (f(xi))i ∈ N ) Man beachte, dass die Folge (f(xi))i ∈ N wegen der Monotonie von f eine Kette bildet. Beispiele Die Projektionen pX : X x Y → X, pY : X x Y → Y sind stetig. Sind f : Z → X und g : Z → Y stetig, so auch h(z) = (f(z), g(z)). Die Applikation . (.) : [X → Y ] * X → Y ist stetig. Ist f : X * Y → Z stetig, so ist die “gecurryte” Funktion h : X → Y → Z definiert durch h(x) = fn y => f(x, y) wohldefiniert (liefert also stetige Funktionen) und außerdem selbst stetig. M. Wirsing: Programmierung und Modellierung