Funktionale Programmierung ALP I Kombinatorische Logik (CL) WS 2012/2013 Prof. Dr. Margarita Esponda Prof. Dr. Margarita Esponda Funktionale Programmierung Äquivalenz vieler Berechnungsmodelle Alonzo Church λ-Kalkül Kombinatorische Logik Alan Turing Turing-Maschine Mathematische Präzisierung µ-rekursive Funktionen Effektiv Berechenbare Funktionen RegisterMaschinen Prof. Dr. Margarita Esponda GOTOBerechenbar WHILEBerechenbar Moderne Programmiersprachen mit unendlichem Speicher Funktionale Programmierung Kombinatorische Logik (CL) Eingeführt von Moses Schönfinkel und Haskell Brooks Curry Prof. Dr. Margarita Esponda Funktionale Programmierung Kombinatorische Logik (CL) • ein noch einfacheres Berechnungsmodell • Variation des λ-Kalküls, indem λ-Abstraktionen mit Kombinatoren ersetzt werden • Kombinatoren sind primitive Funktionen ohne freie Variablen • die kombinatorische Logik wird oft als Grundlage für die Implementierung von nicht-strikten funktionalen Programmiersprachen verwendet. Prof. Dr. Margarita Esponda Funktionale Programmierung Was sind Kombinatoren? Motivation an der Tafel … Prof. Dr. Margarita Esponda Funktionale Programmierung Kombinatoren Ein Kombinator ist eine primitive Funktion (LambdaAusdruck) ohne freie Variablen. Ti ist ein Kombinatorischer Term wenn: 1) Ti ein Kombinator ist 2) (T1 T2) (Funktionsapplikation), wenn T1 und T2 wiederum Kombinatorische Terme sind. Prof. Dr. Margarita Esponda Funktionale Programmierung SKI-Kombinatoren I-Kombinator • oder Identitätskombinator • einfachster Kombinator • für den Identitätskombinator gilt: (I a) = a Die Lambda-Funktion Prof. Dr. Margarita Esponda λx.x ≡ I Funktionale Programmierung SKI-Kombinatoren K-Kombinator • oder Kanzellator • gibt immer eine konstante Funktion als Ergebnis • für den K-Kombinator gilt: (K a x) = a Die Lambda-Funktion Prof. Dr. Margarita Esponda λxy.x ≡ K Funktionale Programmierung SKI-Kombinatoren S-Kombinator • modelliert eine Verallgemeinerung der Funktionsapplikation • für den S-Kombinator gilt: (S x y a) = (x a (y a)) Die Lambda-Funktion λxya.xa(ya) Prof. Dr. Margarita Esponda ≡ S Funktionale Programmierung SKI-Kombinatoren Beispiele an der Tafel … Prof. Dr. Margarita Esponda Funktionale Programmierung Vollständigkeit der SKI-Kombinatoren Die Vollständigkeit ist gegeben, wenn es eine Transformationsfunktion gibt, die einen beliebigen λ-Ausdruck in einen Ausdruck, der nur SKIKombinatoren beinhaltet, verwandeln kann. T[x] => x T[λx.x] => I T[λx.E] => (K T[E]) wenn x nicht frei in E T[λx.(E1 E2)] => (S T[λx.E1] T[λx.E2]) T[λx.λy.E] => T[λx.T[λy.E]] falls x freie Variable von E T[(E1 E2)] => (T[E1] T[E2]) Prof. Dr. Margarita Esponda Funktionale Programmierung Vollständigkeit der SKI-Kombinatoren -- Transformationsfunktion transform I = I transform K = K transform S = S transform (Var x) = Var x transform (App x y) = App (transform x) (transform y) transform (Lambda x y) = (eliminate x y) Prof. Dr. Margarita Esponda Funktionale Programmierung Vollständigkeit der SKI-Kombinatoren eliminate x S eliminate x K eliminate x I = App K S = App K K = App K I eliminate x exp | not(element x (freie exp [])) = (App K (transform exp)) eliminate x (Var y) | x==y =I | otherwise = (App K (Var y)) eliminate x (Lambda y z) = eliminate x (eliminate y z) eliminate x (App y z) = (App (App S (eliminate x y)) (eliminate x z)) Prof. Dr. Margarita Esponda Funktionale Programmierung SKI-Kombinatoren Weiter geht es an der Tafel . . . Prof. Dr. Margarita Esponda