====== Logische Programmierung ====== Als ob ein vernünftiger Quelltext nicht immer logisch wäre! - Ja OK, so ist es natürlich nicht gemeint. Es um ein vollständig anderes Programmier-Paradigma. Die Sprache, die wir zur logischen Programmierung verwendet haben heißt Prolog. Kurze Vorbemerkung: ^ Prämisse | Voraussetzung oder Annahme | ^ Konklusion | Folgerung aus den Prämissen | ^ Modus ponens | Schlussregel | Hier kommt Schluss nicht von Ende, sondern von implizieren. ===== Vorgehensweise ===== - **Wissensbasis** aufstellen - direkte Angaben durch **Fakten**: ''Prädikat(Konstante).'' - indirekte Angaben durch **Regeln**: ''Regelkopf :- Regelrumpf.'' - **Anfrage** formulieren Hinweise: * **:-** Implikation * **,** Konjunktion (UND) * **;** Disjunktion (ODER) * Alle Worte mit großem Anfangsbuchstaben sind Variablen. ===== Fakten und Regeln ===== ^ Modellierungsansatz ^^ | Eine (Mini-)Welt besteht aus **Objekten** (Personen, Gegenständen, ...), \\ die **Eigenschaften** haben und in **Beziehung** zueinander stehen. | **Objekte**: Hera, Zeus. \\ **Eigenschaften**: weiblich, männlich. \\ **Beziehung**: ist verheiratet mit. | | Objekte werden mit **Konstanten** (allg. mit Termen) beschrieben, \\ Eigenschaften und Beziehungen mit Hilfe von **Prädikaten**. | **Konstanten**: Zeus, Hera. \\ **Prädikate**: weiblich, männlich, verheiratet. | | Sachverhalte der Miniwelt können \\ direkt mit Hilfe von **Fakten** beschrieben werden.| **Fakten: Prädikat(Konstanten)** \\ weiblich(hera). \\ maennlich(zeus). \\ verheiratet(zeus,hera). \\ weiblich(maja). \\ kind(hermes, zeus). \\ kind(hermes, maja). | | Sachverhalte der Miniwelt können \\ auch indirekt mit Hilfe von **Regeln** beschrieben werden. | **Regeln**: \\ vater(X, Y) :- kind(Y, X), maennlich(X). \\ mutter(X, Y) :- kind(Y, X), weiblich(X). | ==== Regeln ==== * Regeln sind Wenn-Dann-Aussagen: (siehe Tabelle oben) X ist Vater von Y, wenn Y ein Kind von X ist und X männlich ist. X ist Mutter von Y, wenn Y Kind von X ist und X weiblich ist. * **rekursive Regeln** \\ Das Prädikat im Regelkopf darf im Regelrumpf vorkommen: vorfahr(X, Y) :- kind(Y, X). vorfahr(X, Y) :- kind(Y, Z), vorfahr(X, Z). * Regeln mit dem gleichen Regelkopf bilden eine **Disjunktion**, werden also mit **oder** verknüpft. Man kann statt dessen die Regelrümpfe auch mit Semikolon getrennt hintereinander schreiben. * Zwei Aussagen (zwei **goals**), die durch Komma getrennt werden, bilden eine Konjunktion, werden als mit **und** verknüpft. ===== Beispiele ===== Ein Familienbeispiel: maennlich(lucas). maennlich(linus). maennlich(claudius). weiblich(birgit). verheiratet(birgit,claudius). eltern(birgit,linus). eltern(claudius,lucas). eltern(X,Y):-verheiratet(X,Z),eltern(Z,Y). eltern(X,Y):-verheiratet(Z,X),eltern(Z,Y). Abfrageergebnis: ?- eltern(claudius,X). X = lucas n X = linus n X = lucas n X = linus n X = lucas n X = linus n X = lucas n X = linus n X = lucas n X = linus n ... Die Rettung: maennlich(lucas). maennlich(linus). maennlich(claudius). weiblich(birgit). verheiratet(birgit,claudius). kind(linus,birgit). kind(lucas,claudius). eltern(X,Y):-kind(Y,X). eltern(X,Y):-verheiratet(X,Z),kind(Y,Z). eltern(X,Y):-verheiratet(Z,X),kind(Y,Z). Abfrageergebnis: ?- eltern(claudius,X). X = lucas n X = linus n false. ?- Rekursion ist in Prolog zwar möglich, jedoch muss sie auch hier abbrechen um Endlosschleifen zu verhindern.