#include "head.html"
#include "../src/Term.hs"Wir können substituieren, das heißt, eine Abbildung von Variablen auf Terme anwenden.
#include "../src/Subst.hs"Nun fragen wir uns, ob zwei gegebene Terme t1 und t2 unifizierbar sind, d. h. ob es ein s :: Subst gibt, so daß apply s t1 = apply s t2. Wir wissen, daß es in solch einem Fall sogar (bis auf Umbenennungen) genau einen allgemeinsten Unifikator s gibt.
Um den zu finden, verwenden wir einen naiven Algorithmus: wir unifizieren von links nach rechts und wenden jeweils die festgelegten Substitutionen sofort im noch zu unifizierenden Teil an. Natürlich gibt es Paare von nicht unifizierbaren Termen, deswegen ist der Ergebnistyp Maybe Subst.
Wieder (vergleiche das Zählen im Baum) geht es um Nacheinanderausführung von Rechnungen (erst linke Teilbäume, dann rechte unifizieren). Diese Kopplung geschieht durch das bind in der Monade Maybe: Wenn die Rechung erfolglos ist, setzen wir sie nicht fort; sonst tun wir es.
instance Functor Maybe where fmap f Nothing = Nothing; fmap f (Just x) = Just (f x) instance Monad Maybe where return x = Just x Nothing >>= f = Nothing; Just x >>= f = f xJetzt benutzen wir die do-Notation (eigentlich nur in der allerletzten Klausel des folgenden Programms).
#include "../src/Unify.hs"Aufgaben (von leicht bis sehr schwer)
Wir können leicht einen Matching-Algorithmus aufschreiben, indem wir den vom Unifizieren nehmen und alle Fälle löschen, die sich mit Variablen im zweiten Argument beschäftigen.
Es stellt sich heraus, daß das viel schwieriger ist, bereits Unifikation zweiter Ordnung ist unentscheidbar (durch Reduktion vom Postschen Korrespondenzproblem).
Bei einigen (an sich wünschenswerten) Erweiterungen des Haskell-Typ- und Konstruktor-Klassen-Systems muß man das berücksichtigen. Erlaubt man zuviel, muß der Compiler unter Umständen Unifikatoren zweiter Ordnung (von Typausdrücken) bestimmen, und das geht eben nur mit passenden Einschränkungen.
Die Entscheidbarkeit vom Matching verschiedener Ordnung ist Gegenstand aktueller Forschungen (Siehe RTALOOP TODO: Link). Sie ist bis vierter Ordnung entscheidbar, mit Baum-Automaten, und darüber ist es offen. Diplomarbeit gefällig?
Während das volle Unifizieren unentscheidbar ist, ist die Frage nach der Lösbarkeit solcher Baumgleichungen offen. (TODO: Link einfügen) Diplomarbeit? #include "foot.html"