20.01.2015 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!