ALP I Rekursive Funktionen WS 2009/2010 Prof. Dr. Margarita Esponda Prof. Dr. Margarita Esponda 1 Äquivalenz vieler Berechnungsmodelle Effektiv Berechenbare Funktionen Mathematische Modelle λ-Kalkül Maschinelle Modelle Register Maschinen TuringMaschine ALP II Theoretische Informatik I Prof. Dr. Margarita Esponda Kombinatorische Logik Allgemein rekursive Funktionen µ-rekursive Funktionen WhileProgramme GOTOProgramme 2 Primitiv-rekursive Funktionen Alle Beispiele, die wir in den letzten zwei Vorlesungen diskutiert haben, sind Beispiele aus der Menge der sogenannten primitiv-rekursiven Funktionen PR. Die primitiv-rekursiven Funktionen sind die einfachste Klasse von rekursiven Funktionen. Die PR-Funktionen sind eine Untermenge der Effektiv Berechenbaren Funktionen. Das bedeutet, es gibt rekursive Funktionen, die berechenbar sind aber nicht primitiv-rekursiv sind. Prof. Dr. Margarita Esponda 3 Primitiv-rekursive Funktionen Motiviert von D. Hilbert haben vor allem K. Gödel (1906-1978) und Rózsa Péter (1905-1977) sich mit der Theorie der rekursiven Funktionen auseinandergesetzt sowie diese stark geprägt. Was kann alles mit primitiv-rekursiven Funktionen berechnet werden? Gibt es ein allgemeines Schema zur Definition beliebiger berechenbarer Funktionen? Prof. Dr. Margarita Esponda 4 Primitiv-rekursive Funktionen (PR) Das Schema zur Definition beliebiger primitivrekursiver Funktionen besteht aus folgenden drei Hauptteilen: 1. Eine Reihe von Grundfunktionen. 2. Ein Ersetzungsmechanismus zur Definition von Funktionen ohne Rekursion (Funktionskomposition). 3. Ein Mechanismus zur Definition von primitivrekursiven Funktionen mit Rekursion (PR). Prof. Dr. Margarita Esponda 5 Primitiv-rekursive Funktionen (PR) Die Klasse der PR-Funktionen ℕn → ℕ wird wie folgt induktiv definiert. I Grundfunktionen 1. Die Nullfunktion Z : ℕm→ ℕ ist primitiv rekursiv m Z (x1,…,xm) = 0 2. Die Nachfolgerfunktion S : ℕ → ℕ ist primitiv rekursiv S(n) = n+1 3. Die Projektionsfunktionen πmi : ℕ m →ℕ definiert durch πmi (x1, … ,xi, … ,xm) = xi, 1≤ i ≤ m sind primitiv-rekursiv Beispiel: Prof. Dr. Margarita Esponda π3 (a, b, c) = b 2 6 Primitiv-rekursive Funktionen (PR) II Kompositionsschema Die Funktionskomposition ist primitiv-rekursiv. Das bedeutet, für alle primitiv-rekursiven Funktionen h : ℕm→ ℕ und g1, … , gm : ℕn→ ℕ ist die Funktion C : ℕn→ ℕ, ℕ definiert durch C ( x1,...,xn ) = h(g1( x1,...,xn ),…, gm( x1,...,xn )) auch primitiv rekursiv. Prof. Dr. Margarita Esponda 7 Primitiv-rekursive Funktionen III Rekursionsschema Jede Funktion, die sich durch primitive Rekursion (Induktion) aus primitiv-rekursiven Funktionen definieren lässt, ist auch primitivrekursiv. Das bedeutet: m m+2 Wenn g : ℕ → ℕ und h : ℕ → ℕ primitiv-rekursive Funktionen sind, dann ist die folgende (induktiv definierte) m+1 Funktion R : ℕ →ℕ R (0, x1,...,xm) = g(x1,...,xm) R (S(n), x1,...,xm) = h( R(n, x1,...,xm), n, x1,...,xm ) ebenfalls primitiv rekursiv. Prof. Dr. Margarita Esponda S = Nachfolgerfunktion 8 Primitiv-rekursive Funktionen Eine konstante Funktion, die eine beliebige Zahl n in der Konstante 3 abbildet, sieht wie folgt aus: k3 : ℕ → ℕ k3 ( m ) = S(S(S(Z(m)))) = 3 Die Identitätsfunktion kann wie folgt definiert werden: id : ℕ → ℕ id ( m ) = Prof. Dr. Margarita Esponda π1 (m) 1 = m 9 Primitiv-rekursive Funktionen Können wir die Additionsfunktion auf eine Definition, die nur aus primitiv-rekursiven Funktionen besteht, zurück führen? 2 add : ℕ → ℕ g und h müssen primitiv-rekursiv sein aus III (Rekursionsschema) add ( 0, m ) = g(m) add ( S(n), m ) = h(add (n, m), n, m) add ( 0, m ) = add ( S(n), m ) = π1 (m) S(π3 (add (n, m), n, m)) add 0 m = add (n+1) m = Prof. Dr. Margarita Esponda 1 1 m (add n m) +1 10 Primitiv-rekursive Funktionen Vorgänger-Funktion: pred : ℕ → ℕ Weil die primitiv-rekursiven Funktionen nur über die natürlichen Zahlen definierbar sind, wird der Vorgänger von 0 als gleich 0 definiert. aus III (Rekursionsschema) pred ( 0 ) = g () pred ( S(n) ) = h (pred (n, m), n) pred ( 0 ) = Z() pred ( S(n) ) = pred 0 = 0 pred (n+1) = n Prof. Dr. Margarita Esponda π2 (pred (n), n )) 2 11 Primitiv-rekursive Funktionen Die Multiplikation kann rekursiv über die Addition definiert werden. mult ( 0, m ) = mult ( S(n), m ) = mult ( 0, m ) g(m) h (mult (n, m), n) = Z(m) mult(S(n), m) = add (π1 (mult(n, m),n,m), 3 π3(mult (n,m),n,m)) 3 mult 0 m mult (n+1) m Prof. Dr. Margarita Esponda = 0 = (mult n m) + m 12 Primitiv-rekursive Funktionen Eine primitiv-rekursive Definition der Subtraktion sieht wie folgt aus: sub m 0 = m sub m n = pred (sub m (pred n) sub 2 1 => pred (sub 2 (pred 1)) => pred (sub 2 0) => pred 2 => 1 sub (0, m ) = sub 1 2 => pred (sub 1 (pred 2)) => pred (sub 1 1) => pred (pred (sub 1 0)) => pred (pred 1) => pred 0 => 0 π1(m) 1 sub (S(n), m) = pred (π1 (sub(n, m),n,m)) 3 Prof. Dr. Margarita Esponda 13 Primitiv-rekursive Funktionen Haskell-Implementierung: -- Null-Funktion z :: [Integer] -> Integer z [x] = 0 -- Nachfolger-Funktion s :: [Integer] -> Integer s [x] = x+1 -- Projektion-Funktionen p :: Integer -> [Integer] -> Integer p 1 (a:b) = a p n (a:b) = p (n-1) b Prof. Dr. Margarita Esponda 14 Primitiv-rekursive Funktionen Haskell-Implementierung: type Func = ([Integer]->Integer) -- Kompositionsschema compose :: Func -> [Func] -> [Integer] -> Integer compose h gs xs = h [ g xs | g <- gs ] -- Rekursionsschema pr :: Func -> Func -> Func -> [Integer] -> Integer pr rec g h ( 0 :xs) = g xs pr rec g h ((y+1):xs) = h ( (rec (y:xs)):y:xs ) Prof. Dr. Margarita Esponda 15 Primitiv-rekursive Funktionen Beispiele: -- Predecessor pred :: [Integer] -> Integer pred = pr pred (const 0) (p 2) -- Addition add :: [Integer] -> Integer add = pr add (p 1) (compose s [(p 1)]) -- Multiplication mul :: [Integer] -> Integer mul = pr mul z (compose add [(p 1),(p 3)]) Prof. Dr. Margarita Esponda 16