260.170 Einführung in das funktionale und symbolische Programmieren mit Mathematica F. Mittendorfer E-mail: [email protected] Rule based programming • Basic Rules Pattern -> NewPattern {rule1,rule2,rule3…} • Replacements x /. x -> y ReplaceAll x //. x-> y ReplaceRepeated ReplaceList[expression, ruleset] • Immediate and Delayed Assignments x=y x := y x -> y x :> y • Conditions x :> y /; condition • Downvalues and Upvalues f[x] := y f[x] ^:= y x/: f[x] := y Funktionales Programmieren (Lisp,ML,Scala,F#,…) • (Mathematische) Funktion: f(x) f:R ->R x ->x2 • Eigenschaften von einem rein funktionalem Programm: – Programm besteht aus Funktionsaufrufen: f(g(h(x^2+5))) – Higher order functions: Funktionen auch gleichzeitig als Funktionswerte (input/return) D(f(x)) = f´(x) – Ergebnis durch Auswertung (Evaluation) der Funktion für bestimme Expressions – Keine Variablenzuweisung (keine Nebeneffekte) – Schwerpunkt auf der Auswertung der Terme Beispiel 1: Faktorielle Funktion n! = 1*2*3*4*..*n • Rekursive Funktionen an Stelle von Schleifen • Prozeduraler Programmierstil (F90,C,..) – PseudoCode: fac = 1 DO I = 1,N fac = fac * N ENDDO Variablen speichern Werte • Funktionaler Programmierstil f(x) = x* f(x-1); f(1)=1 f(n) = f( f( f( f(1))) Funktionsdefinition Auswertung(Evaluation) • Vorteile des Funktionalen Programmierens – Weniger fehleranfällig: keine Nebeneffekte • Dadurch leichter parallelisierbar (Multi-Core CPUs !) – Code-Segmente können direkt überprüft werden („referentielle Transparenz“) – Oft keine explizite Deklaration des Datentyps nötig – Mathematica: Geschwindigkeit! • Nachteile des Funktionalen Programmierens – Lesbarkeit! • Kompakter Code manchmal schwierig zu verstehen – Speicherintensiv • Daher in Praxis oft gemischter Ansatz! – Z.B. Verwendung zusätzlicher Variablen um Lesbarkeit zu erhöhen Das l-Kalkül • Formale Sprache zur Untersuchung von Funktionsdefinition, der Anwendung von Funktionen und von Rekursionen (A. Church, S. C. Kleene, 1930) • Kleinste universelle Programmiersprache mit nur zwei Komponenten: – Transformationsregeln (Variablensubstitution) – (Anonyme) Funktionendefinition • Beispiel (l x.x+2) (l x.x 3)(l x.x+2) f(x)=x+2 f(3)=5 • Erster Ansatz um das Halteproblem zu lösen Was kann berechnet werden ? Das Halteproblem • Gibt es Grenzen was berechenbar ist ? • Mathematisch equivalent zum „Entscheidungsproblem“ (Hilbert, 1928)! • Das Problem: Können wir ein Programm konstruieren dass für einen gegebenen Algorithmus und seinen Input entscheidet ob es je hält/zu Ende läuft ? Das Halteproblem (II) : Lösung • Konstruiere Funktion halt(a,i) = true wenn Algorithmus a bei Input i hält, sonst false. • Konstruiere function paradox(s) if halt(s,s) = false return true else loop forever Hält paradox(paradox) je ? • Widerspruch! Daher kann Funktion halt nicht existieren und das Problem ist unentscheidbar. • Equivalent zur Lösung des Entscheidungsproblems: Gödelscher Unvollständigkeitssatz (1931)!