Automatisierte Logik und Programmierung Einheit 5 Der λ-Kalkül 1. Syntax 2. Operationale Semantik 3. Schließen über Berechnung 4. Ausdruckskraft Auswertung von Termen • Prädikatenlogik und Evidenzen verwenden Termsprache – Prädikatenlogik: uninterpretierte Variablen- und Funktionssymbole – Evidenz: Terme der Prädikatenlogik und Konstrukte mit Bedeutung λx.b, f (a), (a, b), x.1, x.2, inl(a), inr(b), case x of ... • Verschiedene Terme können die gleiche Bedeutung haben – Für f = λx.b ist f (a) = b[a/x] und λx.f (x) ist dasselbe wie f – (a, b).1 = a, (a, b).2 = b und das Paar (x.1, x.2) ist dasselbe wie x – case inl(a) of inl(y) → s | inr(z) → t ist dasselbe wie s[a/y] – Terme auf rechter und linker Seite haben jeweils denselben Wert • Termauswertung kann als Kalkül beschrieben werden – Berechnungskalkül interpretiert Terme als Programmiersprache und kalkuliert Wert schrittweise durch Termersetzung (Rewriting) – Beweiskalkül beschreibt Effekte der Berechnungsschritte als Gleichheiten in einer Berechnungslogik – Die Grundform beider Kalküle ist der λ-Kalkül AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 1 λ-Kalkül Der λ-Kalkül Logisches Schließen über den Wert von Termen • Einfacher mathematischer Mechanismus – Funktionen werden definiert und angewandt – Beschreibung des Funktionsverhaltens wird zum Namen der Funktion – Funktionswerte werden ausgerechnet durch Einsetzen von Werten • Leicht zu verstehende Basiskonzepte 1. Definition einer Funktion: f = ˆ λx. 2*x+3 λ-Abstraktion Name der Funktion irrelevant für Beschreibung des Verhaltens 2. Anwendung der Funktion (ohne Auswertung): f(4) = ˆ (λx. 2*x+3)(4) Applikation 3. Auswertung einer Funktionsanwendung (tatsächliches Ausrechnen): β ∗ (λx. 2*x+3)(4) −→ 2*4+3 −→ 11 Reduktion • Alle anderen Konstrukte können simuliert werden – Turingmächtige funktionale Programmiersprache AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 2 7→ Lisp, ML, Haskell, . . . λ-Kalkül λ-Kalkül – Syntax • Einfache Programmiersprache: λ-Terme – Variablen x, y, z, x0, y0,, . . . – λx.t, wobei x Variable und t λ-Term Vorkommen von x in t werden gebunden – f t, wobei t und f λ-Terme – (t), wobei t λ-Term λ-Abstraktion Applikation • Prioritätskonventionen sparen Klammern – Applikation bindet stärker als λ-Abstraktion – Applikation ist links-assoziativ: • Beispiele für λ-Terme (mit impliziten und ‘kosmetischen’ Klammern) –x – λf.(λx.(f(x))) – λf.(λg.(λx.(((f g) (g x))))) – x(x) – (λx.x(x)) (λx.x(x)) AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG λx.f t = ˆ λx.(f t) f t1 t2 = ˆ (f t1 ) t2 Symbole sind immer Variablen Anwendung einer Funktion Funktionen höherer Ordnung Selbstanwendung Fixpunkt 3 λ-Kalkül λ-Kalkül – Semantik • Interpretation in Zielsprache ist zu kompliziert – Abbildung auf Funktionen in einfachem Universum nicht möglich – Modellierung benötigt Theorie vollständiger Halbordnungen (CPOs) • Semantik von Termen wird operational erklärt – Entspricht Methodik beim Rechnen auf Zahlen: 4∗(3+2) = 4∗5 = 20 – λ-Terme werden ausgewertet bis irreduzibler Term erreicht ist – Irreduzible Terme werden als Werte angesehen • Berechnung ist rein syntaktischer Mechanismus – Auswertung ersetzt Funktionsparameter durch Funktionsargumente β – Formales Konzept: Reduktion (λx.t)(b) −→ t[b/x] Ersetzen der freien Vorkommen der λ-Variablen x durch den λ-Term b – Benötigt Erweiterung des Substitutionskonzepts auf λ-Terme AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 4 λ-Kalkül Vorkommen von Variablen in λ-Termen • Vorkommen der Variablen x im Term t, informal – Gebunden: x erscheint im Bindungsbereich einer λ-Abstraktion λx – Frei: x kommt in t vor, ohne gebunden zu sein – t heißt geschlossen falls t keine freien Variablen enthält – t[x1, .., xn]: Term t hat mögliche freie Vorkommen von x1, .., xn • Präzise, induktive Definition die Variable x kommt frei vor; y6=x kommt nicht vor x λx.t: beliebige Vorkommen von x in t werden gebunden Vorkommen von y6=x in t bleiben unverändert f t freie Vorkommen von x in t bleiben frei (t) gebundene Vorkommen von x bleiben gebunden x gebunden z }| { λf.λx.(λz. f{zx z) x} | x frei AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 5 λ-Kalkül Substitution u[t/x] formal • Anwendung einer endlichen Abbildung σ = [t/x] ⌊x⌋[t/x] =t ⌊λx.u⌋[t/x] = λx.u ∗ ⌊λx.u⌋[t/y] = ⌊λz.u[z/x]⌋[t/y] ⌊f u⌋σ = f σ uσ ∗ ⌊x⌋[t/y] =x ⌊λx.u⌋[t/y] = λx.⌊u[t/y]⌋ ∗∗ = (uσ) ⌊(u)⌋σ (y6=x) : y6=x, y frei in u, x frei in t, z neue Variable : y6=x, y nicht frei in u oder x nicht frei in t ∗∗ • Substitution und Reduktion am Beispiel (λn.λf.λx. n f (f x)) (λf.λx.x) = (λn.(λf.(λx.((n f)(f x))))) (λf.(λx.x)) (Reduktion ersetzt n) −→ λf.(λx.((λf.(λx.x)) f)(f x)) (8 Substitutionsschritte) −→ λf.(λx.((λx.x)(f x))) −→ λf.λx. f x ⇓ 3 (λn.λf.λx. n f (f x)) (λf.λx.x) −→ λf.λx. f x AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 6 λ-Kalkül Reduktion als Formalismus – wichtige Begriffe • α-Konversion: – Umbenennung gebundener Variablen in Termen (erhält Bedeutung) – Ersetze Teilterms der Gestalt λx.u durch λz.u[z/x] (z neue Variable) • Kongruenz t ∼ = u (“t und u sind α-konvertibel”) – u entsteht aus t durch α-Konversion β • Reduktion (λx.u) s −→ u[s/x]: – Ersetze Teilterm der Gestalt (λx.u) | {z s} durch u[s/x] | {z } Redex Kontraktum ∗ • Reduzierbarkeit t −→ u: – u entsteht aus t durch endlich viele Reduktionen und α-Konversionen • Normalform: – Term u, der nicht weiter reduzierbar (irreduzibel) ist ∗ – Wert von t: Normalform u mit t −→ u AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 7 λ-Kalkül Regeln für Konversion und Reduktion • α-Konversion: λx.u ∼ = λz.u[z/x] (z neu) – µ-Konversion: f t ∼ = f u, falls t ∼ = u – ν-Konversion: f t ∼ = g t, falls f ∼ = g – ξ-Konversion: λx.t ∼ = λx.u, falls t ∼ =u – ρ -Konversion: t ∼ =t – σ-Konversion: t ∼ = u, falls u ∼ =t – τ -Konversion: t ∼ = u, falls t ∼ = s und s ∼ =u • β-Reduktion: (λx.u) s −→ u[s/x] µ–Reduktion: f t −→ f u, falls t −→ u ν–Reduktion: f t −→ g t, falls f −→ g ξ–Reduktion: λx.t −→ λx.u, falls t −→ u τ –Reduktion: t −→ u, falls t −→ s und s ∼ = u oder t ∼ = s und s −→ u ∗ n • Reduzierbarkeit: t −→ u, falls t −→ u für ein n ∈ N 0 – t −→ u, falls t ∼ =u n+1 n – t −→ u, falls t −→ s und s −→ u – – – – AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 8 λ-Kalkül Reduktion ist nicht deterministisch Naheliegende Reduktionsreihenfolge (λf.λx. f x (f f)) (λx.λy. y) −→ λx. (λx.λy. y) x ((λx.λy. y) (λx.λy. y)) −→ λx. (λy. y) ((λx.λy. y) (λx.λy. y)) −→ λx. ((λx.λy. y) (λx.λy. y) −→ λx. λy. y Alternative Reduktionsreihenfolgen sind möglich (λf.λx. f x (f f)) (λx.λy. y) −→ λx. (λx.λy. y) x ((λx.λy. y) (λx.λy. y)) −→ λx. (λx.λy. y) x (λy. y) −→ λx. (λy. y) (λy. y) −→ λx. λy. y Bekommt man immer das gleiche Ergebnis? AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 9 λ-Kalkül Semantik von λ-Termen präzisiert • Bedeutung von λ-Termen ist ihr Wert – Normalform: Term ohne keine Redizes als Teilterme ∗ – u Normalform von t: u in Normalform und t −→ u – t normalisierbar: es gibt eine Normalform u von t • Hat jeder λ-Term eine Normalform? Nein: (λx. x x) (λx. x x) ist nicht normalisierbar – Terminierung von λ-Programmen ist nicht garantiert • Haben normalisierbare λ-Terme eindeutige Werte? Notwendig für Einsatz des λ-Kalküls als Programmiersprache – Führt jede Reduktionsfolge zu einer Normalform? Wenn nein, kann man eine Normalform systematisch finden? – Ist die Normalform eines λ-Terms eindeutig? AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 10 λ-Kalkül Reduktion normalisierbarer λ-Terme • Führt jede Reduktionsfolge zu einer Normalform? Nein: Reduktionsfolgen normalisierbarer Terme müssen nicht terminieren (λx.λy.y) ((λx. x x x) (λx. x x x)) (λx. x) −→ (λy.y) (λx. x) −→ λx. x Eine “innermost” Strategie führt bei diesem Term nicht zur Normalform (λx.λy.y) ((λx.x x x) (λx.x x x)) (λx.x) ∗ −→ (λx.λy.y) ((λx.x x x) (λx.x x x) (λx.x x x)) (λx.x) ∗ −→ (λx.λy.y) ((λx.x x x)(λx.x x x)(λx.x x x) (λx.x x x)) (λx.x) .. .. • Kann man eine Normalform immer finden? – Ja: Reduktion des äußersten Redex (“leftmost reduction”) führt zur Normalform, wenn es eine gibt Beweis: Curry & Feys 1958, p142 AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 11 λ-Kalkül Eindeutigkeit von Normalformen • Was heißt “eindeutig”? – Müssen Normalformen textlich identisch sein (wie 4 = 4)? – Oder sollen sie “nur” den gleichen Wert haben (wie λx.x und λy.y)? – Gleichwertigkeit zu fordern ist semantisch sinnvoller • Semantische Gleichheit von λ-Termen ist extensional ∗ ∗ – t = u: es gibt v mit t −→ v und u −→ v (t und u sind konvertierbar) – Auch Terme, die nicht normalisierbar sind, können gleich sein • Ist die Normalform eines λ-Terms eindeutig? – Ja: Reduktion ist konfluent ∗ Beweis: Barendregt 1981 §3.2 ∗ Gilt t −→ u und t −→ v, so folgt u = v (Church-Rosser Theorem) – Alle Normalformen eines λ-Terms sind kongruent und können (durch Konversionen) auf denselben Term reduziert werden – Semantisch gleiche Terme haben dieselben Normalformen oder keine – Normalformen, die nicht kongruent sind, sind nicht semantisch gleich AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 12 λ-Kalkül Semantische Gleichheit • Ausdrucksstärker als Reduzierbarkeit – Benötigt keine Normalform für den Vergleich von Termen Es reicht, mit Reduktionen/Konversionen den gleichen Term zu erreichen – Auch Terme, die nicht normalisierbar sind, können verglichen werden • Grundlage des logischen Schließens über Berechnungen – Im (allgemeinen) λ-Kalkül kann automatische Normalisierung zu nichtterminierenden Reduktionsfolgen führen Für typisierbare λ-Termen gibt es immer eine terminierende Reduktionsstrategie – Schließen über semantische Gleichheit braucht terminierende Reduktion – Beweisregeln müssen einzelne Reduktionsschritte widerspiegeln • Der λ-Kalkül ist unabhängig von der Prädikatenlogik – Schließen über semantische Gleichheit benötigt keine logischen Regeln – Beweissysteme können separat beschrieben und dann integriert werden AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 13 λ-Kalkül Regeln zum Schließen über Gleichheit • β-Reduktion – Gleichheit mit einem Redex entspricht Gleichheit mit Kontraktum H ⊢ (λx.u) s = t H ⊢ u[s/x] = t reduction • Kongruenzregeln – Applikationen sind gleich, wenn Funktionen und Argumente gleich sind – Funktionen sind gleich, wenn sie auf allen Argumenten gleich sind H ⊢f t=gu H ⊢f =g H ⊢ t = u applyEq H ⊢ λx.t = λy.u H, x′:U ⊢ t[x′/x] = u[x′/y] lambdaEq x′ ist neue Variable, die in H nicht frei vorkommt • Reflexivität, Symmetrie, Transitivität, Substitution H ⊢t=t H ⊢t=u H ⊢u=t reflexivity H ⊢ t = u H ⊢t=s H ⊢s=u symmetry transitivity s AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 14 H ⊢ C[t/x] H ⊢t=u H ⊢ C[u/x] subst t=u λ-Kalkül Sequenzenbeweis für eine Reduktion • Beweis einer einfachen Reduktion ⊢ (λf.λx.f x(f f ))(λx.λy.y) = λx.λy.y 1. ⊢ λx. (λx.λy.y)x((λx.λy.y)(λx.λy.y)) = λx.λy.y 1.1. x:U ⊢ (λx.λy.y)x((λx.λy.y)(λx.λy.y)) = λy.y 1.1.1. x:U ⊢ (λy.y) ((λx.λy.y)(λx.λy.y)) = λy.y 1.1.1.1. x:U ⊢ (λx.λy.y)(λx.λy.y) = λy.y 1.1.1.1.1. x:U ⊢ λy.y = λy.y BY BY BY BY BY BY reduction lambdaEq reduction reduction reduction reflexivity BY BY BY BY BY BY BY reduction symmetry reduction lambdaEq symmetry reduction reflexivity • Beweis einer semantischen Gleichheit ⊢ (λf.λx.f x)(λy.y) = (λx.λy.y)(λz.z) 1. ⊢ λx.(λy.y) x = (λx.λy.y)(λz.z) 1.1. ⊢ (λx.λy.y)(λz.z) = λx.(λy.y) x 1.1.1. ⊢ λy.y = λx.(λy.y) x 1.1.1.1. x:U ⊢ x = (λy.y) x 1.1.1.1.1. x:U ⊢ (λy.y) x = x 1.1.1.1.1.1. x:U ⊢ x = x AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 15 λ-Kalkül Eigenschaften des Beweiskalküls • Korrektheit – Wenn ⊢ u=v im erweiterten Sequenzenkalkül bewiesen werden kann, dann sind u und v semantisch gleich (u = v) – Die neuen Regeln sind korrekt in Bezug auf semantische Gleichheit • Vollständigkeit gilt nur in eingeschränktem Sinne ∗ ∗ Jede (konkrete) Reduktionsfolge u −→ t und v −→ t kann in eine Folge von Beweisschritten für ⊢ u=v übertragen werden – β-Reduktion wird von reduction abgedeckt – α- und ξ-Konversionen und -Reduktionen werden von lambdaEq erfaßt – µ- und ν-Konversionen und -Reduktionen werden von applyEq erfaßt – reflexivity, symmetry, transitivity, subst decken den Rest ab Achtung! Es folgt nicht: “Gilt u = v, so ist ⊢ u=v beweisbar” (siehe Folie 29) • Kalkül kann auch definitorische Gleichheit verarbeiten – Sind Konzepte durch definitorische Abkürzung erklärt, so ersetzt die Regel unfold die linke Seite der Definition durch die rechte AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 16 λ-Kalkül Vom λ-Kalkül zu echten Programmen • λ-Kalkül ist der Basismechanismus – Die Assemblersprache funktionaler Programme – Nur die elementarsten Konstrukte sind vordefiniert • Programm- und Datenstrukturen werden codiert – Berechnung auf λ-Ausdrücken muß Effekte auf Struktur simulieren (Analog zu konventionellen Computern, in denen alles als Bitmuster codiert wird) • Alle wichtigen Strukturen sind leicht codierbar – Boolesche Operationen: T, F, if b then s else t – Tupel / Projektionen: hs,ti, p.1, p.2 – Injektion / Analyse: inl(a), inr(b), case x of inl(a)→s | inr(b)→t – Zahlen und arithmetische Operationen – Iteration oder Rekursion von Funktionen Der λ-Kalkül kann alle berechenbaren Funktionen repräsentieren AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 17 λ-Kalkül Darstellung Boolescher Operatoren im λ-Kalkül Wir brauchen zwei verschiedene Objekte und einen Test T ≡ λx.λy.x Term für “true” F ≡ λx.λy.y Term für “false” if b then s else t ≡ b s t Term für Konditional Beweis: Die Konditional(-darstellung) ist invers zu T und F ⊢ ⊢ ⊢ ⊢ ⊢ if T then s else t = s Tst = s (λx.λy.x) s t = s (λy.s) t = s s = s AUTOMATISIERTE L OGIK UND ⊢ unfold T/F ⊢ ⊢ reduction reduction ⊢ reflexivity ⊢ BY unfold cond BY BY BY BY P ROGRAMMIERUNG 18 if F then s else t = t Fst = t (λx.λy.y) s t = t (λy.y) t = t t = t λ-Kalkül “Beweis” für F 6= T Beweis zeigt “nur” die Absurdität von F = T – Es ist nicht möglich, F 6= T zu beweisen, aber wenn F = T wäre, dann sind alle λ-Terme gleich ⊢ F = T ⇒ ∀s,t:U. s = t 1. F = T, s:U, t:U ⊢ s = t 1.1. F = T,... ⊢ s = if F then s else t 1.1.1. F = T,... ⊢ if F then s else t = s 1.1.1.1. F = T,... ⊢ F = T 1.1.1.2. F = T,... ⊢ if T then s else t = s 1.1.1.2.1. F = T,... ⊢ (λx.λy.x) s t = s 1.1.1.2.1.1... ⊢ s = s 1.2. F = T,... ⊢ if F then s else t = t 1.2.1. F = T,... ⊢(λx.λy.y) s t = t 1.2.1.1. F = T,... ⊢ t = t BY BY BY BY BY BY BY BY BY BY BY impliesR THEN allR THEN allR transitivity if F then s else t symmetry subst F = T axiom unfold THEN unfold reduction THEN reduction reflexivity unfold THEN unfold reduction THEN reduction reflexivity – Beweis auch ohne Verwendung der subst Regel möglich, aber länger AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 19 λ-Kalkül Bildung und Analyse von Paaren hu,vi ≡ λp. p u v pair.1 ≡ pair (λx.λy.x) pair.2 ≡ pair (λx.λy.y) match pair with hx,yi 7→ t ≡ pair (λx.λy.t) (uniformer Analyseoperator, oft eleganter in Anwendung) Der Analyseoperator ist invers zur Paarbildung ≡ ≡ −→ −→ −→ match hu,vi with hx,yi 7→ t hu,vi(λx.λy.t) (λp. p u v)(λx.λy.t) (λx.λy.t) u v (λy.t[u/x]) v t[u, v/x, y] (kurz für t[u/x][v/y]) AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 20 λ-Kalkül Injektionen und Fallanalyse Verallgemeinerung boolescher Operatoren inl(a) ≡ λx.λy.x a inr(b) ≡ λx.λy.y b case z of inl(x) → s | inr(y) → t ≡ z (λx.s) (λy.t) Fallanalyse ist invers zu Injektionen ≡ ≡ −→ −→ −→ case inl(a) of inl(x) → s | inr(y) → t (inl(a)) (λx.s) (λy.t) (λx.λy.x a) (λx.s) (λy.t) (λy.(λx.s) a) (λy.t) (λx.s) a) s[a/x] ∗ Analog: case inr(b) of inl(x) → s | inr(y) → t −→ t[b/x] AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 21 λ-Kalkül Simulation von Zahlen und Arithmetik • Darstellung natürlicher Zahlen durch iterierte Terme – Semantisch: wiederholte Anwendung von Funktionen – Repräsentiere die Zahl n durch den λ-Term λf.λx. f | (f..(f {z x)..)} n-mal – Notation: n ≡ λf.λx. fn x (Markierung n hilft, eine Verwechselung von Zahlen und zugehörigen λ-Termen zu vermeiden) – Bezeichnung: Church Numerals • f :Nn→N λ-berechenbar: – Es gibt einen λ-Term t mit der Eigenschaft f (x1, .., xn) = m ⇔ t x1..xn = m • Operationen müssen “Termvielfachheit” berechnen – Simulation einer Funktion auf Darstellung von Zahlen muß Darstellung des Funktionsergebnisses liefern – z.B. muß add m n als Wert immer den Term m+n liefern AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 22 λ-Kalkül Arithmetische Operationen im λ-Kalkül • Nachfolgerfunktion: s ≡ λn.λf.λx. f (n f x) – Der Wert von s n ist der Term n+1 s n ≡ −→ −→ −→ −→ (λn.λf.λx. f (n f x)) (λf.λx. fn x) λf.λx. f ((λf.λx. fn x) f x) λf.λx. f ((λx. fn x) x) λf.λx. f (fn x) λf.λx. fn+1 x ≡ n+1 • Addition: add ≡ λm.λn.λf.λx. m f (n f x) • Multiplikation: mul ≡ λm.λn.λf.λx. m (n f) x • Test auf Null: zero ≡ λn. n (λn.F) T • Vorgängerfunktion: p ≡ λn. (n (λf x. hs, match f x with hf,xi 7→ f xi) hλz.0, 0i).2 • Einfache Rekursion: PRs[b,h] ≡ λn. n h b – Für f ≡ PRs[b,h] gilt: f 0 = b und f (s n) = h (f n) AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 23 λ-Kalkül Korrektheit der Additionsfunktion Beweise: add m n = m+n ⊢ ⊢ ⊢ ⊢ ⊢ ⊢ ⊢ ⊢ ⊢ ⊢ ⊢ ⊢ add m n = m+n (λm.λn.λf.λx. m f (n f x)) m n = m+n (λn.λf.λx. m f (n f x)) n = m+n λf.λx. m f (n f x) = m+n λf.λx. (λf.λx. fm x) f (n f x) = m+n λf.λx. (λx. fm x) (n f x) = m+n λf.λx. fm (n f x) = m+n λf.λx. fm ((λf.λx. fn x) f x) = m+n λf.λx. fm ((λx. fn x) x) = m+n λf.λx. fm (fn x) = m+n λf.λx. fm+n x = m+n λf.λx. fm+n x = λf.λx. fm+n x BY BY BY BY BY BY BY BY BY BY BY BY unfold reduction reduction unfold reduction reduction unfold reduction reduction reduction unfold reflexivity Keine Angabe der Unterzieladresse im Beweisbaum, da Beweis linear ist Beweis ist “generisch”. Konkreter Beweis nur mit konkreter Instanz für m und n AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 24 λ-Kalkül Darstellung von Listen • Erweiterung des Konzepts natürlicher Zahlen – Wiederholte Anwendung einer Funktion auf Listenelemente – Repräsentiere a1..an durch den Term λf.λx. f a1 (f..(f an x)..) • Grundkonzepte: Leere Liste, Anhängen, Rekursion [] ≡ λf.λx.x t::list ≡ λf.λx. f t (list f x) list ind[b,h] ≡ λlist. list h b • Rekursionsgleichungen für f ≡ list ind[b,h] ⊢ ⊢ ⊢ ⊢ f [] = b (λlist. list h b) [] = b [] h b = b (λf.λx.x) h b = b ⊢ ⊢ ⊢ ⊢ ⊢ f (t::list) = h t (f list) t::list h b = h t (f list) (λf.λx. f t (list f x)) h b = h t (f list) h t (list h b) = h t (f list) h t ((λlist. list h b) list) = h t (list h b) AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG BY BY BY BY unfold reduce unfold reduce THEN reduce THEN reflexivity BY BY BY BY BY 25 unfold THEN reduce unfold reduce THEN reduce symmetry THEN unfold reduce THEN reflexivity λ-Kalkül Programmierung rekursiver Funktionen • Funktion, die durch Gleichung f (x)=t[f, x] definiert ist – d.h. im Programmkörper t darf f sich selbst und x aufrufen • Darstellung: Anwendung eines Fixpunktkombinators auf t – Fixpunktkombinator: λ-Term R mit Eigenschaft R t = t (R t) für alle t – Rekursive Funktion f ist implementierbar durch f ≡ R (λf .λx.t), ∗ denn es gilt f x = (R (λf .λx.t)) x = (λf .λx.t) f x −→ t[f, x] – Programmiernotation für R(λf .λx.t) ist “function f (x) = t” Notation “function f (x, y) = t” steht für R(λf .λx.λy.t) • Bekanntester Fixpunktkombinator ist der Y-Kombinator – Y ≡ λf. (λx. f (x x)) (λx. f (x x)) ⊢ Y t = t (Y t) BY unfold THEN reduction ⊢ (λx. t (x x)) (λx. t (x x)) = t (Y t) BY reduction ⊢ t (λx. t (x x)) (λx. t (x x)) = t (Y t) BY symmetry ⊢ t (Y t) = t (λx. t (x x)) (λx. t (x x)) BY applyEq 1. ⊢ t = t BY reflexivity 2. ⊢ Y t = (λx. t (x x)) (λx. t (x x)) BY unfold THEN reduction 2.1. ⊢ (λx. t (x x)) (λx. t (x x)) = (λx. t (x x)) (λx. t (x x)) BY reflexivity AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 26 λ-Kalkül Beispiele rekursiv programmierter Funktionen • Fakultätsfunktion: Es ist 0! = 1 und n! = n ∗ (n−1)! für n>0 – fak ≡ function fak(n) = if zero(n) then 1 else mul n (fak(p n)) ≡ Y ( λfak.λn. if zero(n) then 1 else mul n (fak(p n)) ) • Subtraktion: n−m = n, falls m=0, sonst (n−(m−1))−1 – sub ≡ function sub(n,m) = if zero(m) then n else p(sub n (p m)) • Test n<m: Es ist n<m genau dann, wenn n+1−m = 0 – less ≡ λn.λm. zero(sub (s n) m) • Division: Suche das erste z mit n<(z+1) ∗ m). Starte Suche bei 0 – div ≡ λn.λm.(function search(z) = if less n (mul z m) then p z else search(s z)) 0 • Ackermannfunktion: – A ≡ function A(n,x) = if zero(x) then 1 else if zero(n) then if zero(p x) then 2 else add x 2 else A (p n) (A n (p x)) AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 27 λ-Kalkül Ausdruckskraft des λ-Kalküls Alle µ-rekursiven Funktionen sind λ-berechenbar • Nachfolgerfunktion s: s ≡ λn.λf.λx. f (n f x) n: • Projektionsfunktionen prm prnm ≡ λx1..λxn. xm • Konstantenfunktion cn m: cnm ≡ λx1..λxn. m • Komposition f ◦ (g1, .., gn): ◦ ≡ λf.λg1..λgn. λx. f (g1 x)..(gn x) • Primitive Rekursion P r[f, g]: PR ≡ λf.λg. function h(x) = λy.if zero y then f x else g x (p y) (h x (p y)) • Minimierung µ[f ]: Mu ≡ λf.λx. (function min(y) = if zero(f x y) then y else min (s y)) 0 AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 28 λ-Kalkül Konsequenzen der großen Ausdruckskraft Ergebnisse der Berechenbarkeitstheorie übertragen sich • Keine nichttriviale extensionale Eigenschaft von λ-Termen kann automatisch geprüft werden (Satz von Rice) – Terminiert die Berechnung einer Funktion f bei Eingabe x? – Ist die durch einen λ-Term f beschriebene Funktion total – Gehört ein Wert y zum Wertebereich einer Funktion f ? – Berechnet die Funktion f bei Eingabe von x den Wert y – Verhalten sich zwei λ-berechenbare Funktionen gleich? Man kann nicht einmal für alle gleichen λ-Terme einen Gleichheitsbeweis finden Das Hauptproblem ist dabei die Gleichheit nichtterminierender λ-Terme • Beweis kann direkt im λ-Kalkül geführt werden – Umweg über Berechenbarkeitstheorie mit Church’scher These, Gödelnummern, utm- oder smn-Theorem ist nicht erforderlich AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 29 λ-Kalkül Das Halteproblem Terminierung von λ-Termen ist unentscheidbar • Beweis stützt sich auf wenige Erkenntnisse – λx.x terminiert mit Normalform λx.x – ⊥ = Y(λx.x) terminiert nicht, da Y(λx.x) = (λx. x x) (λx. x x) – Die Boole’schen Wahrheitswerte sind verschieden: T 6= F • Einfacher Widerspruchsbeweis – Wir nehmen an, Terminierung von λ-Termen sei entscheidbar ( T falls t terminiert d.h. es gibt einen λ-Term h mit h(t) = F sonst – Definiere d = λx. if h(x) then ⊥ else λx.x. – Dann h(Yd) = ( h(d(Y d)) = h(if h(Y d) then ⊥ else λx.x) h(⊥) = F, falls h(Yd) = T also h(Y d) = h(λx.x) = T, falls h(Yd) = F – Dies ist ein Widerspruch, also ist das Halteproblem nicht entscheidbar AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 30 λ-Kalkül λ-Kalkül – Grenzen • Vielseitige, ausdrucksstarke Sprache – Klares Berechenbarkeitsmodell – Wenige Vorgaben für formales Schließen – Mengentheoretische Semantik extrem kompliziert (domain theory) • Unkontrolliert: Kein Schließen über Datentypen möglich – Wann gehört ein Objekt zu einem bestimmten Datentyp? – Welche Struktur hat der Datentyp eines Objekts? – Welche Eigenschaften hat ein Programm? • Erweiterung von Semantik / Inferenzsystem nötig – Beschränke Freiheit der λ-Terme durch Präzisierung ihrer Eigenschaften – Wähle Datentypen als Beschreibung von Programmeigenschaften ⇓ Typentheorie AUTOMATISIERTE L OGIK UND P ROGRAMMIERUNG 31 λ-Kalkül