====== 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.