Folien Kapitel 12 (von M Wirsing, S Bauer, M Hölzl)

Werbung
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
Herunterladen