SDA SE Wiki

Software Engineering for Smart Data Analytics & Smart Data Analytics for Software Engineering

User Tools

Site Tools


Ein Prolog Programm

Hier wird anhand eines einfachen Beispiels verdeutlicht, wie ein Prolog-Programm grundsätzlicch aufgebaut ist.

Ein Prolog-Programm ist nicht wie ein imperatives Programm aufgebaut. So spielt z.B. Reihenfolge (fast) keine Rolle.

mann(anton).
mann(hugo).
mann(sascha).
mann(paul).

frau(anne).
frau(silke).
frau(jennifer).

Hierbei werden Fakten konstatiert, nämlich, das anton, hugo, paul und sascha männer sind, und anne, silke und jennifer Frauen. Diese Fakten gelten auf jeden Fall, und unabhängig voneinander. Anders gesagt: Die Tatsache das anton ein Mann ist, spielt keine Rolle dafür, ob hugo einer ist.

verliebt(anton, silke).

Hier haben wir ein Fakt etwas anderer Form. Fakten geben an, das Relationen erfüllt sind für ein Tupel. So erfüllt das Paar anton, silke die Relation “verliebt”.

gutaussehend(anne).
gutaussehend(sascha).

verliebt(paul, X).

Dieser Fakt enthält eine Variable. Das bedeutet, das für alle X paul in diese Person verliebt ist (selbst männer und sich selbst!). Da die Variable nie wieder vorkommt kann (und wird man) sie typischerweise durch ein _ ersetzen, das aussagt “Hier steht eine Variable, die aber für mich uninteressant ist”.

verliebt(X,Y) :- gutaussehend(X), gutaussehend(Y), mann(X), frau(Y).

Hier treffen wir auf eine Regel. Eine Regel gibt an, das eine Relation immer dann erfüllt ist, wenn die rechts vom :- (was man normalerweise als ⇐ lesen kann) stehenden aussagen wahr sind (die Relationen gelten). In diesem Fall gilt: Alle gutaussehenden Männer sind in alle gutaussehenden Frauen verliebt. (Genau wie im echten Leben? ;) )

Nun können wir Anfragen stellen, indem wir die Datei in der wir diese Fakten und Regeln abgespeichert haben in Prolog laden (mittels consult(dateiname).).

Eine mögliche anfrage wäre z.B. verliebt(sasha, anne)., was von Prolog mit yes beantwortet wird, denn Sascha und Anne sind beide gutaussehend, und Sasha ein aann und anne eine Frau. Aber wieso antworter Prolog auf verliebt(sascha, Anne). mit Anne = anne? Weil Anne eine Variable ist, und wir somit fragen “Für welche belegungen von Anne ist sascha darin verliebt?”.

Wenn wir die Anfrage verliebt(paul, X). starten würden, erhielten wir ein seltsames Ergebnis: X = _G284 ;. Was hat es damit auf sich? Das ist Prolog's Art uns zu sagen, das für jede belegung der Variable die Relation erfüllt sein würde.

Komplexere Regeln sind natürlich auch möglich, unter anderem auch mittels Rekursion definierte. Rekursion ist eines der Hauptwerkzeuge des Prolog-Programmierers.

Wenn man in der Anfrage Variablen läßt, erhält man Belegungen (oder Bindungen) der Variablen, die die Anfrage erfüllen. Sollte man mit der erhaltenen Lösung nicht zufrieden sein kann man ; drücken, um Prolog nach weiteren Bindungen suchen zu lassen. Sehr schön dabei ist, das die Bindungsmuster normalerweise nicht vorgegeben sind. Wir können also verliebt(name1, name2) aufrufen, um zu prüfen ob name1 in name2 verliebt ist, verliebt(X, frau) um alle männer zu erhalten die in frau verliebt sind, verliebt(mann, X) um alle Frauen zu erhalten in die mann verliebt ist, und schließlich verliebt(X,Y) um alle verliebten paare zu erhalten.

research/jtransformer/prologprogramm.txt · Last modified: 2018/05/09 01:59 (external edit)

SEWiki, © 2019