Skript (Fassung vom 4.4.2011) - Lehr- und Forschungsgebiet ...
Skript (Fassung vom 4.4.2011) - Lehr- und Forschungsgebiet ...
Skript (Fassung vom 4.4.2011) - Lehr- und Forschungsgebiet ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
dass Variablen auf der linken Seite von Gleichungen auftreten. Die Bedingung t ∉ V ist<br />
hierbei nötig, um eine unendliche Anwendung dieser Regel zu verhindern.<br />
Die letzte Regel verwendet Gleichungen x = t, die bereits in gelöster Form sind, um<br />
diese Teillösung auf den Rest des Unifikationsproblems anzuwenden. Dies ist natürlich nur<br />
sinnvoll, wenn die Variable x auch noch im restlichen Unifikationsproblem auftritt (ansonsten<br />
ließe sich die Regel unendlich oft anwenden). Die Bedingung x ∉ V(t) bezeichnet man<br />
als Occur Check, da sie überprüft, ob die Variable x in dem mit ihr zu unifizierenden Term<br />
t vorkommt. Falls dies der Fall wäre <strong>und</strong> t ≠ x ist, so wäre das Unifikationsproblem nicht<br />
lösbar <strong>und</strong> man spricht von einem Occur Failure. Der Gr<strong>und</strong> ist, dass bei jeder Substitution<br />
σ der Term xσ immer ein echter Teilterm von tσ ist. Ein Beispiel ist das (unlösbare)<br />
Unifikationsproblem x = f(x).<br />
Es gibt insgesamt zwei Gründe, warum ein Unifikationsproblem unlösbar sein kann.<br />
Neben dem Occur Failure gibt es den Clash Failure, der entsteht, wenn zwei Terme mit<br />
verschiedenem führendem Funktionssymbol miteinander unifiziert werden sollen. Beispielsweise<br />
sind f(x) <strong>und</strong> g(y,z) offensichtlich nicht miteinander unifizierbar.<br />
Beispiel 5.1.8 Das folgende Beispiel illustriert die Arbeitsweise der obigen Regeln, um<br />
das Unifikationsproblem g(f(a),g(x,x)) = g(x,g(x,y)) zu lösen:<br />
{g(f(a),g(x,x)) = g(x,g(x,y))} =⇒ Termreduktion<br />
{f(a) = x,g(x,x) = g(x,y)} =⇒ Vertauschen<br />
{x = f(a),g(x,x) = g(x,y)} =⇒ Variablenreduktion<br />
{x = f(a),g(f(a),f(a)) = g(f(a),y)} =⇒ Termreduktion<br />
{x = f(a),f(a) = f(a),f(a) = y} =⇒ Löschen<br />
{x = f(a),f(a) = y} =⇒ Vertauschen<br />
{x = f(a),y = f(a)}<br />
Manerkennt,dassaufdieseWeisedasUnifikationsproblemingelösteFormüberführtwurde.<br />
Mit Hilfe der Transformationsregeln aus Def. 5.1.7 erhält man direkt einen Unifikationsalgorithmus,<br />
vgl. [Rob65, MM82]. Hierzu wendet man auf das zu lösende Unifikationsproblem<br />
S beliebig Transformationsregeln an, solangedies möglich ist. Hierbei gibt esnatürlich<br />
Indeterminismen, da man z.B. im obigen Beispiel im dritten Schritt auch “Termreduktion”<br />
vor der “Variablenreduktion” hätte anwenden können. Sofern man zum Schluss ein Unifikationsproblem<br />
S ′ in gelöster Form erhält, so liest man daraus den Unifikator σ S ′ ab, der<br />
dann auch ein allgemeinster Unifikator für das ursprüngliche Problem ist. Ist das Resultat<br />
nicht in gelöster Form, so ist das Unifikationsproblem nicht lösbar.<br />
Algorithmus UNIFY(S)<br />
Eingabe: Ein Unifikationsproblem S.<br />
Ausgabe: Ein allgemeinster Unifikator von S, sofern S lösbar ist <strong>und</strong> sonst “False”.<br />
1. Solange es ein S ′ mit S =⇒ S ′ gibt, setze S := S ′ <strong>und</strong> gehe zu 1.<br />
2. Falls S in gelöster Form ist, dann gib σ S aus.<br />
Sonst gib “False” aus.<br />
Der folgende Satz zeigt die Korrektheit des Verfahrens.