901.853 VO Einführung in das funktionale und symbolische

Werbung
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)!
Herunterladen