Prolog-Grundzüge 4: Pattern Matching
Juli 20, 2009 at 8:09 nachmittags Hinterlasse einen Kommentar
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).
Trackback this post | Subscribe to the comments via RSS Feed