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.
Prädikat(Konstante).
Regelkopf :- Regelrumpf.
Hinweise:
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). |
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).
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.