Der untypisierte Lambda-Kalkül

Ähnliche Dokumente
Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

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

Logische Programmierung

Entwicklung eines korrekten Übersetzers

5 Logische Programmierung

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

Prolog basiert auf Prädikatenlogik

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Einführung in PROLOG. Christian Stocker

Zusammenfassung. 1 Wir betrachten die folgende Signatur F = {+,,, 0, 1} sodass. 3 Wir betrachten die Gleichungen E. 4 Dann gilt E 1 + x 1

Semantik von Formeln und Sequenzen

Wissensbasierte Systeme

Auswahl von Klauseln und Atomen in Prolog

Zusammenfassung. Satz. 1 Seien F, G Boolesche Ausdrücke (in den Variablen x 1,..., x n ) 2 Seien f : B n B, g : B n B ihre Booleschen Funktionen

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

Datenstruktur zum Speichern einer endlichen Menge M von Zahlen. Genauer:

Kapitel 5: Applikative Programmierung

Wissensrepräsentation und -verarbeitung in Logiken. bereinigt Pränex Skolem ( -Eliminierung) Klausel (Menge von Klauseln, Notation ohne Quantoren)

2. Universelle Algebra

2. Vorlesung. Slide 40

Grundprinzipien der funktionalen Programmierung

Verträge für die funktionale Programmierung Design und Implementierung

Grundbegriffe der Informatik

Klausur Formale Systeme Fakultät für Informatik WS 2009/2010

6.1 Syntax und Semantik von Constraint-Logikprogrammen

Prädikate zum Testen und Manipulieren der Struktur der Terme; Mehr meta-logische Prädikate z.b. zum Testen des Zustands der Ableitung;

Übungsaufgaben zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 8

8. Logische Programmierung. Prolog Sprachkonstrukte: Fakten. Prolog Übersicht

Einführung in das Programmieren Prolog Sommersemester Teil 2: Arithmetik. Version 1.0

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

Foundations of Systems Development

Theoretische Grundlagen des Software Engineering

A.1 Schaltfunktionen und Schaltnetze

Erfüllbarkeit und Allgemeingültigkeit

x 2 2x + = 3 + Es gibt genau ein x R mit ax + b = 0, denn es gilt

Vererbung & Schnittstellen in C#

Theoretische Grundlagen des Software Engineering

Diskrete Strukturen und Logik WiSe 2007/08 in Trier. Henning Fernau Universität Trier

Prädikatenlogik - Micromodels of Software

2.4.3 Polymorphie (Wiederholung von Alp2)

Generische Record-Kombinatoren mit statischer Typprüfung

SWP Logische Programme

Wortproblem für kontextfreie Grammatiken

Funktionale Programmierung. der direkte Weg vom Modell zum Programm

Kapitel 11: Wiederholung und Zusammenfassung

Funktionale Programmierung mit Haskell. Jan Hermanns

Grundlagen der Informationverarbeitung

Bitte schreiben Sie sich in die Mailingliste der Vorlesung ein! Den Link finden Sie auf der Vorlesungshomepage.

Haskell zur Constraint-Programmierung HaL8

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

5. Aussagenlogik und Schaltalgebra

Hansa-Gymnasium Scheme-Einführung Uwe Debacher

Was machen wir heute? Methodische- und Praktische Grundlagen der Informatik 3 Softwaretechnik WS Formale Spezifikation(ssprachen)

Extremwertverteilungen

SWP Prüfungsvorbereitung

Mai Hauptseminar: Nichtrelationale Datenbanken Historisch-Kulturwissenschaftliche Informationsverarbeitung Universität zu Köln

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Programmieren ++ Begleitende Übungen zu Veranstaltungen + Umsetzen des Algorithmus in ein lauffähiges Programm

Constraint Logical Programming

Theorie der Informatik

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Funktionale Programmierung

Beschreibungslogiken. Daniel Schradick

Projektseminar "Texttechnologische Informationsmodellierung"

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik

3. LINEARE GLEICHUNGSSYSTEME

3. Grundlagen der Linearen Programmierung

Überblick über dieses Kapitel Grundlagen der Programmierung Kapitel 12: Information und Repräsentation

1. Teilklausur. Modul "OOPM Vorlesung/Übung" Gruppe A

I. Aussagenlogik. Aussagenlogik untersucht Verknüpfungen wie "und", "oder", "nicht", "wenn... dann" zwischen atomaren und komplexen Sätzen.

Binäre Bäume Darstellung und Traversierung

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

Binärbäume als weiteres Beispiel für abstrakte Datentypen in PVS mit in Knoten gespeicherten Werten vom Typ T:

Tutoraufgabe 1 (Datenstrukturen in Haskell):


XML-QL. Querysprachen für XML. Semistrukturierte Datenmodell und XML Datenmodell. Beispiel

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

3. Logik-Programmierung

Programmierkurs Java

Satz. Für jede Herbrand-Struktur A für F und alle t D(F ) gilt offensichtlich

Wissensbasierte Systeme/ Expertensysteme. Teil 2

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Einführung in die Programmiersprache C

Erwin Grüner

Eine Einführung in C-Funktionen

Theoretische Informatik I

Prof. Dr. sc. Hans-Dieter Burkhard Vorlesung Winter-Semester 2003/04. Wissensrepräsentation: Resolution (im PK1)

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Rekursionen. Georg Anegg 25. November Methoden und Techniken an Beispielen erklärt

Lineare Gleichungssysteme

Elemente der Analysis II

Einführung in die Theoretische Informatik

6. Datenintegrität. Integritätsbedingungen

Unterprogramme, Pointer und die Übergabe von Arrays

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Einführung in Prolog. Literatur

Spezifikation der zulässigen Parameter. Bemerkungen: Bemerkungen: (2) Design by Contract:

Transkript:

Der untypisierte Lambda-Kalkül Der Lambda-Kalkül wurde zur Beschreibung des mathematischen Begriffs Funktion entwickelt. Die Menge aller Lambda-Ausdrücke Exp ist folgendermaßen definiert: x Exp wenn x Id; Id ist eine Bezeichner-Menge; (e 1 e 2 ) Exp wenn e 1, e 2 Exp ( Funktionsaufruf ); (λx.e) Exp wenn x Id und e Exp ( Funktionsabstraktion, x ist in e gebunden). Jeder Ausdruck in Exp ist ein Programm mit wohldefinierter Semantik. Typsysteme, Grundlagen 1

Die Regeln des Lambda-Kalküls Zusatzdefinitionen (informal): free(e) bezeichnet die Menge aller freien Variablen in e. [e 1 /x]e 2 bezeichnet eine Ersetzung aller freien Vorkommen von x Id in e 2 durch e 1. Regeln legen die Semantik von Lambda-Ausdrücken fest: α-konversion (Umbenennung): λx 1.e λx 2.[x 2 /x 1 ]e, wobei x 2 Id und x 2 / free(e). β-konversion (Anwendung): (λx.e 1 ) e 2 [e 2 /x]e 1. η-konversion: λx.(e x) e wenn x Id und x / free(e). Die gerichtete Variante der β- bzw. η-konversion heisst β- bzw. η-reduktion. Typsysteme, Grundlagen 2

Normalform im Lambda-Kalkül Ein Lambda-Ausdruck ist in Normalform wenn er mittels β- und η-reduktionen nicht weiter reduziert werden kann. Für einige Lambda-Ausdrücke, z.b. (λx.(x x))(λx.(x x)), gibt es keine Normalform. Kein Lambda-Ausdruck kann in zwei verschiedene Normalformen konvertiert werden, wenn man Namensunterschiede aufgrund von α-konversionen unberücksichtigt lässt. Typsysteme, Grundlagen 3

Rekursion im Lambda-Kalkül Jeder Lambda-Ausdruck e hat einen Fixpunkt e, so dass (e e ) zu e konvertiert werden kann. Beweis: Für e nehmen wir (Y e), wobei Y λf.((λx.(f (x x)))(λx.(f (x x)))). Dann gilt: (Y e) = (λx.(e(x x)))(λx.(e(x x))) = e((λx.(e(x x)))(λx.(e(x x)))) = e(y e) Jede rekursive Funktion kann leicht durch eine rekursionsfreie (und nicht-iterative) Funktion ersetzt werden: Ursprüngliche rekursive Funktion: f f Umgeschriebene rekursive Funktion: f (λf. f ) f Rekursionsfreie Definition: f Y (λf. f ) Typsysteme, Grundlagen 4

Mächtigkeit des Lambda-Kalküls Churchs These: Genau jene Funktionen von den natürlichen Zahlen in die natürlichen Zahlen sind effektiv berechenbar, die im Lambda-Kalkül ausgedrückt werden können. effektiven berechenbar = Turing-vollständig Alles Berechenbare ist auch im Lambda-Kalkül berechenbar Typsysteme, Grundlagen 5

Typisierte Lambda-Ausdrücke Eine Menge von Basistypen BasTyp ist als gegeben angenommen. Die Menge aller Typen Typ ist induktiv definiert: b Typ wenn b BasTyp; t 1 t 2 Typ wenn t 1, t 2 Typ. Im typisierten Lambda-Kalkül ist Id eine Menge typisierter Bezeichner der Form x:t mit t Typ. Die Menge der typisierten Lambda-Ausdrücke Exp ist induktiv definiert: x:t Exp wenn x:t Id; (e 1 :t 2 t 1 e 2 :t 2 ):t 1 Exp wenn e 1 :t 2 t 1, e 2 :t 2 Exp; (λx:t 2.e:t 1 ):t 2 t 1 Exp wenn x:t 2 Id und e:t 1 Exp. Typsysteme, Grundlagen 6

Regeln des typisierten Lambda-Kalküls α-konversion: (λx 1 :t 2.e:t 1 ):t 2 t 1 (λx 2 :t 2.[x 2 /x 1 ]e:t 1 ):t 2 t 1, wobei x 2 :t 2 Id und x 2 / free(e). β-konversion: ((λx:t 2.e 1 :t 1 ):t 2 t 1 e 2 :t 2 ):t 1 [e 2 /x]e 1 :t 1. η-konversion: (λx:t 2.(e:t 2 t 1 x:t 2 ):t 1 ):t 2 t 1 e:t 2 t 1 wenn x:t 2 Id und x / free(e). Typsysteme, Grundlagen 7

Mächtigkeit des typisierten Kalküls Für jeden Ausdruck im typisierten Lambda-Kalkül gibt es genau eine effektiv berechenbare Normalform. Folglich können (aufgrund der Unentscheidbarkeit des Halteproblems) nicht alle effektiv berechenbaren Funktionen dargestellt werden. Im typisierten Lambda-Kalkül kann kein Fixpunkt-Operator definiert werden: In (e e) müsste e sowohl einen Typ t 2 t 1 als auch t 2 haben. Der Kalkül kann um δ-regeln erweitert werden, die typisierte Versionen des Y -Kombinators implementieren: (Y t :(t t) t e:t t):t (e:t t (Y t :(t t) t e:t t):t):t Typsysteme, Grundlagen 8

Strukturierte Typen (1) Im Prinzip können δ-regeln die Eigenschaften des Lambda- Kalküls beliebig verändern. δ-regeln können auch verwendet werden, um weitere strukturierte Typen zum typisierten Lambda-Kalkül dazuzufügen. Der Typ eines Cartesischen Produkts (e 1 :t 1, e 2 :t 2 ) ist t 1 t 2. Folgende δ-regeln definieren Cartesische Produkte: (car:(t 1 t 2 ) t 1 (e 1, e 2 ):t 1 t 2 ):t 1 e 1 :t 1 (cdr:(t 1 t 2 ) t 2 (e 1, e 2 ):t 1 t 2 ):t 2 e 2 :t 2 ((cons:t 1 (t 2 (t 1 t 2 )) e 1 :t 1 ):t 2 (t 1 t 2 ) e 2 :t 2 ):t 1 t 2 (e 1, e 2 ):t 1 t 2 Typsysteme, Grundlagen 9

Strukturierte Typen (2) Ein Verbund ( record ) ist eine Menge indizierter Werte: {a=3, b=true, c="s"} : {a:integer, b:boolean, c:string} Für die Auswahl eines Feldes gibt es eine δ-regel: {l 1 =e 1,..., l n =e n }:{l 1 :t 1,..., l n :t n }.l i e i :t i Eine Variante ordnet genau einem Index einen Wert zu: [a=3] : [a:integer, b:boolean, c:string] Die einzige Operation ist die Mehrfachverzweigung: (case [l i =e i ]:[l 1 :t 1,..., l n :t n ] of l 1 f 1 :t 1 t,..., l n f n :t n t):t (f i :t i t e i :t i ):t Typsysteme, Grundlagen 10

Logikprogrammierung Definite Horn-Klauseln der Form x 1. x m.(a B 1 B n ) sind eine (mächtige) Untermenge der Prädikatenlogik erster Stufe. Die übliche Schreibweise ist A B 1,..., B n. Bedeutung: Wenn es Belegungen für alle Variablen in den Atomformeln A, B 1,..., B n gibt, so dass B 1 bis B n alle zugleich wahr sind, dann ist auch A mit diesen Variablenbelegungen wahr. Typsysteme, Grundlagen 11

Prolog Ein definites Programm besteht aus einer Konjunktion von definiten Klauseln. Beispiel in Prolog: append([], Ys, Ys). append([x Xs], Ys, [X Zs]) :- append(xs, Ys, Zs). Ein Prologinterpreter versucht, ein Ziel (eine Anfrage) zu beweisen. Zum Beispiel liefert?- append([1,2,3], [4,5], Zs). die Antwort Zs=[1,2,3,4,5]. Mittels Backtracking können etwaige alternative Lösungen gefunden werden. Typsysteme, Grundlagen 12

Typen und Logikprogramme Typen in Prolog können auf dieselbe Weise wie im Lambda- Kalkül eingeführt werden: jeder Term bekommt einen Typ. Wenn T i die Menge der durch einen Typ t i beschriebenen Terme bezeichnet, dann haben typisierte definite Hornklauseln die Form x 1 T 1. x m T m.(a B 1 B n ). Jeden Typ t i kann man auch als einstelliges Prädikat auffassen, das genau dann wahr ist, wenn sein Argument in T i liegt. Damit kann man obige Klausel äquivalent auch in dieser Form schreiben: A t 1 (x 1 ),..., t m (x m ), B 1,..., B n. Ein Logikprogramm definiert ein Typsystem. Die Ausführung eines Programms entspricht einer Typüberprüfung. Typsysteme, Grundlagen 13

Typisierte Logikprogramme Die Sichtweise Logikprogramm = Typsystem ist problematisch, da nicht zwischen Typfehlern und Einschränkungen der Lösungsmenge unterschieden wird. Mögliche Lösung: Es wird zwischen Typprädikaten und sonstigen Prädikaten unterschieden. Wenn ein sonstiges Prädikat nicht erfüllt ist, erfolgt Backtracking; wenn ein Typprädikat nicht erfüllt ist, wird eine Ausnahmebehandlung eingeleitet. Durch syntaktische Einschränkungen sind auch stark typisierte Logikprogrammiersprachen möglich. Diese Typsysteme sind in der Regel polymorph. Typsysteme, Grundlagen 14

Algebren in der Mathematik Eine universelle Algebra ist ein Paar A,Ω, wobei A die Trägermenge und Ω ein System von Operationen auf A ist. Der Typ einer Algebra beschreibt die Stelligkeiten und eine Menge von Gesetzen das Verhalten der Operationen. Beispiel: Der Ring über den ganzen Zahlen Z, {+,,,0} ist eine Algebra des Typs 2,2,1,0 mit (u.a.) diesen Gesetzen: (a + b) + c = a + (b + c) a + b = b + a a + 0 = a a + ( a) = 0 (a b) c = a (b c) Eine Varietät V (Ω, ) ist eine Familie universeller Algebren mit gemeinsamem Ω und. In freien Algebren in V (Ω, ) gelten nur die aus ableitbaren Gesetze. Typsysteme, Grundlagen 15

Algebren zur ADT-Spezifikation Die Signatur einer universellen Algebra besteht aus der Menge der Operationen und dem Typ der Algebra. Eine Signatur entspricht der Schnittstelle eines ADT. Spezifikation des ADT WW als Beispiel: Operationen: Ω = {wahr, falsch, nicht, und, oder} Typ der Algebra: 0, 0, 1, 2, 2 Gleichungen: nicht(wahr) = falsch nicht(falsch) = wahr und(w,wahr) = w oder(w,wahr) = wahr und(w,falsch) = falsch oder(w,falsch) = w und(v,w) = und(w,v) oder(v,w) = oder(w,v) Typsysteme, Grundlagen 16

Heterogene Algebren Eine heterogene Algebra ist ein Tupel A 1,..., A n,ω, wobei A 1,..., A n Trägermengen und Ω Operationen sind. Jeder Trägermenge A i ist eine Sorte s i zugeordnet. Der Index jeder Operation beschreibt die Sorten der Operanden und des Ergebnisses. Die Signatur besteht aus der Menge der Operationen sowie dem Typ und den Indizes aller Operationen. Jede Sorte entspricht einem Typ in einer Programmiersprache. Typsysteme, Grundlagen 17

Beispiel für heterogene Algebra (1) Sorten: WListe, WW Operationen: leerw : WListe cons : WW WListe WListe car : WListe WW cdr : WListe WListe wahr : WW falsch : WW nicht : WW WW und : WW WW WW oder : WW WW WW Typsysteme, Grundlagen 18

Beispiel für heterogene Algebra (2) Gleichungen: car(cons(w, l)) = w cdr(cons(w, l)) = l cdr(leerw) = leerw nicht(wahr) = falsch nicht(falsch) = wahr und(w, wahr) = w und(w, falsch) = falsch und(v, w) = und(w, v) oder(w, wahr) = wahr oder(w, falsch) = w oder(v, w) = oder(w, v) Typsysteme, Grundlagen 19

Sorten als Parameter WListe und WW können nur beschränkt als ADT bezeichnet werden, da diese Typen nur in einer gemeinsamen Datenkapsel spezifiziert werden können. Im Endeffekt muss jedes ausreichend komplexe Programm in einer einzigen Datenkapsel dargestellt werden. Als Lösung bieten sich parametrisch polymorphe Typen an: Sorten werden als Parameter an andere Algebren übergeben. Diese Lösung funktioniert immer, wenn keine zyklischen Typabhängigkeiten bestehen. Typsysteme, Grundlagen 20

Beispiel für Parameter-Sorten Sorten: Liste Parameter-Sorten: Element Operationen: leer : Liste cons : Element Liste Liste car : Liste Element cdr : Liste Liste Gleichungen: car(cons(e, l)) = e cdr(cons(e, l)) = l cdr(leer) = leer Typsysteme, Grundlagen 21

Prozessalgebra Sie dient zur Spezifikation nebenläufiger Prozesse. Atomare Aktionen (Befehle einer virtuellen Maschine) werden mittels (Hintereinanderausführung), (Parallelausführung) und + (alternative Ausführung) verknüpft. Äquivalenz wird über algebraische Gesetze ausgedrückt: x + y = y + x (x + y) + z = x + (y + z) x + x = x (x + y) z = x z + y z (x y) z = x (y z) x ε = x ε x = x x y = y x (x + y) z = x z + y z (x y) z = x (y z) x ε = x Typsysteme, Grundlagen 22