Der untypisierte Lambda-Kalkül als Programmiersprache
|
|
|
- Minna Abel
- vor 9 Jahren
- Abrufe
Transkript
1 Proseminar: Programmiersprachen bei Prof. Tobias Nipkow Der untypisierte Lambda-Kalkül als Programmiersprache von Benjamin Peherstorfer betreut von Prof. Tobias Nipkow 23. November 2006
2 Inhaltsverzeichnis 1 Grundlagen des untypisierten Lambda-Kalküls Definition der Terme Notation Gültigkeitsbereich von Variablen Substitution α-konversion β-reduktion β-redex β-reduktion β-normalform Eigenschaften der β-reduktion Reduktionsstrategien Currying Lambda-Kalkül als Programmiersprache Church Booleans Paare und Listen Church Numerale Rekursive Funktionen Fixpunkte Darstellung rekursiver Funktionen Beispiel Berechenbare Funktionen auf N
3 1 Grundlagen des untypisierten Lambda-Kalküls 1.1 Definition der Terme Defintion (Terme des Lambda-Kalküls) In seiner reinsten Form existieren im Lambda- Kalkül nur drei Sorten von Termen die wie folgt festgelegt werden können: t ::= x (λx.t) (t 1 t 2 ), wobei x Element aus einer mindestens abzählbar-unendlichen Menge von Variablen ist. Der Term (λx.t) wird als Abstraktion und der Term (t 1 t 2 ) als Applikation bezeichnet. Die Abstraktion repräsentiert die Funktion, d.h. die Variable x wird als Paramter aufgefasst, während t den Funktionsrumpf darstellt. Die Applikation ist der Funktionsaufruf mit Funktion t 1 und Argument t 2. Identitätsfunktion: (λx.x). Eine Funktion die immer die Identitätsfunktion zurück gibt: (λx.(λy.y)). Von dieser Defintion ausgehend können nun Methoden für den Umgang mit Lambda-Termen entwickelt werden. Dies soll in den restlichen Abschnitten dieses Kapitels geschehen. 1.2 Notation Konventionen Im Allgemeinen werden a, b, c, x, y, z für Variablen und l, m, n, s, t, u, v, w für Lambda-Terme verwendet. Im zweiten Teil dieser Arbeit, wo der Lambda-Kalkül als Programmiersprache verwendet wird, mögen Abweichungen auftreten. Effiziente Klammerung Die Definition der Lambda-Terme bringt exzessive Klammerung mit sich. Die meisten können jedoch durch folgende Vereinbarungen eingespart werden. a) Die Applikation ist linksassoziativ, d.h. (t 1 t 2... t n ) (... (t 1 t 2 )t 3 )... t n ) b) Die Abstraktion ist rechtsassoziativ, sie bindet so weit nach rechts wie möglich: (λx.(λy.(xy))) (λx.λy.xy). c) Innere Punkte und Lambdas können weggelassen werden: λx 1 x 2 x 3... x n.t λx 1.λx λx n.t d) Äußere Klammern werden weggelassen:(λx.t) λx.t und (t 1... t n ) t 1... t n. (i) λxyz.zyx (λx.(λy.(λz.((zy)x)))) (ii) λxx.x(xx) (λx.(λx.(x(xx)))) (iii) λxy.x (λx.(λy.(x))) 1.3 Gültigkeitsbereich von Variablen Dieser Abschnitt soll den Gültigkeitsbereich (scope) einer Variable klären. 3
4 (Informelle) Definition Eine Variable x wird durch eine Abstraktion λx.t gebunden wenn sie im Term t dieser Abstraktion vorkommt. Andernfalls ist sie frei. Wichtig dabei ist, dass eine Variable x durch das erste λx oberhalb von x gebunden wird. (i) λx.x, x ist gebunden (ii) λy.xy, x ist frei, y ist gebunden (iii) λx.xx, x ist gebunden (iv) (λxy.xy)x, x in () ist gebunden, das äußere rechte x nicht. Die Variable y ist gebunden (v) xλz.(xλa.azy), x, y sind frei, z, a gebunden. Formale Definition Formal kann die Menge der freien Variablen als Funktion definiert werden. F V : Term Menge von Variablen F V (x) = {x} F V (s t) = F V (s) F V (t) F V (λx.t) = F V (t)\{x} Kombinator Besitzt ein Term t keine freien Variablen wird er Kombinator genannt. Der Term ist dann geschlossen. 1.4 Substitution Schreibweise: Die Substitution von t für x in s wird als s[t/x] geschrieben und als s mit t für x gesprochen. Bei der Substitution wird klar, dass die Unterscheidung zwischen freien und gebundenen Variablen äußerst wichtig ist. Probleme treten auf wenn man versucht (a)eine gebundene Variable zu ersetzen oder (b)durch Ersetzungen, freie Variablen plötzlich zu gebundenen werden. (i) Zu (a): ersetze Variable x durch Variable y in λx.x. Ergebnis: λx.y. Dies entspricht jedoch nicht mehr der Identität und ist daher falsch! (ii) Zu (b): Man geht von dem Term λx.y aus und ersetzt die freie Variable y durch x und erhält die Identität λx.x. Aber λx.y λx.x. Es gibt mehrere Ansätze die Substitution zu definieren. Hier wird nur der ursprüngliche Ansatz von A. Church verfolgt, für weitere wird auf [Han04] verwiesen. Definition (1) Die Subsitution wird rekursiv definiert durch: x[t/x] = t (2) y[t/x] = y falls y x (3) (s 1 s 2 )[t/x] = (s 1 [t/x])(s 2 [t/x]) (4) (λx.s)[t/x] = λx.s (5) (λy.s)[t/x] = λy.(s[t/x]) falls x y y F V (t) (6) (λy.s)[t/x] = λz.(s[z/y][t/x]) falls x y z F V (t) F V (s) 4
5 Anmerkungen zur Definition (i) zu (4): hier muss x gebunden sein, da λx ganz außen steht und damit alle x in s bindet. Es darf nicht substituiert werden. (ii) zu(5): Diese Regel darf nur ausgeführt werden wenn y in t gebunden ist. Es können daher keine neuen Bindungen entstehen da es kein freies y in t gibt welches von λy gebunden werden könnte. (iii) zu(6): Ist y in t frei, so könnte eine neue Bindung entsehen. Um dies zu verhindern wird die Variable y in z umbenannt bevor x durch t substituiert wird. (i) λx.yx[x/y] 6 λz.xz (ii) (x λx.x)[y/x] 3 (x[y/x] (λx.x)[y/x]) 1,4 (y λx.x) (iii) (λzy.xx)[y/x] 5 λz.((λy.xx)[y/x]) 6 λz.(λz.((xx)[z/y][y/x])) 3 λz.(λz.(((x)[z/y][y/x]) (x)[z/y][y/x])) 1 λz.(λz.(((x)[y/x] (x)[y/x]))) 1 λz.(λz.yy) λzz.yy (iv) ((λx.zx)(λz.zx))[(yx)/z] 3 ((λx.zx)[(yx)/z](λz.zx)[(yx)/z]) 6,4 6,4 (λz 1.((zx)[z 1 /x][(yx)/z]))(λz.zx) (λz 1.yxz 1 )(λz.zx) 1.5 α-konversion Wie intuitiv klar ist, stehen λx.x und λy.y jeweils für die Identität. Die Substitution wie oben definiert, lässt jedoch solche Änderungen nicht zu. Wann gebundene Variablen in einem Term unbenannt werden dürfen und wie das geschieht, stellt die Definition der α-konversion klar: Definition Die Definition der α-konversion lautet: λx.s α λy.(s[y/x]) falls y F V (s). Die gebundene Variable x darf durch y ersetzt werden, wenn y in s nur gebunden oder gar nicht vorkommt. Die Variable y darf nicht frei vorkommen, sonst würde gelten λx.xy α λy.yy. (i) λxy.yx α λzy.yz α λzx.xz α λyx.xy man schreibt auch kurz λxy.yx = α λyx.xy. (ii) λx.(λx.x)x α λy.(λy.y)y λy.((λy.y) α (λx.x))y λy.(λx.x)y (Es wurde (λx.x) als Teilterm behandelt!) (iii) λx.xy α aber λx.xz α λy.yz. Mit der α-konverison können nun die Regeln für die Subsitution stark vereinfach werden, falls man noch die folgende Konvention einhält: 5
6 Automatisches Umbenennen Damit gebundene Variablen von freien Variablen verschieden sind, werden sie automatisch unbenannt. Dies ist möglich, da (wie in der Definition vorausgesetzt) die Menge der Variablen mindestens abzählbar-unendlich ist. Es wird dadurch vermieden, neue Bindungen zu erschaffen. Das folgende Beispiel soll diese Konvention veranschaulichen: λx.λy.x α λy.λz.y. Vereinfachung der Substitution Regeln (4)-(6) der Substitution fallen weg und werden durch (λx.s)[t/y] = λx.(s[t/y]) ersetzt. Durch die obige Konvention werden gebundene Variablen umbenannt, sollten sie mit freien Variablen kollidieren und so können keine neuen, unerwünschten Bindungen bei der Substitution entstehen. Genau das hätten aber Regel (5) und (6) verhindert und damit sind sie überflüssig. 1.6 β-reduktion Die β-reduktion bietet eine Möglichkeit Lambda-Terme auszuwerten. Bevor jedoch die β- Reduktion selbst definiert wird, muss noch die Gestalt der Terme identifiziert werden, welche man mit der β-reduktion reduzieren kann β-redex Definition Einen Lambda-Term der Form (λx.s)t nennt man β-redex (reducible expression). Ein β-redex besteht also aus einer Abstraktion gefolgt von einem beliebigen Term t β-reduktion Definition Die β-reduktion ist folgend definiert (λx.s)t β s[t/x] Es wird t für den formalen Parameter x in s substituiert. Die β-reduktion ist die wichtigste Regel zum Auswerten von Lambda-Termen. Werden von einem Term zum Ziel-Term mehrere Schritte benötigt, schreibt man auch kurz t 1 * β t 2. Es bezeichnet damit * β die reflexive, transitive Hülle von β. Die Auswertung von Lambda-Termen besteht aus einer Folge von β-reduktionen, möglicherweise unterbrochen von mehreren α-konversionen. (i) (λx.y)z β y (ii) ((λxy.y)z)a β (λy.y)a β a 6
7 (iii) (λxy.xyx)y α (λxy.xy x)y β λy.yy y (iv) (λy.yz)(λx.x) β (λx.x)z β z (v) (λx.xx)(λx.xx) β (λx.xx)(λx.xx) β β-normalform Um drei Eigenschaften der β-reduktion im nächsten Abschnitt zu zeigen, muss vorher noch die β-normalform definiert und untersucht werden. Definition Der Term t 1 ist in β-normalform wenn kein Term t 2 mit t 1 β t 2 existiert. Mit anderen Worten: Ein Term t 1 ist in β-normalform wenn keine weiter β-reduktion mehr möglich ist, d.h. kein β-redex im Term als Subterm 1 existiert. Es stellen sich zwei grundlegende Fragen: (i) Besitzt jeder Lambda-Term eine β-normalform und (ii) ist diese Normalform eindeutig? Frage (i) kann durch das obige Beispiel (v) sofort mit Nein beantwortet werden. Der β-redex (λx.xx)(λx.xx) besitzt keine β-normalform. Könnte man zeigen, dass die β-reduktion konfluent ist, so würde sich auch Frage (ii) klären. Definition Es bezeichne die reflexive, transitive Hülle der Relation. Die reflexive, transitive Hülle der Relation wird als konfluent bezeichnet, wenn für alle Terme t 0, t 1, t 2 mit t 0 t 1 und t 0 t 2 ein Term t 3 existiert mit t 1 t 3 und t 2 t 3. Veranschaulichung: t 0 t 1 t 2 t 3 Betrachtet man t 1 und t 2 als zwei verschiedene β-normalformen von t 0, so müssten sich beide Terme t 1 und t 2 zu t 3 reduzieren lassen, falls die β-reduktion konfluent ist. Lassen sich aber t 1 und t 2 weiter reduzieren, so können sie keine β-normalformen von t 0 sein. Es ist daher nur noch die leere Reduktion möglich. Dann folgt jedoch t 1 = t 2. Ist daher die β-reduktion konfluent, existiert maximal eine β-normalform eines beliebigen Terms. Wie [Nip04] zeigt, ist die β-reduktion konfluent und damit ist die Normalform eines Terms bzgl. der β-reduktion eindeutig, falls sie existiert Eigenschaften der β-reduktion Die Haupteigenschaften der β-reduktion sind (i) nicht terminierend (siehe Beispiel (v) oben). 1 Für die Definition von Subterm siehe [Nip04]. 7
8 (ii) Konfluenz: jeder Term hat höchstens eine β-normalform. (iii) nicht-deterministisch, wie folgendes Beispiel zeigt ((λy.y)x) (λx.x)((λy.y)x) β β x β (λx.x)x β 1.7 Reduktionsstrategien Die β-reduktion ist nicht-deterministisch, d.h. es führen oft mehrere Weg zur Normalform, falls sie existiert. Eine Reduktionsstrategie legt fest, welcher Term als nächstes reduziert wird. Dass dies nicht unerheblich ist, soll das nächste kurze Beispiel zeigen: (λz.x)((λx.xx)(λx.xx)) (λz.x)((λx.xx)(λx.xx))... x Full β-reduction Diese Strategie erlaubt das Reduzieren jedes Redexes zu jeder Zeit. Normal Order Strategy Es wird immer der am weitesten links stehende Redex reduziert. Call by Name Strategy Arbeitet wie Normal Order Strategy nur lässt diese Auswertungsstrategie keine Reduktionen innerhalb einer Abstraktion zu. So kann z.b. (λx.((λy.y)z)) unter Call by Name nicht weiter reduziert werden. Unter Normal Order Strategy reduziert sich das Beispiel jedoch zu λx.z. Call by Value Strategy Eine Strategie die nur eine Reduktion von den äußersten Redexes zulässt und auch nur dann, wenn die rechte Seite des Redexes bereits so weit wie möglich reduziert wurde. Mit Call by Value lässt sich (λx.x)((λx.x)z) nicht reduzieren. Das Beispiel ergibt unter Call by Name z. 1.8 Currying Durch die schlichte Definition des Lambda-Kalküls, sind nur einstellige Funktionen zugelassen. Dies bringt jedoch keinen Nachteil mit sich, da jede mehrstellige Funktion durch mehrere, ineinander verschachtelte Funktionen dargestellt werden kann. Dies nennt man Currying (nach Haskell Curry) oder auch Schönfinkeln (nach Moses Schönfinkel). Es soll die Funktion g : N N N, (x, y) x + y durch einen Lambda-Term dargestellt werden. Dazu wird eine Funktion definiert die ein Argument x entgegennimmt und als Resultat eine Funktion liefert die ein Argument y entgegennimmt und zu x addiert. Die Funktion g wäre daher λx.(λy.(x + y)) 2. 2 Es handelt sich hier nicht um einen gültigen Lambda-Term, da das Zeichen + undefiniert ist. 8
9 2 Lambda-Kalkül als Programmiersprache 2.1 Church Booleans Das Konstrukt einer Fallunterscheidung umfasst nicht nur die If-Abfrage selbst sondern es muss auch geklärt werden was true bzw. false eigentlich ist, d.h. welchem Term true und false entspricht. Die Fallunterscheidung ist ein Konstrukt der Form if t then v else w. Im Lambda-Kalkül wird die Auswahl des richtigen Zweiges nicht durch das if getroffen, sondern durch den Wahrheits-Term. Den true- bzw. false-termen wird daher der then- und der else-zweig übergeben. Die Entscheidung welcher zurückgegeben wird, liegt am Wahrheits-Term selbst. Es soll also gelten true vw = v und false vw = w. Definition Man definiert true und false daher wie folgt true λx.λy.x false λx.λy.y Damit man ein Konstrukt der üblichen if t then v else w -Form hat, muss noch ein Term erstellt werden, der die beiden Terme v und w auf den Wahrheits-Term anwendet. Definition Ein Term test soll daher sowohl test true ab = a als auch test false ab = b erfüllen. Man definiert daher test wie folgt: test λl.λm.λn.lmn (i) test true vw (λlmn.lmn) true vw β (λmn. true mn)vw * β true vw (λx.λy.x)vw * β v (ii) test false vw * β false vw * β w Mit den oben definierten Wahrheits-Termen können auch die logischen Operatoren and, or und not definiert werden: (i) and λxy.xy false (ii) or λxy.x true y (iii) not λx.x false true 2.2 Paare und Listen Ein Paar verwaltet zwei Elemente, indem auf Wunsch entweder das erste oder das zweite Element zurückgegeben wird. Es sollen daher folgende Beziehungen zwischen den drei Termen pair, fst, snd gelten: fst(pair ab) = a snd(pair ab) = b Motiviert durch die geforderten Eigenschaften von pair, fst und snd ergibt sich folgende Definition. 9
10 Definition Der Term pair wendet einen noch zu übergebenden Boolean auf zwei Terme an. Es wird so je nach Wahrheitswert des Boolean entweder das erste oder das zweite Element bzw. Term zurückgegeben. Die Funktionen fst und snd übergeben lediglich diesen Boolean. pair λx.λy.λz.zxy fst λp.p true snd λp.p false Beispiel snd pair st * β snd(λz.zst) β(λz.zst)(λxy.y) β false st * β t. Verschachtelt man Paare ineinander, so entsteht eine Liste: pair a(pair b(pair c nil)) (λz.za(λz.zb(λz.zc nil))) Die Liste beinhaltet drei Element(a,b,c). Das Ende wird mit nil gekennzeichnet. Es ist jedoch noch nicht klar welchem Term nil entspricht und wie das Ende der Liste erkannt werden kann. Es sind daher zwei Terme nil und null gesucht, die sich folgend verhalten: Man definiert dazu: null nil = true null(pair a nil) = false nil λx. true Markiert das Ende der Liste. null λx.x(λyz. false) Prüft ob das Ende der Liste erreicht ist. Folgendes Beispiel soll die Sinnhaftigkeit der Definitionen von nil und null verdeutlichen: null nil (λx.x(λyz. false))(λx. true) β β (λx. true)(λyz. false) β true null(pair a nil) (λx.x(λyz. false))(pair a nil) β β (pair a nil)(λyz. false) β (λyz. false)a nil * β false Die Bedeutung von fst für Listen ändert sich nicht, wobei man überlicherweise im Zusammenhang mit Listen von head spricht. Die Bedeutung des snd-terms wird zu tail. 2.3 Church Numerale Dieser Abschnitt soll die Natürlichen Zahlen einführen, die durch die Church Numerale repräsentiert werden. Die Natürlichen Zahlen können wie folgt veranschaulicht werden: Die Menge der Natürlichen Zahlen besteht aus der Null 3, dem Nachfolger der Null, dem Nachfolger des Nachfolgers der Null usw. Definition Man definiert daher die Natürlichen Zahlen (die Church Numerale genannt werden) durch die oben beschriebene Vorschrift. 0 λsz.z 1 λsz.sz 3 Soll die Null kein Element der Natürlichen Zahlen sein, so kann man auch mit Eins beginnen 10
11 2 λsz.s(sz). n λsz.s(s(... (sz)... ) λsz.s n z Durch Church Numerale ist es möglich Iterationen als Lambda-Term darzustellen. Wie man aus der Definiton erkennt gilt nfa = λsz. s(s(... (s z)... )fa was f(f(... (f(a)... ) entspricht. }{{}}{{} n mal n mal Der Term a stellt also den Anfangszustand dar, während f die Zustandsänderungsfunktion ist. Durch das Church Numeral n wird bestimmt, wie oft iteriert werden soll. Die iszero-funktion Für iszero muss gelten iszero 0 = true und für alle Church Numerale n mit n 0 iszero n = false. Wie oben erwähnt, kann man nfa als Schleife deuten, wobei n ein Church Numeral ist. Im Falle der iszero-funktion ist f (λy. false) und a true. Wird der iszero-funktion das Church Numeral 0 übergeben so wird die Schleife nicht durchlaufen, sondern sofort der Anfangszustand(a) zurückgegeben. Ist n 0 wird die Schleife mindestens einmal durchlaufen. Die Zustandsänderungsfunktion macht aber nichts anderes als den vorhergehenden Wert wegzuwerfen und false zurückzugeben. Es ergibt sich iszero λn.n(λx. false) true. Die succ-funktion Es sei n ein beliebiges Church Numeral. Für die succ-funktion muss gelten succ n = n + 1. Der Term succ λnsz.s(nsz) erfüllt diese Bedingung: succ n (λnsz.s(nsz))n β λsz.s(nsz) λsz.(s((λsz. s(s(... (s z)... )))sz)) }{{} * β λsz.s(s(s(... (s z)... ))) }{{} n mal n mal λsz. s(s(s... (s z)... )) }{{} n + 1 n+1 mal Die Predecessor-Funktion Die Funktion pred ist eine Vorgängerfunktion. Für sie gilt pred(n + 1) = n und pred 0 = 0. Um sie zu realisieren kann man auf das Konzept der Paare zurückgreifen. Man betrachtet ein Paar (p 1,p 2 ) und eine zugehörige Funktion h, die das Paar (p 1,p 2 ) zu (p 2, p 2 +1) ändert. Nach n-maliger Iteration erhält man an der ersten Position des Paares den Vorgänger von n. Für die Funktion h ergibt sich daher h λp.(pair(p false)(succ(p false))) Aus dem Paar p wird das zweite Element entnommen und als erstes Element in ein neues Paar eingefügt. Das zweite Element des neuen Paares ist der Nachfolger des zweiten Elements des ersten Paares. Es muss jetzt lediglich noch iteriert werden, was, wie oben gezeigt durch Church Numerale möglich ist: pred = λn.nh(pair 00). Am Ende der Reduktion steht dann im ersten Element der Vorgänger von n. Dieser muss noch durch einen geeigneten Wahrheitswert herausgefiltert werden und es ergibt sich schließlich pred (λn.nh(pair 00)) true oder pred (λn.n(λp.(pair(p false)(succ(p false))))(pair 00)) true 11
12 Arithmetik mit Church Numeralen Dazu sind folgende Terme nützlich. Mit Church Numeralen kann auch gerechnet werden. (i) add nm = n + m: add λnmsz.ns(msz) oder add λnm.n succ m Nachweis: add nm * β λsz.ns(msz) λsz.((λsz.sn z)s((λsz.s m z)sz)) * β λsz.((λz.sn z)(s m z)) β β λsz.s n s m z λsz.s n+m z n + m (ii) sub nm = n m: sub λnm.m pred n Nachweis: sub nm * β m pred n * β pred(pred(... pred(n)... ) predm n n m (iii) mult nm = n m: mult λnms.n(ms) Nachweis: mult nm * β λs.((λsz.sn z)(λz.s m z)) β λs.λz.((λz.s m z) n z) λsz.((λz.s m z)((λz.s m z)... ((λz.s m z)z)... ) * β λsz.(sm ) n z n m (iv) exp nm = m n : expt λnm.nm Nachweis: exp nm (λsz.s n z)(λsz.s m z) * β λz.(((λsz.sm z)((λsz.s m z)... ((λsz.s m z) z)... ) }{{} β n mal β λz.((λsz.s m z)((λsz.s m z)... ((λz 1.z m z 1 )... ) β β λz.((λsz.s m z)((λsz.s m z)... ((λz 2.((λz 1.z m z 1 ) m z 2 ))... ) β β λz.((λsz.s m z)((λsz.s m z)... ((λz 2.(z(z(... (z z }{{} 2 )... ) * β m m mal * β λzz n. z(z(z(z(z(z(z(z(... (z z }{{} n )... ) m n m} m {{ m mal } n mal (i) add 21 (λnmsz.ns(msz))(λsz.s(sz))(λsz.sz) * β λsz.((λsz.s(sz))s(sz)) β β λsz.((λz.s(sz))(sz)) β λsz.(s(s(sz))) 3 Schleife (ii) sub 32 * β 2 pred 3 {}}{ pred(pred 3) = 1 (ii) mult 22 (λnms.n(ms))(λsz.s(sz))(λsz.s(sz)) * β λs.((λsz.s(sz))(λz.s(sz))) β β λs.(λz.((λz.s(sz))((λz.s(sz))z))) β λs.(λz.((λz.s(sz))(s(sz)))) β β λs.(λz.(s(s(s(sz))))) λsz.s(s(s(sz))) (iii) exp 22 (λsz.s(sz))(λsz.s(sz)) β λz.((λsz.s(sz))((λsz.s(sz))z)) α β α β λz.((λsz.s(sz))(λz 1.z(zz 1 ))) α β λz.(λz 2.((λz 1.z(zz 1 ))((λz 1.z(zz 1 ))z 2 ))) β β λz.(λz 2.((λz 1.z(zz 1 ))(z(zz 2 )))) β λz.(λz 2.(z(z(z(zz 2 ))))) 4 12
13 2.4 Rekursive Funktionen Fixpunkte Definition Ein Element x heißt Fixpunkt von f, falls gilt f(x) = x. Im Lambda-Kalkül wird ein Term t Fixpunkt von s genannt, falls gilt st = t. Überraschend mag nun sein, dass es zu jedem Term s mindestens einen Fixpunkt gibt. In manchen Fällen sind die Fixpunkte sofort ersichtlich, wie für die Identität λx.x, für die jeder Term ein Fixpunkt ist. Um jedoch einen Fixpunkt für jeden beliebigen Term zu konstruieren, benötigt man Fixpunktoperatoren. Definition Ein Fixpunktoperator Y ist ein Term, der für jeden beliebigen Term s die Gleichung Y s = s(y s) erfüllt, d.h. Ys ist ein Fixpunkt von s. Bis jetzt ist noch nicht bekannt, ob sich Fixpunktoperatoren im reinen Lambda-Kalkül definieren lassen. Dass es funktioniert zeigen, die Lösungen von A. Church und A. Turing. Churchscher Fixpunktoperator Es sei V f λx.f(xx) und Y λf.v f V f, dann heißt Y Churchscher Fixpunktoperator. Im folgenden wird gezeigt, dass es sich tatsächlich um einen Fixpunktoperator handelt: Y t β V t V t β t(v t V t ) β t(λt.(v t V t ))t β t(y t) Turingsche Fixpunktoperator einen Fixpunktoperator: Es sei A λxf.f(xxf) und Θ AA. Es handelt sich um Darstellung rekursiver Funktionen Θt β AAt β (λf.f(aaf))t β t(aat) t(θt) Rekursive Funktionen rufen sich im Funktionsrumpf selbst wieder auf. Dazu muss jedoch die zu definierende Funktion im Funktionsrumpf bereits bekannt sein. Da im Lambda-Kalkül nur anonyme Funktionen existieren, ist dies nicht möglich. Es muss daher ein Weg gefunden werden, der es erlaubt, rekursive Funktion durch nicht-rekursive darzustellen. Man betrachte dazu das Beispiel der folgenden Funktion zur Berechnung der n-ten Fakultät: f = λn.(test(iszero n)1(mult n(f(pred n)))) Die Variable f ist nicht definiert und daher führt die Funktion nicht zum gewünschten Ergebnis. Durch β-expansion ergibt sich f = (λf n.(test(iszero n)1(mult n(f(pred n))))) f }{{} F Man erhält die nicht-rekursive Funktion F. Um die rekursive Funktion f zu simulieren, muss man statt f immer wieder F selbst substituieren. Die Funktion F setzt sich nämlich dann, an der Stelle f immer wieder selbst fort, wobei genau das, das Ziel der rekursiven Funktion f war. Die Lösung bietet ein Fixpunktoperator (wie oben eingeführt). Da für einen Fixpunktoperator fix und einem beliebigen Term t gilt fix t = t(fix t) erhält man 13
14 fix F = F (fix F ) = F (F (fix F )) = F (F (F (fix F ))) =.... Die rekursive Funktion f entspricht daher fix F. Diese Vorgehensweise ist nicht auf die Funktion f des Beispiels beschränkt. Da nirgends explizit auf die Gesalt von f Bezug genommen wurde, lässt sich der Vorgang für jede rekursive Funktion durchführen Beispiel Die Fibonacci-Folge: Definition: F 0 = 0 F 1 = 1 F n = F n 1 + F n 2 Lambda-Kalkül-ähnliche Definition: fib = λn. (test (iszero n) 0 ( test (iszero pred n) 1 ( add (fib pred n) (fib (pred (pred n)))) ) ) Die Defintion des fib-terms ist rekursiv. Der Term muss daher in eine nicht-rekursive Darstellung gebracht werden. fib = λfn.(test(iszero n)0(test(iszero pred n)1(add(f pred n)(f(pred(pred n)))))) Mit dem Fixpunktoperator fix ergibt sich: fib = fix fib fib 2 = fix fib 2 * β fib (fix fib ) 2 * β (test(iszero 2)0(test(iszero 1)1(add((fix fib )1)(fix fib )0))) * β (add(fib (fix fib )1)(fib (fix fib )0)) * β (add (test(iszero 1)0(test(iszero 0)1(add((fix fib )0)((fix fib )0)))) ((test(iszero 0)0(test(iszero 0)1(add((fix fib )0)((fix fib )0)))))) * β (add 10) * β Berechenbare Funktionen auf N Sowohl A. Church als auch A. Turing beschäftigen sich mit der Frage, welche Funktionen berechenbar sind. Es entstand die Church-Turing-These welche lautet: Alle vom Menschen berechenbaren Funktionen, können auch mit einer Turingmaschine berechnet werden. Kann im Lambda-Kalkül eine Funktion berechnet werden, so nennt man sie λ-defnierbar. Definition Eine Funktion f : N n N heißt λ-definierbar, wenn es einen geschlossenen reinen λ-term t gibt, für welchen gilt: (i) t m 1... m n * β m, falls f(m 1... m n ) = m, 14
15 (ii) t m 1... m n besitzt keine β-normalform, falls f(m 1... m n ) undefiniert ist. Sowohl Turing als auch Church haben gezeigt, dass alle Turingmaschinen-berechenbaren Funktionen λ-definierbar sind, und umgekehrt. Es ist also zu Recht vom allmächtigen Lambda- Kalkül zu sprechen! Literatur [Han04] Chris Hankin. An Introduction to Lambda Calculi for Computer Scientists. King s College Publ., [KK06] Martin Kreuzer and Stefan Kühling. Logik für Informatiker. Pearson Studium, [Met01] André Metzner. Einführung in den λ-kalkül [Nan99] Sebastian Nanz. Lambda-Kalkül als Programmiersprache [Nip04] Tobias Nipkow. Lambda-Kalkül [Pie02] Benjamin C. Pierce. Types and Programming Languages. MIT Press, [Wen05] Felix Weninger. Der untypisierte Lambda-Kalkül
Der untypisierte Lambda-Kalkül als Programmiersprache
Der untypisierte Lambda-Kalkül als Programmiersprache November 29, 2006 betreut von Prof. Tobias Nipkow Einführung In den 1930er Jahren von Alonzo Church und Stephen Kleene eingeführt Der Lambda-Kalkül
Der untypisierte Lambda-Kalkül
Der untypisierte Lambda-Kalkül Fabian Immler 08.05.2008 1 Motivation und Einführung Der Lambda-Kalkül ist ein formales System zur Beschreibung von Funktionen, welches Funktionsdefinition sowie das Auswerten
Lambda-Kalkül. Philipp Meyer. 28. April 2009
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
Funktionale Programmierung - Grundlagen -
Funktionale Programmierung - Grundlagen - λ Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung Gundlagen - IX.1 λ-ausdrücke 1) Variablen: x, y, z,...v,v 1,...
Funktionale Programmierung ALP I. λ Kalkül WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I λ Kalkül WS 2012/2013 Berechenbarkeit - inspiriert durch Hilbert's Frage - im Jahr 1900, Paris - Internationaler Mathematikerkongress Gibt es ein System von Axiomen, aus denen alle Gesetze der Mathematik
Funktionale Programmierung Einführung
Einführung Prof. Dr. Oliver Braun Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 13.09.2017 15:29 Inhaltsverzeichnis Was ist imperative Programmierung.......................
Einführung in die funktionale Programmierung
Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 17. Oktober 2006 Einführung in Haskell: Syntax, Reduktionen, Kernsprachen Haskell,
Theoretische Informatik II
Vorlesung Theoretische Informatik II Bernhard Beckert Institut für Informatik Wintersemester 2007/2008 B. Beckert Theoretischen Informatik II: WS 2007/08 1 / 179 Dank Diese Vorlesungsmaterialien basieren
Funktionale Programmierung ALP I. λ Kalkül. Teil 2 WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I λ Kalkül Teil 2 WS 2012/2013 Lokale Variablennamen Haskell: let x = exp1 in exp2 Lambda: λ exp1. exp2 Einfache Regel: Der Geltungsbereich eines Lambda-Ausdrucks erstreckt sich soweit wie möglich
Der einfach getypter Lambda-Kalkül
Der einfach getypter Lambda-Kalkül Typprüfung und Typinferenz Tobias Nipkow und Steffen Smolka Technische Universität München 1 Einleitung 2 Explizit getypter λ-kalkül 3 Implizit getypter λ-kalkül Statische
Universität Hannover Fakultät für Elektrotechnik und Informatik Institut für Theoretische Informatik. Thema: von. Paul Krüger
1 Universität Hannover Fakultät für Elektrotechnik und Informatik Institut für Theoretische Informatik Thema: - Kalkül von Paul Krüger Betreuer: Prof. Dr. Heribert Vollmer Das Rahmenthema ist " Berechenbarkeit
Übung zur Vorlesung Automatisierte Logik und Programmierung I
Übung zur Vorlesung Automatisierte Logik und Programmierung I Prof. Chr. Kreitz Universität Potsdam, Theoretische Informatik Wintersemester 2008/09 Blatt 3 Abgabetermin: 26.11.08 nach der Übung Das dritte
Inferenzmethoden. Einheit 18. Logik höherer Stufe
Inferenzmethoden Einheit 18 Logik höherer Stufe 1. Syntax und Semantik 2. Simulation mathematischer Konstrukte 3. Beweisführung in Logik höherer Stufe Logik höherer Stufe Logik erster Stufe hat nur einfache
1. Typen 1.1 Typsicherheit 1.2 Typprüfung
1. Typen 1.1 Typsicherheit 1.2 Typprüfung Ein Typsystem ist ein praktikables, syntaktisches Verfahren, mit dem man die Abwesenheit gewisser Laufzeit-Eigenschaften eines Programms beweisen kann, indem man
Lambda-Kalkül. Dr. Eva Richter. 27.April 2012
Lambda-Kalkül Dr. Eva Richter 27.April 2012 1 / 32 Historisches um 1200 Einführung des Zahlensystems in Europa u.a. durch Fibonacci; ist charakterisiert durch ein kleine Menge von Ziffern, deren Wert von
Reduktion. 2.1 Abstrakte Reduktion
2 Reduktion In diesem Kapitel studieren wir abstrakte Eigenschaften von Regeln. In den ersten beiden Abschnitten betrachten wir nicht einmal die Regeln selbst, sondern nur abstrakte Reduktionssysteme,
Der λ-kalkül. Frank Huch. Sommersemester 2015
Der λ-kalkül Frank Huch Sommersemester 2015 In diesem Skript werden die Grundlagen der Funktionalen Programmierung, insbesondere der λ-kalkül eingeführt. Der hier präsentierte Stoff stellt einen teil der
Software Entwicklung 1
Software Entwicklung 1 Annette Bieniusa AG Softech FB Informatik TU Kaiserslautern Überblick für heute Programmierparadigmen Imperative vs. deklarative Programmierung Beispiele Funktionale Programmierung
Einführung in die Theoretische Informatik
Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Sascha Böhme, Lars Noschinski Sommersemester 2011 Lösungsblatt 9 25. Juli 2011 Einführung in die Theoretische Informatik
GTI. Hannes Diener. 18. Juni. ENC B-0123,
GTI Hannes Diener ENC B-0123, [email protected] 18. Juni 1 / 32 Als Literatur zu diesem Thema empfiehlt sich das Buch Theoretische Informatik kurzgefasst von Uwe Schöning (mittlerweile in der 5.
Funktionen und sprachliche Bedeutungen
Einführung in die Semantik,4. Sitzung Mehr zu Funktionen / Mengen, Relationen, Göttingen 1. November 2006 Mengen und sprachliche Bedeutungen Abstraktion und Konversion Rekursion Charakteristische Funktionen
Grundlagen der Programmierung 2. Operationale Semantik
Grundlagen der Programmierung 2 Operationale Semantik Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 29. April 2009 Semantik von Programmiersprachen Semantik = Bedeutung
Kapitel 5: Applikative Programmierung
Kapitel 5: Applikative Programmierung In der applikativen Programmierung wird ein Programm als eine mathematische Funktion von Eingabe-in Ausgabewerte betrachtet. Das Ausführen eines Programms besteht
Algorithmus. Was ist ein Algorithmus? Ibn Musa Al-Chwarismi persischer Mathematikers 9. Jahrhundert Buch: Regeln der Wiedereinsetzung und Reduktion.
Algorithmus Was ist ein Algorithmus? Ibn Musa Al-Chwarismi persischer Mathematikers 9. Jahrhundert Buch: Regeln der Wiedereinsetzung und Reduktion. Hier einige informelle Erklärungen zum Algorithmus P
HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül
HASKELL KAPITEL 2.1 Notationen: Currying und das Lambda-Kalkül Bisheriges (Ende VL-Teil 1) weite :: (Float,Float) ->Float weite (v0, phi) = (square(v0)/9.81) * sin(2 * phi) (10, 30 ) smaller ::(Integer,
8. Rekursive und primitiv rekursive Funktionen
8. Rekursive und primitiv rekursive Funktionen In diesem Abschnitt führen wir eine weitere (letzte) Formalisierung des Berechenbarkeitskonzeptes für Funktionen über den natürlichen Zahlen ein. Hatten wir
Logik I. Symbole, Terme, Formeln
Logik I Symbole, Terme, Formeln Wie jede geschriebene Sprache basiert die Prädikatenlogik erster Stufe auf einem Alphabet, welches aus den folgenden Symbolen besteht: (a) Variabeln wie zum Beispiel v 0,v
Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik
Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik Universität München, CIS, SS 2013 Hans Leiß Abgabetermin: Do, 4.7.2013, 16 Uhr, in meinem Postfach Aufgabe 10.1 Vereinfache die folgenden
Fragen 1. Muss eine DTM ein Wort zu Ende gelesen haben, um es zu akzeptieren? a) Ja! b) Nein!
4 Turingmaschinen Eingabeband nicht nur lesen, sondern auch schreiben kann und die zudem mit ihrem Lese-Schreib-Kopf (LSK) nach links und rechts gehen kann. Das Eingabeband ist zudem in beide Richtungen
Grundlagen der theoretischen Informatik
Grundlagen der theoretischen Informatik Kurt Sieber Fakultät IV, Department ETI Universität Siegen SS 2013 Vorlesung vom 09.04.2013 Inhalt der Vorlesung Teil I: Automaten und formale Sprachen (Kurt Sieber)
Informationsverarbeitung auf Bitebene
Informationsverarbeitung auf Bitebene Dr. Christian Herta 5. November 2005 Einführung in die Informatik - Informationsverarbeitung auf Bitebene Dr. Christian Herta Grundlagen der Informationverarbeitung
Kapitel 5. Mathematische Semantik. 1 Motivation
Kapitel 5 Mathematische Semantik In diesem Kapitel werden wir nun eine weitere Technik zur Definition der Semantik einer Programmiersprache vorstellen: die mathematische bzw. denotationale Semantik. Außerdem
Theoretische Informatik II
Theoretische Informatik II Einheit 5.3 Funktionale & Logische Programme 1. Der λ-kalkül 2. Arithmetische Repräsentierbarkeit 3. Die Churchsche These Der λ-kalkül Grundlage funktionaler Programmiersprachen
Lösungsmenge L I = {x R 3x + 5 = 9} = L II = {x R 3x = 4} = L III = { }
Zur Einleitung: Lineare Gleichungssysteme Wir untersuchen zunächst mit Methoden, die Sie vermutlich aus der Schule kennen, explizit einige kleine lineare Gleichungssysteme. Das Gleichungssystem I wird
1 Potenzen und Polynome
1 Potenzen und Polynome Für eine reelle Zahl x R und eine natürliche Zahl n N definieren wir x n := x x x... x }{{} n-mal Einschub über die bisher aufgetretenen mathematischen Symbole: Definition mittels
Reduktionssysteme und Termersetzungssysteme
Reduktionssysteme und Termersetzungssysteme Untersuchung von Berechnungen mittels Reduktionsregeln Simplifikation von: Datenstrukturen / Termen usw. Erkennen von gleichen Objekten durch Normalisierung
Funktionale Programmierung ALP I. µ-rekursive Funktionen WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I µ-rekursive Funktionen WS 2012/2013 Primitiv-rekursive Funktionen Jede primitiv-rekursive Funktion ist Loop-berechenbar. Das bedeutet, dass jede PR-Funktion in der Loop-Programmiersprache formuliert
Semantik von Programmiersprachen SS 2017
Lehrstuhl für Programmierparadigmen Denis Lohner Sebastian Ullrich [email protected] [email protected] Semantik von Programmiersprachen SS 2017 http://pp.ipd.kit.edu/lehre/ss2017/semantik Lösungen
Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz
Funktionale Programmierung Das Funktionale Quiz 31.5.2005 Nenne eine Gemeinsamkeit zwischen Typklassen und OO-Klassen Das Funktionale Quiz Das Funktionale Quiz Nenne einen Unterschied zwischen Typklassen
Theoretische Informatik SS 03 Übung 3
Theoretische Informatik SS 03 Übung 3 Aufgabe 1 a) Sind die folgenden Funktionen f : partiell oder total: f(x, y) = x + y f(x, y) = x y f(x, y) = x y f(x, y) = x DIV y? Hierbei ist x DIV y = x y der ganzzahlige
Workshop Einführung in die Sprache Haskell
Workshop Einführung in die Sprache Haskell Nils Rexin, Marcellus Siegburg und Alexander Bau Fakultät für Informatik, Mathematik und Naturwissenschaften Hochschule für Technik, Wirtschaft und Kultur Leipzig
Turing Maschine. Thorsten Timmer. SS 2005 Proseminar Beschreibungskomplexität bei Prof. D. Wotschke. Turing Maschine SS 2005 p.
Thorsten Timmer SS 2005 Proseminar Beschreibungskomplexität bei Prof. D. Wotschke Turing Maschine SS 2005 p. 1/35 Inhalt Einführung Formale Definition Berechenbare Sprachen und Funktionen Berechnung ganzzahliger
Unentscheidbarkeitssätze der Logik
Unentscheidbarkeitssätze der Logik Elmar Eder () Unentscheidbarkeitssätze der Logik 1 / 30 Die Zahlentheorie ist nicht formalisierbar Satz (Kurt Gödel) Zu jedem korrekten formalen System der Zahlentheorie
ALP I Turing-Maschine
ALP I Turing-Maschine Teil I WS 2012/2013 Äquivalenz vieler Berechnungsmodelle Alonzo Church λ-kalkül Kombinatorische Logik Alan Turing Turing-Maschine Mathematische Präzisierung Effektiv Berechenbare
2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.
2.5 Listen Listen werden mithilfe von [] und :: konstruiert. Kurzschreibweise: [42; 0; 16] # let mt = [];; val mt : a list = [] # let l1 = 1::mt;; val l1 : int list = [1] # let l = [1;2;3];; val l : int
Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):
Was bisher geschah deklarative Programmierung funktional: Programm: Menge von Termgleichungen, Term Auswertung: Pattern matsching, Termumformungen logisch: Programm: Menge von Regeln (Horn-Formeln), Formel
Einführung in die mathematische Logik
Prof. Dr. H. Brenner Osnabrück SS 2014 Einführung in die mathematische Logik Vorlesung 3 Tautologien In der letzten Vorlesung haben wir erklärt, wie man ausgehend von einer Wahrheitsbelegung λ der Aussagevariablen
Inhalt Kapitel 2: Rekursion
Inhalt Kapitel 2: Rekursion 1 Beispiele und Definition 2 Partialität und Terminierung 3 Formen der Rekursion Endständige Rekursion 4 Einbettung 29 Beispiele und Definition Rekursion 30 Man kann eine Funktion
Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom
Einstieg in die Informatik mit Java, Vorlesung vom 2.5.07 Übersicht 1 2 definition 3 Parameterübergabe, aufruf 4 Referenztypen bei 5 Überladen von 6 Hauptprogrammparameter 7 Rekursion bilden das Analogon
Die Prädikatenlogik erster Stufe: Syntax und Semantik
Die Prädikatenlogik erster Stufe: Syntax und Semantik 1 Mathematische Strukturen und deren Typen Definition 1.1 Eine Struktur A ist ein 4-Tupel A = (A; (R A i i I); (f A j j J); (c A k k K)) wobei I, J,
Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell
Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Milners
Einführung in die Theoretische Informatik
Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Sascha Böhme, Lars Noschinski Sommersemester 2011 Lösungsblatt 8 18. Juli 2011 Einführung in die Theoretische Informatik
LOOP-Programme: Syntaktische Komponenten
LOOP-Programme: Syntaktische Komponenten LOOP-Programme bestehen aus folgenden Zeichen (syntaktischen Komponenten): Variablen: x 0 x 1 x 2... Konstanten: 0 1 2... Operationssymbole: + Trennsymbole: ; :=
1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie
1 Einführung 2 Typ-0- und Typ-1-Sprachen 3 Berechnungsmodelle 4 Unentscheidbarkeit 5 Unentscheidbare Probleme 6 Komplexitätstheorie WS 11/12 155 Überblick Zunächst einmal definieren wir formal den Begriff
1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie
1 Einführung 2 Typ-0- und Typ-1-Sprachen 3 Berechnungsmodelle 4 Unentscheidbarkeit 5 Unentscheidbare Probleme 6 Komplexitätstheorie 139 Unentscheidbarkeit Überblick Zunächst einmal definieren wir formal
Einführung in die Informatik I
Einführung in die Informatik I LOOP Programme, rekursive Funktionen und der Turm von Hanoi Prof. Dr. Nikolaus Wulff Berechenbarkeit Mitte des 20. Jahrhunderts beantworteten Pioniere, wie Alan M. Turing
3 Terme und Algebren 3.1 Terme
3 Terme und Algebren 3.1 Terme Mod - 3.1 In allen formalen Kalkülen benutzt man Formeln als Ausdrucksmittel. Hier betrachten wir nur ihre Struktur - nicht ihre Bedeutung. Wir nennen sie Terme. Terme bestehen
Fallstudie: Nim Spiel
Fallstudie: Nim Spiel Angeblich chinesischen Ursprungs (Jianshizi) Interessant für Spieltheorie: vollständig analysierbar Frühzeitig computerisiert 1939 Nimatron (Weltausstellung New York) 1951 Nimrod
Programmierung 1 (Wintersemester 2015/16) Lösungsblatt: Aufgaben für die Übungsgruppen: 8 (Kapitel 9)
Fachrichtung 6. Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung Programmierung (Wintersemester 5/6) Lösungsblatt: Aufgaben für die Übungsgruppen: 8 (Kapitel 9) Hinweis: Dieses
Die projektive Ebene Was sind unendlich ferne Punkte?
Die projektive Ebene Was sind unendlich ferne Punkte? Prof. Dr. Hans-Georg Rück Fachbereich Mathematik/Informatik Universität Kassel Heinrich-Plett-Str. 40 34132 Kassel Zusammenfassung: Wir konstruieren
Funktionale Programmierung
Funktionale Programmierung Jörg Kreiker Uni Kassel und SMA Solar Technology AG Wintersemester 2011/2012 2 Teil II Typen mit Werten und Ausdruck, sogar listenweise 3 Haskell Programme Programm Module ein
Einführung in die Theoretische Informatik
Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Dr. Werner Meixner, Dr. Alexander Krauss Sommersemester 2010 Lösungsblatt 11 15. Juli 2010 Einführung in die Theoretische
Andreas Abel Ludwig-Maximilians-Universität München. Rohfassung vom 2. Juli 2010
Lambda-Kalkül Andreas Abel Ludwig-Maximilians-Universität München Skript zur Vorlesung Lambda-Kalkül. Weiteres Material ist bereitgestellt unter http://www.tcs.ifi.lmu.de/lehre/ws06-07/lambda/ und http://www.tcs.ifi.lmu.de/lehre/ws08-09/lambda/
Algorithmen mit konstantem Platzbedarf: Die Klasse REG
Algorithmen mit konstantem Platzbedarf: Die Klasse REG Sommerakademie Rot an der Rot AG 1 Wieviel Platz brauchen Algorithmen wirklich? Daniel Alm Institut für Numerische Simulation Universität Bonn August
{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel
Inhalt Hoare-Kalkül Formale Verifizierung Hoare-Kalkül while-sprache Terminierung Partielle / totale Korrektheit 4.0 Hoare-Kalkül entwickelt von C.A.R. (Tony) Hoare (britischer Informatiker), 1969 formales
Grundlagen der Programmierung 3 A
Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Haskell, Typen, und Typberechnung Ziele: Haskells Typisierung Typisierungs-Regeln
Resolutionskalkül. wird t als eine Menge K t von Klauseln geschrieben, welche die einzelnen Maxterme repräsentieren:
Resolutionskalkül Ein Kalkül ist eine Kollektion von syntaktischen Umformungsregeln, die unter gegebenen Voraussetzungen aus bereits vorhandenen Formeln neue Formeln erzeugen. Der Resolutionskalkül besteht
Grundlagen Theoretischer Informatik 2 WiSe 2011/12 in Trier. Henning Fernau Universität Trier
Grundlagen Theoretischer Informatik 2 WiSe 2011/12 in Trier Henning Fernau Universität Trier [email protected] 1 Grundlagen Theoretischer Informatik 2 Gesamtübersicht Organisatorisches; Einführung Ersetzungsverfahren:
Vollständige Induktion. Analysis I. Guofang Wang. Universität Freiburg
Universität Freiburg 26.10.2011 Vollständige Induktion Wir unterbrechen jetzt die Diskussion der Axiome der reellen Zahlen, um das Beweisverfahren der vollständigen Induktion kennenzulernen. Wir setzen
Gröbnerbasen in Monoid- und Gruppenringen
Gröbnerbasen in Monoid- und Gruppenringen Karsten Hiddemann 5. November 2003 Zusammenfassung Gröbnerbasen, entwickelt von Bruno Buchberger für kommutative Polynomringe, finden immer häufiger Anwendung
Vorkurs Mathematik und Informatik Mengen, natürliche Zahlen, Induktion
Vorkurs Mathematik und Informatik Mengen, natürliche Zahlen, Induktion Saskia Klaus 07.10.016 1 Motivation In den ersten beiden Vorträgen des Vorkurses haben wir gesehen, wie man aus schon bekannten Wahrheiten
Programmieren für Fortgeschrittene
Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme Wintersemester 2011/12 Programmieren für Fortgeschrittene Rekursive Spezifikationen Die folgende
Programmierparadigmen
Programmierparadigmen Teil 1: Funktionale Programmierung Kapitel 3 Lambda Kalkül (Dieses Kapitel orientiert sich an Material von Prof. Dr.-Ing. Snelting, KIT) http://www.tu-ilmenau.de/fakia/functional.html
Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell
Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Sommersemester
Strukturelle Rekursion und Induktion
Kapitel 2 Strukturelle Rekursion und Induktion Rekursion ist eine konstruktive Technik für die Beschreibung unendlicher Mengen (und damit insbesondere für die Beschreibung unendliche Funktionen). Induktion
mathematik und informatik
Prof. Dr. Christoph Beierle Kurs 01695 Deduktions- und Inferenzsysteme LESEPROBE mathematik und informatik Das Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere das Recht
Einführung in die funktionale Programmierung
Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 26. Oktober 2006 Haskell - Einführung Syntax Typen Auswertung Programmierung
Funktionale Programmierung. ALP I Lambda-Kalkül. Teil III SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I Lambda-Kalkül Teil III SS 2011 Parser Hilfsfunktionen: Die break-funktion ist eine Funktion Höherer Ordnung, die eine Liste beim ersten Vorkommen einer Bedingung in zwei Listen spaltet. break ::
Einstieg in die Informatik mit Java
1 / 26 Einstieg in die Informatik mit Java Methoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 26 1 Methoden 2 Methodendefinition 3 Parameterübergabe, Methodenaufruf
Formale Grundlagen der Informatik 1 Kapitel 16 Normalformen und Hornformeln
Formale Grundlagen der Informatik 1 Kapitel 16 Normalformen und Frank Heitmann [email protected] 9. Juni 2015 Frank Heitmann [email protected] 1/36 Ersetzbarkeitstheorem
JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.
JavaScript JavaScript wird direkt in HTML-Dokumente eingebunden. Gib folgende Zeilen mit einem Texteditor (Notepad) ein: (Falls der Editor nicht gefunden wird, öffne im Browser eine Datei mit der Endung
Funktionale Programmierung Grundlegende Datentypen
Grundlegende Datentypen Prof. Dr. Oliver Braun Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 06.11.2017 16:45 Inhaltsverzeichnis Typen........................................
Programmierparadigmen
in Haskell Programmierparadigmen in Haskell D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Sommer 2011, 4. April 2011, c 2011 D.Rösner
1 Der Baum. Informatik I: Einführung in die Programmierung 11. Bäume. Bäume in der Informatik. Bäume in der Informatik - Definition.
1 Informatik I: Einführung in die Programmierung 11. Bäume e e Albert-Ludwigs-Universität Freiburg Bernhard Nebel 13. November 2015 13. November 2015 B. Nebel Info I 3 / 33 Bäume in der Informatik Bäume
Typen von Programmiersprachen
Typen von Programmiersprachen Berechenbarkeitstheorie: Formalisierung des intuitiven Berechenbarkeitsbegriffs man kann vier Typen von Programmiersprachen zum Berechnen von Zahlenfunktionen unterscheiden:
