Logische Programmierung B-82 Deklaratives Programmieren in Prädikatenlogik: Problem beschreiben statt Algorithmus implementieren (idealisiert). Grundlagen: Relationen bzw. Prädikate (statt Funktionen); Prädikatenlogik eingeschränkt auf Horn-Klauseln; Resolution: Belegung von Variablen finden, die eine Menge von Klauseln erfüllt. Datenmodell: strukturierte Terme mit Variablen (mathematisch, nicht imperativ); Bindung von Termen an Variable durch Unifikation Logische Programme: Ein Programm ist eine Menge von Klauseln (Prädikate, Regeln, eine Anfrage) formuliert über Terme. Ein Interpretierer prüft, ob Werte an die Variablen so gebunden werden können, daß die Anfrage mit den gegebenen Prädikaten und Regeln erfüllbar ist (Resolution). Es wird ein universelles Suchverfahren (Backtracking) angewendet. Wichtigste Sprache: Prolog typische Anwendungen: Prototyping, Expertensysteme... mehr dazu in der Vorlesung Wissensbasierte Systeme Vorlesung Informatik B SS 98 / Folie 82! " # ' ( ) * +, - *, -., / 0 1 $! 2 3 4 5 " # 6 7 8.
Erstes Beispiel in Prolog Prädikate (Relationen) durch Fakten definiert: stern(sonne). umkreist(mars, sonne). stern(sirius). umkreist(mond, erde). umkreist(jupiter, sonne). umkreist(phobos, mars). umkreist(erde, sonne). B-83 Prädikate durch Regeln (Implikationen) definiert: planet(b) :- umkreist(b, sonne). satellit(b) :- umkreist(b, P), planet(p). Prädikat: sonnensystem(sonne). sonnensystem(b) :- planet(b). sonnensystem(b) :- satellit(b). Anfragen: Antwort:?- umkreist(erde, sonne). yes?- umkreist(mond, sonne). no?- umkreist(mond, B). B=erde?- umkreist(b, sonne). B=jupiter; B=erde; B=mars?- umkreist(b, jupiter). no?- satellit(mond). yes?- satellit(s). S=mond; S=phobos Vorlesung Informatik B SS 98 / Folie 83 " 7 9 7 2 : # 6! " # ' ( ) * +, -. ; / 0 1 $! 2 3 4 + < 7 + 7.! ' 7 6 = 2 *> )? + < * < @ ) A
Interpretationsschema Backtracking B-84 Programm mit Fakten, Regeln und Anfrage spannt abstrakten Lösungsbaum auf (B-85): Wurzel: Anfrage Knoten: zu verifizierende Teilziele Kanten: zu untersuchende Alternativen Blätter: Anfrage verifiziert oder widerlegt Bei rekursiven Regeln nicht endlicher Baum. Beispiel (a, b,... stehen für Prädikate): 1 a:- b, c, d. 4 e. 2 a:- e, f. 5 f. 3 b:- f. 6 a:- f.?- a, e Prolog-Interpreter durchsuchen den Lösungsraum mit Backtracking. Freiheitsgrade der Suchreihenfolge: 1. Wahl der Regel. Standard: Reihenfolge im Programm 2. Wahl des Teilziels Standard: von links nach rechts Reihenfolge ist entscheidend für die Terminierung der Suche und die Reihenfolge in der Lösungen gefunden werden! 9 B ) C D : Vorlesung Informatik B SS 98 / Folie 84! 4 6 C D = 2 E F G?! 2 4 7 7 3 H ' ( ) * +, -. ; / 0 1 $! ' " 7 C D * < 4 4 7 * < C D I A! 4 4 6 J < 7 K.
Lösungsbaum Beispiel B-85 1 a:- b, c, d. 4 e. 2 a:- e, f. 5 f. 3 b:- f. 6 a:- f.?- a, e. a e b c d e e f e f e f c d e c d e f e e e success fail (backtrack) success L : K " # ' ( ) * +, -. ; Vorlesung Informatik B SS 98 / Folie 85
Prädikatenlogische Grundlagen B-86 Prolog-Notation: Prädikatenlogik: Prädikat: p (a, X, Y). X, Y: p (a, X, Y) Implikation: q (X, Y) :- r (X), s(y). X, Y: q (X, Y) <= r (X) s (Y) Anfrage:?- r(x), s(y). X, Y: r (X) s (Y) = ( X, Y: (r (X) s (Y))) = ( X, Y: ( r (X) s (Y))) Allgemeine logische Formeln eingeschränkt auf Horn-Klauseln, d. h. höchstens ein nicht negiertes Element: a z y... Implikation: a <= z y... Fakt: a negierte Anfrage (s. o.): z y... Resolution führt einen Widerspruchsbeweis für eine Anfrage. Die Antwort ist gültig für alle zu einem Programm konstruierbaren Terme (Herbrand-Universum). Explizite Negation gibt es nicht: tochter(x, Y):- vater(y, X), not(maennlich (X)). Vorlesung Informatik B SS 98 / Folie 86 M ) # 6 + 3 6 : " # ' ( ) * +, -. ;
Terme, Unifikation B-87 Term: Ausdruck mit Literalen, Variablen, Operatoren, Funktoren; beschreibt eine Struktur; wird nicht ausgewertet. z. B. X + f(2*y) Unifikation: Allgemeines Prinzip in der Termersetzung. Anwendung in Prolog: Anwendbarkeit von Regeln oder Fakten auf ein Teilziel entscheiden und dabei Variablen an Werte binden. gegeben: zwei Terme T1, T2, z. B. X+f(2*Y) und 3+f(2*g(1)) gesucht: ein Unifikator, d. h. eine Menge von Variablenbindungen U = {(X, e) X ist Variable in T1 oder T2; e ist ein Term}, so daß nach Substitution der Variablen X durch e in T1 und T2 die beiden Terme gleich sind. z. B. U = { (X, 3), (Y, g(1)) } Allgemeinster Unifikator Ua ist ein Unifikator, der keine unnötigen Variablenbindungen enthält. Die gebundenen Werte sind möglichst allgemein. D. h. nach Anwenden der Substitution mit Ua bleiben möglichst viele Variable in den Termen T1, T2 erhalten. Z. B. T1 = f (h(a, b), g (Y), V) T2 = f (X, g (h(a,c)), Z) U ={(X, h(a, b)), (Y, h(a, c)), (V, a), (Z, a)} Ua ={(X, h(a, b)), (Y, h(a, c)), (V, Z)} Durch rekursiven Vergleich der Terme T1, T2 und ihrer Komponenten wird der allgemeinste Unifikator gefunden oder festgestellt, daß kein Unifikator existiert. + ) N 7 6 : Vorlesung Informatik B SS 98 / Folie 87! " # : H * 2 : L N 7 6. ' ( ) * +, -. ;. ; / 0 1 $! L 4 5 2 N 7 6 2 O 4 O C.
Notation von Prolog-Programmen B-88 Beliebige Folge von Klauseln: Fakten, Regeln und Anfragen (am Ende). Klauseln mit Prädikaten p(t 1,..., t n ), Terme t i Terme bestehen aus beliebig geschachtelten Literalen: hans 127 "text" 'a' Variablen (untypisiert): X Person _ Listen: [] [a, b, c] [a T] [_ T] Strukturen: kante(a, b) datum(t, M, J) Grundterm: Term ohne Variablen, z. B. datum(11, 7, 1995) Termersetzung: Variable werden an Werte gebunden, die Struktur bleibt erhalten, z. B. heuer(t, M, datum(t, M, 1997)).?-heuer(7, 1, Z). liefert Z=datum(7, 1, 1997) In Klauseln werden Terme als Muster verwendet. Mehrfaches Auftreten einer Variablen in einer Klausel steht für den gleichen Wert (siehe Unifikation). last([x], X). last([_ T], Y):- last(t, Y).?-last([1,2,3], Z). Eine Klausel ist auf ein Teilziel anwendbar, wenn dieterme des Teilziels auf entsprechende Terme des Klauselkopfes passen, d. h. unfizierbar sind. Dabei entstehen Variablenbindungen. " 7 E 6 D " # ' ( ) * +, -. ; Vorlesung Informatik B SS 98 / Folie 88
Beispiel: Symbolische Differentiation B-89 Das folgende Prolog-Programm beschreibt einige einfache Regeln zur Differentiation. Sie werden auf Terme angewandt, die Ausdrücke beschreiben, und liefern die Ableitung in Form eines solchen Terms, z. B.?-diff(2*x,x,D). liefert z. B. D = 2*1+x*0. Mit weiteren Regeln zur Umformung von Ausdrücken kann das Ergebnis noch vereinfacht werden. In Prolog werden Ausdrücke wie 2*x nicht ausgewertet (sofern nicht durch IS explizit gefordert), sondern als Struktur dargestellt, also etwa *(2, x). Prolog-Regeln zur Symbolischen Differentiation: diff(x, X, 1):-!. diff(t, X, 0):- atom(t). diff(t, X, 0):- number(t). diff(u+v, X, DU+DV):- diff(u, X, DU), diff(v, X, DV). diff(u-v, X, DU-DV):- diff(u, X, DU), diff(v, X, DV). diff(u*v, X, (U*DV)+(V*DU)):- diff(u, X, DU), diff(v, X, DV). diff(u/v, X, ((V*DU)-(U*DV))/V*V):- diff(u, X, DU), diff(v, X, DV). Falls die erste Regel anwendbar ist, bewirkt der Cut (!), daß bei beim Backtracking keine Alternative dazu versucht wird, obwohl die nächsten beiden Klauseln auch anwendbar wären. Vorlesung Informatik B SS 98 / Folie 89 " P ) E + < 6! " # 8 Q E R ) ' ( ) * +, -. ;. G S T $ 1 $ T! " # 4 8 L 7 : + 3 6. / 0 1 $! " # 4 9 7 : 7 7 8 = K 6?. 4 + 7 2 ) 7 3.
Paradigmenvergleich B-90 Imperative Programmierung: Variablen mit Zuweisungssemantik, Ablaufstrukturen Objekt-orientierte Programmierung: Klassen, Vererbung, dynamische Methodenbindung; meist in imperativer Sprache Parallele Programmierung: Prozesse, Synchronisation, Kommunikation; in imperativer Sprache Funktionale Programmierung: Funktionen, HOF, Rekursion; nicht-imperativ: Variable unveränderbar an Wert gebunden (parallele Auswertung möglich bei unveränderter Semantik) Logische Programmierung: Relationen, Prädikate, Terme und Unifikation; nicht-imperativ: Variable unveränderbar an Term gebunden (parallele Auswertung möglich - ändert Suchreihenfolge) 3 " 7 " # Vorlesung Informatik B SS 98 / Folie 90
Ziele erreicht... B-91 In der Vorlesung Informatik B sollten Sie das Programmieren von Grund auf gelernt haben, eigene praktische Erfahrungen in der Entwicklung von Java-Programmen erworben haben, grundlegende Konzepte der objektorientierten Programmierung gelernt haben, grundlegende Konzepte von Programmiersprachen im allgemeinen verstanden haben; d. h. neben imperativen und objektorientierten Konzepten auch Grundlagen paralleler, funktionaler und logischer Programmierung.... B 7 7 * U 4 V. Vorlesung Informatik B SS 98 / Folie 91