Prolog-Grundzüge 4: Pattern Matching

July 20, 2009 at 8:09 pm Leave a comment


Eine weiteres sehr nützliches Prolog-Feature ist das Pattern-Matching. In den meisten Programmiersprachen wird zur Auswahl einer Funktion oder Prozedur nur der Name herangezogen, bei Java und Konsorten auch noch die Anzahl und der statische Typ der Parameter. Bei Prolog wird außerdem die Form der Argumente herangezogen.

So kann man in einer Regeldefinition z.B. den Split-Operator für Listen (den wir im letzten Blogeintrag kennen gelernt haben) verwenden und sowas schreiben:

liste([H,T], H, T) :- true. 

tut dasselbe wie die Regel “liste” aus dem letzten Blogeintrag. Dort war “liste” definiert als:

liste(EineListe, H, T) :- [H|T] = EineListe.

Wir werden beim Thema Rekursion sehen, dass es hier nicht nur darum geht, Regeln etwas kürzer aufschreiben zu können. Das Pattern-Matching ist letztlich die Voraussetzung dafür, dass sich Rekursion in Prolog überhaupt elegant benutzen lässt.

Und über das Pattern-Matching kann man benannte Parameter realisieren, ohne dass Prolog dieses Konzept direkt unterstützt:

fuelle_liste([Wert], mit:1, mal:Wert) :- !.
fuelle_liste(Liste, mit:Anzahl, mal:Wert) :- AnzahlRed is Anzahl - 1, fuelle_liste(Liste2, mit:AnzahlRed, mal:Wert), Liste = [Wert|Liste2].

So kann man jetzt die Abfrage sprechend formulieren:

?- fuelle_liste(Liste, mit:4, mal:a).

Liefert “[a, a, a, a]”. Hier sieht man außerdem eine Besonderheit von Prolog. Wenn man Berechnungen durchführt, darf man diese nicht mit = auf eine Variable zuweisen. Stattdessen muss man is verwenden. Das Ausrufezeichen ! ist übrigens der Cut-Operator. Aber um den kümmern wir uns später.

Noch eine Schmankerl zum Schluss: Regeln die immer “true” liefern, unterscheiden sich nicht von Fakten, so dass wir die Regel “liste” noch etwas kürzer schreiben können:

liste([H,T], H, T). 

Entry filed under: 1. Tags: .

Prolog-Grundzüge 3: Listen Prolog-Grundzüge 5: Rekursion

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: