Grundlagen der Programmierung 2. Operationale Semantik

Ähnliche Dokumente
Semantik von Programmiersprachen

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Programmieren in Haskell

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Grundlagen der Programmierung 2 (1.C)

Funktionale Programmierung

ALP I Einführung in Haskell

Vorsemesterkurs Informatik

Grundlagen der Programmierung 2. Sortierverfahren

Compiler, Übersetzer. Allgemeine Erklärung / Definition

Programmieren in Haskell Programmiermethodik

Funktionen höherer Ordnung

Programmiersprachen: rekursives Programmieren in Haskell

Das erste C++ Programm

Rhetorik und Argumentationstheorie.

Mathematik für Informatiker I

Vorsicht bei redundanten und unvollständigen Matches!

Inferenzmethoden. Einheit 18. Logik höherer Stufe

Sudoku. Warum 6? Warum 6?

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

Semantics of a Call-by-Need Lambda Calculus with McCarthy s amb for Program Equivalence

Vorsemesterkurs Informatik

Kontextuelle Gleichheit, Korrektheit, Programmtransformationen, Auswertungsänderung

Der λ-kalkül. Frank Huch. Sommersemester 2015

Formale Sprachen. Script, Kapitel 4. Grammatiken

WS 2011/2012. Georg Sauthoff 1. October 18, 2011

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Algorithmen & Programmierung. Ausdrücke & Operatoren (1)

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Grundlagen der Programmierung 2. Bäume

Einführung in die Informatik 1

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Einführung Grundbegriffe

Programmierung 1 - Repetitorium

Was ist Logische Programmierung?

Fragen zum Nachdenken: Wie könnte man das Fehlen eines Attribut-Wertes interpretieren?

Tag 7. Pattern Matching und eigene Datentypen

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Zahlen in Haskell Kapitel 3

Informatik I - Programmierung Globalübung Hoare-Kalkül. Thomas Weiler. Fachgruppe Informatik RWTH Aachen. T. Weiler, RWTH Aachen - 1 -

Programmtransformationen und Induktion in funktionalen Programmen

Grundprinzipien der funktionalen Programmierung

Strukturelle Rekursion und Induktion

Formale Sprachen, reguläre und kontextfreie Grammatiken

Funktionale Programmiersprachen

VBA-Programmierung: Zusammenfassung

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben

3 Mengen, Logik. 1 Naive Mengenlehre

4.Grundsätzliche Programmentwicklungsmethoden

Lemma Für jede monotone Grammatik G gibt es eine kontextsensitive

Typ-basiertes Programmieren und Schließen in Funktionalen Sprachen

Einführung in die Informatik Algorithms

Funktionale Programmierung mit Haskell

Theoretische Informatik SS 03 Übung 3

2. Vorlesung. Slide 40

Interpreter - Gliederung

Vorkurs Mathematik und Informatik Mengen, natürliche Zahlen, Induktion

Einführung in die Informatik I (autip)

Binäre Suchbäume (binary search trees, kurz: bst)

Informationsverarbeitung auf Bitebene

Rekursion und Induktion

Aussagenlogik zu wenig ausdrucksstark für die meisten Anwendungen. notwendig: Existenz- und Allaussagen

Kapitel 4. Induktive Definitionen und Beweise

Technische Universität München

Kombinatorik von Zahlenfolgen

Kapitel 1.5. Ein adäquater Kalkül der Aussagenlogik. Teil 1: Kalküle und Beweisbarkeit und die Korrektheit des Shoenfield-Kalküls

3 Vollständige Induktion

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Softwaretechnik. Funktionale Programmierung. Christian Lindig. 23. Januar Lehrstuhl für Softwaretechnik Universität des Saarlandes

Klassische Aussagenlogik

Grundlagen der Programmierung 2. Parallele Verarbeitung

Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin

Funktionale Programmierung mit Haskell. Jan Hermanns

JAVA-Datentypen und deren Wertebereich

Handout zu Beweistechniken

Funktionale Programmierung

Einführung in die Funktionale Programmierung: Einleitung & Motivation

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Entwicklung eines korrekten Übersetzers

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine. Studienleistung

Rekursive Auswertungsprozesse in Haskell

Theoretische Grundlagen des Software Engineering

Informatik II - Tutorium

Haskell zur Constraint-Programmierung HaL8

TU8 Beweismethoden. Daniela Andrade

Kapitel 1.0. Aussagenlogik: Einführung. Mathematische Logik (WS 2011/12) Kapitel 1.0: Aussagenlogik: Einführung 1/ 1

Der Datentyp String. Stringvariable und -vergleiche

WS 2011/2012. Georg Sauthoff 1. November 1, 2011

Kapitel 7: Formaler Datenbankentwurf

1.2 LOOP-, WHILE- und GOTO-Berechenbarkeit

Logic in a Nutshell. Christian Liguda

Probeklausur der Tutoren

Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

Transkript:

Grundlagen der Programmierung 2 Operationale Semantik Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 29. April 2009

Semantik von Programmiersprachen Semantik = Bedeutung eines Programms (Programmtextes) ausgehend vom Syntaxbaum des Programms. Methoden der Semantik-Definition: Operationale Semantik Denotationale Semantik Transformations-Semantik axiomatische Semantik Grundlagen der Programmierung 2-2 -

Operationale Semantik Spezifikation von Wirkung und Ablauf: Zustand: Speicherbelegung als Datenstruktur oder... Pro Programmkonstrukt: Angabe des Zustandsübergangs Haskell: Zustand = Ausdruck Übergänge: = Reduktionen, d.h. Änderungen der Ausdrücke. Python: Zustand = Umgebung Übergänge: = Veränderungen des Speicherinhalts. operationale Semantik = Spezifikation eines Interpreters Vorteil: Prinzipiell immer durchführbar Grundlagen der Programmierung 2-3 -

Denotationale Semantik Zuordnung: Domain D: Programm Funktion Menge der möglichen Funktionen und Objekte Pro Programmkonstrukt: rekursive Angabe der Konstruktion einer Funktion in D. Hürden: Mathematisches Vorwissen notwendig Domainkonstruktion kann schwierig sein Meist nur für kleines Fragment einer Programmiersprache Grundlagen der Programmierung 2-4 -

Transformations-Semantik Vorgehen zur Definition der Semantik eines Programms P, wenn die Semantik für Kernsprachen-Programme bereits definiert ist Transformiere P... P (in Kernsprache) Nehme die Semantik von P. Semantik von Haskell nutzt dieses Prinzip (zb Pattern, List Comprehensions) Vorteile: Vereinfacht Semantik-Definition Analog zur Arbeitsweise von Compilern Grundlagen der Programmierung 2-5 -

Axiomatische Semantik Beschreibung der Programmkonstrukte und Eigenschaften von Programmen mittels logischer Axiome Herleiten von Programmeigenschaften durch logisches Schließen Z.B. in Prädikatenlogik: Für alle Eingaben n von natürlichen Zahlen liefert quadrat n das Ergebnis n 2. Als Formel: n : quadrat(n) = n 2 Grundlagen der Programmierung 2-6 -

Axiomatische Semantik Hoare-Logik: {x > 2} x := x+1 {x > 3} Vorbedingung Nachbedingung Programmbefehl Grundlagen der Programmierung 2-7 -

Auswertung von einfachen Haskell- Programmen: Ziel: operationale Semantik von Haskell formal saubere Definition der Auswertung auch für Funktionen höherer Ordnung Unabhängigkeit von Compilern Unabhängigkeit vom Rechnertyp (Portabilität) Grundlagen der Programmierung 2-8 -

Einfache Haskell-Programme Definition: Basiswert ist entweder eine Zahl, ein Zeichen oder True,False. Einfache Haskell-Programme: dürfen benutzen: Basiswerte und entsprechende vordefinierte Operatoren Funktionsdefinitionen if-then-else Anwendung von Funktionen auf Argumente Grundlagen der Programmierung 2-9 -

Einfache Haskell-Programme (2) Definition: Ein (einfaches) Haskell-Programm besteht aus: Menge von Funktionsdefinitionen; entsprechend obiger Beschränkungen Ausdruck (main) vom Typ eines Basiswertes. Wert des Programms = Wert von main Beispiel quadrat x = x * x kubik x = x * x * x w = 2 main = if w >= 0 then quadrat w else kubik w Grundlagen der Programmierung 2-10 -

Berechnung und Auswertung Prinzip der Berechnung für einfache Haskell-Programme Auswertung = Folge von Transformationen von main bis ein Basiswert erreicht ist main t 1 t 2... t n... Es gibt drei Fälle: 1. Die Folge endet mit einem Basiswert 2. Die Folge endet, aber nicht mit einem Basiswert (kommt nicht vor wegen des Typsystems) 3. Die Folge endet nicht Bei 2. und 3.: Wert undefiniert. Grundlagen der Programmierung 2-11 -

Auswertung Einfache Haskell-Programm haben drei verschiedene Arten von Auswertungsschritten 1. Definitionseinsetzung (δ-reduktion) 2. Arithmetische Auswertung 3. Auswertung von Fallunterscheidungen Grundlagen der Programmierung 2-12 -

Satz von Church und Rosser Satz (Church-Rosser 1) Sei P ein einfaches Haskell-Programm, R 1, R 2 zwei verschiedene Reduktionsfolgen für main mit jeweiligen Resultat-Basiswerten e 1 bzw. e 2 dann sind diese Basiswerte gleich, d.h. e 1 = e 2 Grundlagen der Programmierung 2-13 -

Werte von Programmen Definition: Sei P ein einfaches Haskell-Programm und main von numerischem oder Booleschem Typ. Der Wert des Programms P ist: e ( undefiniert ) wenn es eine terminierende Reduktionsfolge, ausgehend von main gibt, die mit dem Basiswert e endet, wenn es keine mit einem Basiswert terminierende Reduktionsfolge ausgehend von main gibt. Aus dem Satz von Church-Rosser-1 folgt: Ein einfaches Haskell-Programm hat einen eindeutig definierten Wert unabhängig von der Art der Auswertung Grundlagen der Programmierung 2-14 -

Satz 2 von Church und Rosser SATZ (Church-Rosser-2) Sei P ein einfaches Haskell-Programm. Wenn es irgendeine Reduktionsfolge für main gibt, die mit einem Basiswert e terminiert, dann terminiert auch die normale Reihenfolge der Auswertung von main und liefert als Basiswert (Resultat) genau e. Die normale Reihenfolge ist ausreichend zur Auswertung Haskell benutzt normale Reihenfolge der Auswertung Grundlagen der Programmierung 2-15 -

Gegenbeispiel zu C.R. 2 bei applikativ Church-Rosser-2 gilt nicht für die applikative Reihenfolge: nt x = nt x proj x y = x main = proj 0 (nt 1) applikative Reihenfolge für main terminiert nicht: (nt 1) (nt 1) (nt 1)...... Deshalb: proj 0 (nt 1) proj 0 (nt 1)...... Die normale Reihenfolge liefert sofort 0. Grundlagen der Programmierung 2-16 -

Programmtransformationen Optimierung: Programm P wird zur Compilezeit mittels Transformationen in ein anderes Programm P umgewandelt, welches weniger Ressourcen benötigt, aber den gleichen Effekt hat. gleicher Effekt ( ) : ist mithilfe der operationalen Semantik definierbar Äquivalenzrelation auf Programmen und Funktionen vom gleichen Typ Verschiedene Zahlen und Boolesche Werte sind verschieden unter. Grundlagen der Programmierung 2-17 -

Programmtransformationen Aussage: Für einfache Haskellprogramme gilt: Alle bisher betrachteten Reduktionen, auch deren Umkehrung, sind auch als Compilezeit-Transformationen verwendbar. D.h. Wenn P P mit einer Reduktion, dann gilt auch P P. Begründung: 1. Satz von Church-Rosser: Wenn P zu e auswertet und P P ist eine Transformation, dann wertet auch P zu e aus. Grundlagen der Programmierung 2-18 -

Programmtransformationen [] ++ ys = ys (x:xs) ++ ys = x : (xs ++ ys) Beispiel: [a] ++ as a:([] ++ as) Reduktion für append, da [a] = a:[] a:as Transformation mittels append = [x]++xs kann zu x:xs vereinfacht werden Grundlagen der Programmierung 2-19 -

Programmtransformationen Bei Beschränkung auf applikativer Reihenfolge der Auswertung sowie in Programmiersprachen, die die appl. Reihenfolge verwenden, sind diese Transformationen nicht korrekt, Beispiel: Ein terminierendes Programm kann zu einem nichtterminierenden werden: meinif b x y = if b then x else y main = meinf True True bot Nach der Transformation: main = if True then True else bot D.h. auch: ein nichtterminierendes Programm kann zu einem terminierenden werden. Grundlagen der Programmierung 2-20 -

Church-Rosser-Sätze auch für Konstruktoren Verallgemeinerter Wert statt Basiswert; auch Listen sind Werte: Ein (verallgemeinerter) Wert ist entweder 1. ein Basiswert d.h. eine Zahl oder einer der Wahrheitswerte True, False, oder 2. eine Applikation (c t 1... t n ), wobei c ein Konstruktor ist mit der Stelligkeit n Beispiele: [1,2,3,4] 1: (map quadrat [2,3,4]) Beachte: verallgemeinerte Werte können unausgewertete Unterausdrücke haben Grundlagen der Programmierung 2-21 -

Church-Rosser-Sätze für Haskell-Programme mit Listen Satz(Church-Rosser-1) Sei P ein Haskell-Programm, wobei Konstruktoren und case erlaubt sind, und main den Typ eines verallgemeinerten Basiswertes hat. Wenn zwei verschiedene Reduktionsfolgen jeweils verallgemeinerte Werte e 1 bzw. e 2 ergeben, dann gibt es einen weiteren verallgemeinerten Wert e 3, so dass sowohl e 1 als auch e 2 zu e 3 (in keinem, einem oder mehreren Schritten) reduziert werden können: P e 1 e 2 e 3 Grundlagen der Programmierung 2-22 -

Church-Rosser-Sätze; Beispiele Beispiel: Der Ausdruck [3+4,5+6] ist schon ein Wert, auf zwei Arten reduzierbar: [3 + 4, 5 + 6] [7, 5 + 6] [3 + 4, 11] [7, 11] Grundlagen der Programmierung 2-23 -

Church-Rosser-Sätze; Beispiele Beachte: Normalform muss nicht existieren Beispiel (3 + 4) : ((5 + 6) : [1..] 7 : ((5 + 6) : [1..] (3 + 4) : (11 : [1..]) 7 : 11 : [1..] Grundlagen der Programmierung 2-24 -

Church-Rosser-Satz 2 Satz (Church-Rosser-2) Sei P ein let-freies Haskell-Programm. Wenn irgendeine Reduktionsfolge main zu einem verallg. Wert e reduziert, dann terminiert auch die normale Reihenfolge der Auswertung von main mit einem verallg. Wert e 1, und e 1 ist reduzierbar zu e. Ex: normale Ausw. P v. Wert e 1 e Grundlagen der Programmierung 2-25 -

Church-Rosser-Satz 2. Beispiel normale Ausw. [3+4]++[5+6] [3+4,5+6] [3+4,11] Grundlagen der Programmierung 2-26 -

Haskell mit rekursivem let Church-Rosser-Sätze gelten nicht in vollem Haskell Grund: rekursives let. Church-Rosser-Sätze sind zu syntaktisch! Grundlagen der Programmierung 2-27 -

Church-Rosser-Sätze: Verallgemeinerung Notwendig: Konzept der Verhaltensgleichheit von Ausdrücken: verschiedene Basiswerte a, b sind nicht verhaltensgleich: a b a b man kann Gleiches durch Gleiches ersetzen a b P [a] P [b] Nachzuweisen ist dann: Reduktionen (bzw. Optimierungen) erhalten die Verhaltensgleichheit: s t s t Grundlagen der Programmierung 2-28 -

Induktion und Co-Induktion zum Nachweis der Gleichheit von Ausdrücken Induktionsschema für endliche Listen xs: 1. Zeige die Behauptung für xs = []. 2. Zeige, dass die Behauptung für x : xs gilt unter der Annahme, dass sie für xs gilt. Grundlagen der Programmierung 2-29 -

Co-Induktion für Listen Co-Induktionsschema für endliche und unendliche Listen xs: 1. Zeige die Behauptung für xs = []. 2. Zeige die Behauptung für xs =. 3. Zeige, dass die Behauptung für x : xs gilt unter der Annahme, dass sie für xs gilt. Grundlagen der Programmierung 2-30 -

Induktion für endliche Listen. Beispiel Zeige: length(xs ++ ys) = length(xs) + length(ys) für alle endlichen Listen xs,ys Basisfall: length([] ++ ys ) = length(ys), und length([]) + length(ys) = length(ys) Grundlagen der Programmierung 2-31 -

Induktion. Beispiel Zeige: length(xs ++ ys) = length(xs) + length(ys) für alle endlichen Listen xs,ys Induktionsfall: xs ist eine Liste der Länge n + 1. Auswertung beider Seiten, wobei xs = x:xs. length(xs ++ ys) length((x:xs ++ ys) length((x:(xs ++ ys)) 1+ length((xs ++ ys)) = 1+ length(xs )+ length(ys)). length(xs) + length(ys) = length(x:xs ) + length(ys) 1+ length(xs ) + length(ys). Grundlagen der Programmierung 2-32 -