Prolog-Grundzüge 1: Fakten und Regeln

July 15, 2009 at 7:33 pm 2 comments


Nachdem ich das Terminplaner-Beispiel bereits in Java, Groovy, Lisp und Groovy programmiert habe, hatte ich mir als nächstes Prolog (PROgramming in LOGic) vorgenommen. Und da Sebastian bereits gesagt hat, dass er den Prolog-Code nicht versteht, habe ich entschieden, diese Mini-Einführung zu schreiben.

Prolog ist eine sogenannte deklarative Programmiersprache. Man deklariert lediglich Fakten und Regeln auf diesen Fakten und das Prolog-System kümmert sich um die Algorithmen. Sowas wie If-Konstrukte oder Schleifen der klassischen Form gibt es in Prolog nicht.

In Prolog schreibt man Fakten so ähnlich auf wie sonst Funktionsaufrufe:

benutzer(stefan).
benutzer(mika).

bedeutet beispielsweise, dass stefan ein Benutzer ist. stefan muss hier nicht als String angegeben werden. Es ist ein Symbol (ein Konzept, dass es auch in Lisp gibt). Symbole werden dadurch von Variablen unterschieden, dass sie klein geschrieben werden und Variablen mit einem Großbuchstaben oder Unterstrich beginnen.

Führen wir zu den Benutzern noch Benutzergruppen ein:

gruppe(admin, stefan).
gruppe(admin, mika).

Damit können wir bereits ein paar drollige Dinge machen. Trivialerweise können wir abfragen, ob stefan der Gruppe admin angehört: gruppe(admin, stefan) liefert true. Interessanter wird es, wenn wir Stefans Gruppe wissen möchten: gruppe(X, stefan) liefert X=admin. Und das funktioniert auch mit Mengen: gruppe(admin, Y) liefert Y=stefan und Y=mika. Und es funktioniert sogar die Kombination gruppe(X, Y). Das Prolog-Laufzeitsystem sucht alle Belegungen für X und Y, die definiert wurden, also X=admin, Y=stefan und X=admin, Y=mika.

Hier sieht man einen wichtigen Unterschiede zu klassischen Programmiersprachen: Parameter für Regeln haben keine vordefinierte Richtung. In der Gruppe Regel konnten wir die beiden Parameter sowohl als Ein- wie auch als Ausgabeparameter verwenden. Das reduziert die Menge der notwendigen Regeln/Funktionen.

Jetzt können wir eine Regel selbe_gruppe einführen, die prüft, ob sich zwei Benutzer in derselben Gruppe befinden.

selbe_gruppe(Benutzer1, Benutzer2) :- gruppe(Gruppe, Benutzer1), gruppe(Gruppe, Benutzer2), Benutzer1 \= Benutzer2. 

Das Komma bedeutet hier soviel wie Und.

Und dann können wir fragen, ob Stefan und Mika zur selben Gruppe gehören.

?- selbe_gruppe(stefan, mika). 

und Prolog liefert uns erwartungsgemäß true.

In der Abfrage kann man auch selbst wieder Variablen verwenden:

?- gruppe(X, stefan).

liefert admin.

Und das waren auch schon die allerersten Grundzüge von Prolog. Soweit, so einfach. Wie man damit einen Terminplaner schreiben soll, ist erstmal noch hochgradig unklar. Als nächstes werde ich daher einen Blog-Eintrag zu Rekursion in Prolog schreiben.

Entry filed under: 1. Tags: .

LoC und Produktivität Automatisierte Akzeptanztests mit Fit/Fitnesse

2 Comments Add your own

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed



%d bloggers like this: