Logische Programmierung

Selbststudium: Logische Programmierung

In diesem begleiteten Unterricht, der dem Kurs "Konzepte der Programmierung" zugeordnet ist, werden wir eine sehr spezielle Art der Programmierung kennen lernen. Im Gegensatz zu den imperativen Sprachen, bei denen der Begriff des Algorithmus eine grosse Bedeutung hat, steht in der logischen Programmierung das "Wissen" über das Problem im Vordergrund.

Beispiel

Was heisst das nun? Das logische Programm besteht eigentlich nur aus Fakten und Regeln. Wir können beispielsweise unseren Stammbaum wie er in dem Bild dargestellt ist folgendermassen in einem logischen Programm formulieren:

Verheiratet" bedeutet einfach, dass die 2 Argumente miteinander verheiratet sind:

verheiratet(adam,adele).
verheiratet(alfred,alwine).
verheiratet(anton,anna).
verheiratet(arthur,ariadne).
verheiratet(baldur,barbara).
verheiratet(bernd,berta).
verheiratet(clemens,cleopatra).

Ebenso müssen wir formulieren, wer die Eltern der einzelnen Leute sind:

elter(baldur,adam).
elter(baldur,adele).
elter(barbara,alfred).
elter(barbara,alwine).

Des Weiteren sollte unser Programm noch wissen wer männlich und weiblich ist. Dies machen wir mit dem Prädikat maennlich bzw. weiblich:

maennl(adam).
maennl(alfred).
...
weibl(adele).
weibl(alwine).
...

Nun hat das Programm schon genügend Wissen um sehr einfache Fragen zu beantworten. Wenn man fragt: Wer ist mit Anna verheiratet? Dann weiss das System natürlich, dass dies der Anton ist:

=> verheiratet(X, anna)?
Ausgabe X = Anton

Neben Fakten können wir auch noch Regeln formulieren. Regeln in Prolog kann man von rechts nach links "lesen":

z.B. mutter(X,Y):- elter(X,Y), weibl(Y).

bedeutet:

Wenn das Y ein Elternteil von X ist UND Y weiblich ist
Dann ist Y die Mutter von X

Analog kann man natürlich weitere Reglen formulieren:

vater(X,Y):- elter(X,Y), maennl(Y).
kind(X,Y):- elter(Y,X).
schwiegermutter(X,Y):- verheiratet(X,Z), mutter(Z,Y).
bruder(X,Y):- vater(X,V), mutter(X,M), vater(Y,V), mutter(Y,M), maennl(Y), Y\=X.

Mit diesen Reglen kann das System uns nun herausfinden, dass Anna wirklich die Schwiegermutter von Berta ist:

=> schwiegermutter(anna, berta)?
Ausgabe TRUE

Mit fortgeschrittener Prolog/Constraint Programmierung kann man z.B. auch den Rubiks Cube lösen (http://www.amzi.com/articles/rubik.htm) oder auch hochkomplexe Optimierungen (http://www.ilog.com/products/optimization/) angehen.

Siehe auch http://de.wikipedia.org/wiki/Prolog_(Programmiersprache)