Lambda-Kalkül. Philipp Meyer. 28. April 2009

Ähnliche Dokumente
1 Geschichte. 2 Syntax und Konzepte. Lamdba-Kalkül

Der untypisierte Lambda-Kalkül als Programmiersprache

Der untypisierte Lambda-Kalkül

Funktionale Programmierung - Grundlagen -

Theoretische Informatik II

Der untypisierte Lambda-Kalkül

Theoretische Informatik II

Funktionale Programmierung ALP I. λ Kalkül WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Programmierparadigmen

Übersicht. Nebenläufige Programmierung: Praxis und Semantik. Semantische Modelle nebenläufiger Programmiersprachen. Einleitung

Der untypisierte Lambda-Kalkül als Programmiersprache

3 Exkurs: Der λ-kalkül

Lambda-Kalkül. Dr. Eva Richter. 27.April 2012

Einführung in das λ-kalkül

Funktionale Programmierung ALP I. λ Kalkül. Teil 2 WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Einführung in die funktionale Programmierung

Inferenzmethoden. Einheit 18. Logik höherer Stufe

Funktionale Programmierung ALP I. Kombinatorische Logik (CL) SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Universität Hannover Fakultät für Elektrotechnik und Informatik Institut für Theoretische Informatik. Thema: von. Paul Krüger

Höhere Programmiersprachen

Kapitel 5: λ-kalkül und Laziness

Der einfach getypter Lambda-Kalkül

Funktionale Programmierung Einführung

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle

Der untypisierte Lambda-Kalkül

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Andreas Abel Ludwig-Maximilians-Universität München. Rohfassung vom 2. Juli 2010

Einführung in die funktionale Programmierung

Software Entwicklung 1

Programmierparadigmen

Interpreter (Hilfsfunktionen)

Einführung in die Theoretische Informatik

Gliederung. Programmierparadigmen. Mathematische Funktionen: Mathematische Funktionen: Lambda-Kalkül

Einführung in die Funktionale Programmierung:

1 Einleitung. 2 Normalordnungsreduktion. 3 Anwendungsordnung. 4 Verzögerte Auswertung. 5 Programmieren mit let in Haskell.

GTI. Hannes Diener. 18. Juni. ENC B-0123,

1 Vollständige partielle Ordnungen, stetige Funktionen

Unentscheidbarkeitssätze der Logik

Logik für Informatiker Logic for computer scientists

Programmierparadigmen Software Entwicklung 1

5. Lambda-Kalkül und Logik höherer Stufe

Berechenbarkeit, Beweisbarkeit. Geschichte

Übung zur Vorlesung Automatisierte Logik und Programmierung I

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

Berühmte Informatiker

Theoretische Informatik II

Einführung IMP-Syntax Reduktionssemantik Maschinen-Semantik. Teil IV. Semantik imperativer Sprachen

Imperative und funktionale Sprachen

Operationale Semantik 1

Reduktion. 2.1 Abstrakte Reduktion

Mächtigkeit von LOOP-Programmen. Prof. Dr. Berthold Vöcking Lehrstuhl Informatik 1 Algorithmen und Komplexität RWTH Aachen

PCF und denotationale Semantik

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

Berechenbarkeit und Komplexität: Mächtigkeit von Programmiersprachen: WHILE- und LOOP-Programme

ALP I Primitiv-Rekursive Funktionen

Funktionen und sprachliche Bedeutungen

Einführung in die mathematische Logik

Reduktionssysteme Termersetzungssysteme. Keine kritischen Paare. Betrachte Variablenüberlappung:

Warum wir noch Mathematiker brauchen

Theoretische Informatik II

4. Spezifikation in PVS (II): Funktionen und Prädikate

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

Kapitel 6. Programme mit Schleifen. Wir betrachten jetzt eine einfache imperative Programmiersprache IMP. IMP verfügt

Wir betrachten jetzt eine idealisierte imperative Programmiersprache IMP mit zuweisbaren

4 Terme und Σ-Algebren

Einführung in Berechenbarkeit, Komplexität und Formale Sprachen

Formale Sprachen. Grammatiken. Grammatiken und die Chomsky-Hierarchie. Rudolf FREUND, Marion OSWALD. Grammatiken: Ableitung

Fortgeschrittene Funktionale Programmierung

Kapitel 3. Syntax und Semantik von arithmetischen Ausdrücken. 3.1 Syntax

Entwicklung korrekter Programme in Coq. Thomas Strathmann

Berechenbarkeit und Komplexität: Mächtigkeit von Programmiersprachen: WHILE- und LOOP Programme

Grundbegriffe für dreiwertige Logik

Reduktionssysteme und Termersetzungssysteme

Überblick. Ausdrücke. 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 Induktion und Rekursion 3.3 Ausdrücke

Formale Sprachen. Grammatiken und die Chomsky-Hierarchie. Rudolf FREUND, Marian KOGLER

Funktionsobjekte 306 operator

Grammatiken. Eine Grammatik G mit Alphabet Σ besteht aus: Variablen V. Startsymbol S V. Kurzschreibweise G = (V, Σ, P, S)

Funktionale Programmiersprachen

Einführung in die Theoretische Informatik

Der erste Gödelsche Unvollständigkeitssatz

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

Seminar Mathematische Logik L-Strukturen und Syntax der Prädikatenlogik

Einführung in Berechenbarkeit, Komplexität und Formale Sprachen

Vortrag. Vortrag im Rahmen der Master-Vorlesung Semantik von Programmiersprachen an der FH München, Fachbereich Informatik

Satzsemantik. Semantik und Pragmatik. Satzsemantik. Satzsemantik

Kapitel 5. Mathematische Semantik. 1 Motivation

Wir haben eine Beziehung zwischen entscheidbar und rekursiv aufzählbar hergeleitet.

2 Hennessy-Milner-Logik

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül

Gröbnerbasen in Monoid- und Gruppenringen

8 Der Kompaktheitssatz und der Satz von Löwenheim und Skolem

Funktionale Programmierung ALP I. µ-rekursive Funktionen WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Fortgeschrittenenpraktikum Implementierung eines Type Checkers für das System F ω

Fortgeschrittene Funktionale Programmierung

Grundlagen der Programmierung 2. Operationale Semantik

Transkript:

Lambda-Kalkül Philipp Meyer 28. April 2009

1 Einleitung Der λ-kalkül ist eine von Alonzo Church und Stephen Kleene in den 1930er Jahren eingeführtes Modell zur Beschreibung berechenbarer Funktionen. Es ververwendet nur fundamentale Reduktions- und Konversionsregeln zur Veränderung von textuellen Ausdrücken. Wie Turing 1937 zeigte, ist der λ-kalkül gleichmächtig im Sinne der Berechenbarkeit zu der Turing-Maschine. Hierraus folgt entsprechend, dass es im λ-kalkül unentscheidbar ist, ob zwei Terme äquivalent sind oder ein Term eine Normalform besitzt. Die typisierten Varianten des λ-kalküls bilden die Grundlage von funktionalen Programmiersprachen wie ML oder Haskell und können auch als eine Meta-Logik verwendet werden, was zu Theorembeweisern für Logiken höherer Stufe und mächtigen Typsystemen führte. 2 Syntax 2.1 Terme Definition 1 Die Menge Λ der λ-terme ist induktiv definiert durch: x Λ M Λ (λx.m) Λ M, N Λ (MN) Λ (1) (2) (3) Hierbei ist x eine Variable. Ein durch (2) konstruierter Term wird Abstraktion genannt und entspricht einer Funktionsdeklaration. Ein durch (3) konstruierter Term wird Applikation genannt und entspricht einer Funktionsanwendung. Notation Äußere Klammern werden weggelassen: M (M) Applikation ist linksassoziativ: MN 1... N n M N (... (MN 1 )... N n ) Der Körper der Abstraktion bindet so weit nach rechts wie möglich: λx.m 1... M n λx. M λx.(m 1... M n ) Bei aufeinanderfolgenden Abstraktionen werden die inneren λ. weggelassen: λx 1... x n.m λ x.m (λx 1.(... (λx n.m)... )) 2

Definition 2 Die Menge der Subterme eines Terms sei durch die Funktion S ub : Λ P(Λ) definiert: S ub(x) = {x} S ub(λx.m) = S ub(m) {(λx.m)} S ub(mn) = S ub(m) S ub(n) {(MN)} 2.2 Bindung und Substitution Definition 3 Die Menge der gebundenen Variablen eines Terms sei durch die Funktion BV : Λ P(Var) : definiert: BV(x) = BV(λx.M) = BV(M) {x} BV(MN) = BV(M) BV(N) Definition 4 Die Menge der freien Variablen eines Terms sei durch die Funktion FV : Λ P(Var) : definiert: FV(x) = x FV(λx.M) = FV(M)\{x} FV(MN) = FV(M) FV(N) Definition 5 Ein Term T ist geschlossen, falls FV(T) =. Definition 6 Die Substitution von x durch N in M, M[x := N], ist nach dem klassischen Ansatz von Church definiert durch: x[x := N] N y[x := N] y (λx.m)[x := N] λx.m (λy.m)[x := N] λy.m[x := N] (λy.m)[x := N] λz.(m[y := z])[x := N] (M 1 M 2 )[x := N] (M 1 [x := N])(M 2 [x := N]) falls x y falls x y y FV(N) falls x y y FV(N), z neue Variable Definition 7 Die Menge C der λ-kontexte ist definiert durch: x C [] C C[] C (λx.c[]) C C 1 [], C 2 [] C (C 1 []C 2 []) C 3

Ein Kontext ist ein λ-term, der [] als Löcher enthalten kann. Ist C[] ein Kontext, so bezeichnet C[T] den Term, der die Löcher durch T ersetzt. Als Beispiel für den Kontext C[] = ((λx.[]x)m) ist C[λy.y] = (λx.(λy.y)x)m. 3 Kongruenzregeln 3.1 α-konversion Definition 8 Die α-konversion α und die α-äquivalenz α sind definiert als M α M : M C[λx.N] M C[λy.(N[x := y])] y FV(N) M α N : M α N M α N falls M und N gleich sind modulo Umbenennung gebundener Variablen. Beispiel λx.x y α λz.z y α λy.y y Konventionen 1. Wir arbeiten mit α-äquivalenzklassen von Termen. Beispiel λx.x λy.y. 2. Gebundene Variablen werden automatisch umbenannt, so dass sie von allen freien Variablen verschieden sind. Damit wird die Substitution vereinfacht: Beispiel: (λy.m)[x := N] λy.m[x := N] (λy.x y)[x := F y] (λy.f y y ) (y ist frei in Fy, das gebundene y wird umbenannt) 3.2 β-reduktion Definition 9 Ein β-redex ist ein Term der Form (λx.m)n. Wir definieren β-reduktion durch C[(λx.M)N] β C[M[x := N]] Ein Term ist in β-normalform wenn er in Normalform bezüglich β ist. Beispiel λx. (λx.x x)(λx.x) } {{ } β λx. (λx.x)(λx.x) } {{ } β λx.λx.x Definition 10 Alternative induktive Definition von β : 1. (λx.m)n β M[x := N] 2. M β M (MN) β (M N) 2. M β M (NM) β (NM ) 2. M β M (λx.m) β (λx.m ) 4

β-reduktion ist nicht-terminierend. Beispiel: Ω := (λx.x x)(λx.x x) β Ω nicht-deterministisch aber determiniert. Beispiel: (λx.x x)((λy.y)z) kann zu (λx.x x)z oder (((λy.y)z)((λy.y)z) reduziert werden, hat als Normalform aber immer z z. 3.2.1 Konfluenz Definition 11 Ein Transitionssystem (D, ) heiß genau dann konfluent, wenn t, t 1, t 2 D. t t 1 t t 2 t D. t 1 t t 2 t In einem konfluenten Transitionssystems besitzt jedes Element höchstens eine Normalform. Ein Term, der auf verschiedenen Wegen ersetzt werden kann, wird nach weiteren Ersetzungen immer zum gleichen Term überführt. Wir versuchen Konfluenz von β über die Konfluenz von > zu beweisen: Definition 12 Parallele und geschachtelte Reduktion > 1. M > M 2. λx.m > λx.m falls M > M 3. (M N) > (M N ) falls M > M und N > N (parallel) 4. (λx.m)n > M [x := N ] falls M > M und N > N (parallel und geschachtelt) Lemma 1 M β M M > M Lemma 2 M > M M β M Korollar 1 > = β Lemma 3 λx.m > N N x.m M > M Lemma 4 > ist konfluent Beweis Durch Induktion über Definition von > wird gezeigt: M, M 1, M 2.M > M 1 M > M 2 M 3.M 1 > M 3 M 2 > M 3 M 1 M: Wähle M 3 = M 2 M λx. M 2 λx.p P > P (Nach Lemma 3) P.P > P P > P (Induktionshypothese) M 3 = λx.p 5

M P Q M 1 P Q P > P Q > Q : Hier gibt es zwei Fälle zu unterscheiden: 1. M 2 P Q P > P Q > Q P.P > P P > P (Induktionshypothese) Q.Q > Q Q > Q (Induktionshypothese) M 3 = P Q 2. M 2 P 1 [x := Q ] P λx.p 1 P 1 > P 1 Q > Q P λx.p 1 P 1 > P 1 (Nach Lemma 3) P 1.P 1 > P 1 P 1 > P 1 (Induktionshypothese) Q.Q > Q Q > Q (Induktionshypothese) M 3 = P 1 [x := Q ] M (λx.p)q M 1 P [x := Q ] P > P Q > Q : Analog zu oben mit Fällen für M 2 = P [x := Q ] und M 2 = (λx.p )Q. Korollar 2 β ist konfluent. 4 Berechnung im λ-kalkül 4.1 Boolsche Werte true, false und if können im λ-kalkül wie folgt definiert werden: true = λxy.x false = λxy.y if = λzxy.z x y Beispiel if true M N β M und if false M N β N. 4.2 Paare Paare werden realisiert durch fst = λp.p true snd = λp.p false pair = λxy.λz.z x y Beispiel fst(pair x y) β fst(λz.z x y) β (λz.z x y)(λxy.x) β (λxy.x) x y β x 6

4.3 Arithmetik Eine Möglichkeit, natürliche Zahlen darzustellen sind die Church-Numerale: 0 = λ f.λx.x 1 = λ f.λx. f x 2 = λ f.λx. f ( f x). n = λ f.λx. f n (x) = λ f.λx. f ( f (... ( f (x)) } {{ } n mal Damit können arithmetische Funktionen definiert werden: Beispiel succ = λn.λ f x. f (n f x) add = λmn.λ f x.m f (n f x) mult = λmn.λ f.m (n f ) iszero = λn.n(λx.false)true pred = λn.λ f x.n(λgh.h(g f ))(λu.x)(λu.u) add m n λ f x.m f (n f x) λ f x.m f ( f n (x)) λ f x. f m ( f n (x)) = λ f x. f m+n (x) = m + n 4.4 Rekursion Rekursion ist im λ-kalkül nicht ohne weiteres möglich, da bei einer Funktionsdefinition der Funktionsname nicht verwendet werden kann. Möchte man eine rekursive Funktion f (x) = e darstellen, so benötigt man eine nicht-rekursive Darstellung F = λ f.λx.e. Die Funktion, die an F übergeben wird, muss bestimmte Eigenschaften haben, und zwar muss f zu F( f ) expandieren. Damit ist f ein Fixpunkt von F. So eine Funktion kann mit einem Fixpunktoperator implementiert werden. Eine bekannte Lösung ist der Church sche Fixpunktoperator: Damit lässt sich f als Y F darstellen, denn Y = λ f.v f V f mit V f = λx. f (x x) Y F β (λx.f(x x))(λx.f(x x)) β F((λx.F(x x))(λx.f(x x)))) = F(YF) 7

Beispiel Die Fakultätsfunktion lässt sich im λ-kalkül folgendermaßen schreiben: fac = Y (λ f ac.λn.if(iszero n) 1 (mult n ( f ac(pred n)))) } {{ } F fac 2 = Y F 2 β F (Y F) 2 β if(iszero 2) 1 (mult 2 (Y F (pred 2))) β mult 2 (Y F 1) β mult 2 (mult 1(Y F 0)) β mult 2 (mult 1(F(Y F)0)) β mult 2 (mult 1(if(iszero 0) 1... ) β mult 2 (mult 1 1) β 2 Literatur [1] Barendregt, Hendrik P.: The Lambda Calculus. Its Syntax and Semantics. Amsterdam u.a. : Elsevier, 1984 [2] Hankin, Chris: An introduction to Lambda calculi for computer scientists. London : King s College Publ., 2004 [3] Nipkow, Tobias: Lambda-Kalkül. http://www4.in.tum.de/lehre/vorlesungen/ logik/ws0607/lambda.pdf. Version: 15. November 2004 8