Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
informatik-buch:grundlagen_der_programmierung:logische_programmierung [2009/04/26 19:51] |
informatik-buch:grundlagen_der_programmierung:logische_programmierung [2009/04/26 19:51] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== 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) | ||
+ | <file> | ||
+ | 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. | ||
+ | </file> | ||
+ | * **rekursive Regeln** \\ Das Prädikat im Regelkopf darf im Regelrumpf vorkommen: | ||
+ | <file> | ||
+ | vorfahr(X, Y) :- kind(Y, X). | ||
+ | vorfahr(X, Y) :- kind(Y, Z), vorfahr(X, Z). | ||
+ | </file> | ||
+ | * 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: | ||
+ | <code prolog> | ||
+ | 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). | ||
+ | </code> | ||
+ | |||
+ | Abfrageergebnis: | ||
+ | |||
+ | <code> | ||
+ | ?- 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 | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | Die Rettung: | ||
+ | |||
+ | <code prolog> | ||
+ | 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). | ||
+ | </code> | ||
+ | |||
+ | Abfrageergebnis: | ||
+ | <code> | ||
+ | ?- eltern(claudius,X). | ||
+ | X = lucas n | ||
+ | X = linus n | ||
+ | false. | ||
+ | |||
+ | ?- | ||
+ | </code> | ||
+ | |||
+ | Rekursion ist in Prolog zwar möglich, jedoch muss sie auch hier abbrechen um Endlosschleifen zu verhindern. |