Inhaltsverzeichnis

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

  1. Wissensbasis aufstellen
    1. direkte Angaben durch Fakten: Prädikat(Konstante).
    2. indirekte Angaben durch Regeln: Regelkopf :- Regelrumpf.
  2. Anfrage formulieren

Hinweise:

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

  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.
vorfahr(X, Y) :- kind(Y, X).
vorfahr(X, Y) :- kind(Y, Z), vorfahr(X, Z).

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.