• Keine Ergebnisse gefunden

Im Folgenden stellen wir eine Methode zur Darstellung eines CH-Ausdrucks als Graphen vor.

Definition 3.2.

Sei s ein CH-Ausdruck, wir beschreiben die Konstruktion von Gs, den beschrifteten gerichteten Graphen entsprechend zu s.

Für jeden Unterausdruck von s konstruieren wir einen Knoten. Die Variablen in s sind in drei Kategorien unterteilt:

{x1, ..., xk} : Menge der freien Variablen {y1, ..., ym} : lambda gebundene Variablen {z1, ..., zn} : letrec gebundene Variablen und seiV(s) die Union der drei Mengen.

Seic1, ..., ck der Konstruktoren und Funktionssymbole vorkommend in s, q sei die maxi-male Stelligkeit von diesen Symbolen. Der LDG G(s)hat die Labelmenge

L={var, lamvar, lvar, body, letvar, bind, letrec, in, λ}∪{c1, ..., ck}∪{1, ..., q}∪{x1, ..., xk}.

Für die VariablewV ar(s) gibt es einen KnotenN(w) im Graphen G(s).

Wir setzen ein:node(w) :=N(w).

Für jede freie Variablexisetzen wirlab(N(xi)) :=xi, für jede lambda gebundene Variable yi setzen wir lab(N(yi)) =lamvar und für jede letrec gebundene Variable zi setzen wir lab(N(zi)) =letvar ein.

Für die Konstruktion des Graphen G(s), jeden Unterausdrucks inspiziert entsprechend den folgenden Fällen (Variablen haben wir oben vorgestellt):

I Wenn der Unterausdruck ein λ x.r ist, dann konstruieren wir einen neuen Knoten v mit lab(v) :=λund ziehen die Kanten (v, node(x), lvar),(v, node(r), body). Für den gesamten Unterausdruck setzen wirnode(λ x.r) :=v ein.

IWenn der Unterausdruck ein letrec ist (letrec x1 =s1...., xn=sn in t), dann setzen wir einen neuen Knoten u für den gesamten Unterausdruck mit lab(u) := letrec, d.h.

node(letrec x1 =s1...., xn=sn in t) :=u. Für jedenxi einen Knotennode(si) konstruie-ren mit label lab(xi) :=letvar. si und t sind selbst CH-Ausdrücke. Diese werden in dem entsprechenden Fall (var, letrec, lamda, constr) rekursiv behandelt.

Die Kanten werden wie folgt definiert:

(u, node(xi), var) : Kante vom Knoten u zunode(xi) mit dem label var (u, node(t), in) : Kante von Knoten u zunode(t) mit dem label in (node(xi), node(si)) : Kante vonnode(xi) zunode(si) mit dem label bind.

Jetzt schauen wir den letzten Fall eines syntaktisch korrekten CH-Unterausdrucks an.

IWenn der Unterausdruck ein c(s1, ..., sn) ist, dann konstruiere einen neuen Knoten node(c(s1, ..., sn)) :=ufür den gesamten Unterausdruck mit dem label(u):= c. Konstruiere ebenfalls für jedes Argumentsieinen Knoten. Zu jedem Knotennode(si) wird vonnode(c) eine Kante mit den label(si) :=N umi gezogen. Hier gilt, dass auch die si gültige CH-Ausdrücke sind und werden dementsprechend behandelt, um daraus einen Untergraphen zu konstruieren.

Graphisch entsprechen die oben eingeführten Konstruktionen folgenden Fällen:

sCH;s:=x |λx.s|letrec x1=s1, ...xn=sn in t |c(s1...sarc). mit (ar'arity), fallss:= Variable wird einfach ein Knoten mit den Variablennamen erstellt.

lambda

Beispiel:Für den CH-Ausdruck letrec x=y, y=z in x, der entsprechender LDG ist G= (V, E, L, lab), wobei L={var, lamvar, lvar, body, letvar, bind, letrec, in, λ, z},V = {v1, v2, v3, v4},E ={(v4, v1, var),(v4, v2, var),(v1, v2, bind),(v2, v3, bind),(v4, v1, in)}, undlab=v17→letvar, v27→letvar, v37→z, v47→letrec ist. Graphisch entspricht diese Beschreibung dem folgenden Graphen:

letvar bind letrec in

var var

letvar bind z

Abbildung 10: CH-Ausdrucks-Beispielgraph

Bis jetzt haben wir gezeigt, dass das CH-alpha-Äquivalenz-Problem GI-hart ist, indem wir das GI-Problem für allgemeine ungerichtete unbeschriftete Graphen effizient in CH-Alpha-Äquivalenz-Problem transformiert (polynomielle Reduktion) haben. Die Modellierung CH-Ausdrücke als Graphen mittels der Definition 3.2. zeigte, dass die konstruierten Gra-phen LDGs sind. Daher die Vermutung (Beweis), dass das CH-alpha-Äquivalenz-Problem in GI liegt.

Proposition 3.2. CH-alpha-Äquivalenz ist in GI.

(Beweis siehe [1] Propostion 3.7.)

4 Ein effizienter Algorithmus für Ausdrücke ohne Garbage

Die bisherigen Ergebnisse zeigten, dass die allgemeinen CH-Ausdrücke ein hartes Alpha-Äquivalenz-Problem haben. Die Frage, ob zwei CH-Ausdrücke bis zum Entfernen von nicht verwendeten Bindungen alpha-äquivalent sind, kann jedoch effizient beantwortet werden, wie wir sehen werden. Konkret definieren wir die folgenden Ersetzungsregeln auf CH-Ausdrücke; garbage collection (gc), dabei werden nicht verwendete Bindungen (garbage) iterativ entfernt.

4.1 Garbage Collection

Garbage collection (gc) ist die Entfernung unbenutzter Bindungen (gc1) letrec x1 = s1, ..., xn=sn, y1=t1, ..., ym=tm in tm+1

Dieser Schritt besteht darin die Variablen xi, die in Term tm+1 body nicht gebraucht werden, zu löschen. Nach diesem Schritt haben wir einen Ausdruck, wo jede definierte Bindung im letrec Umgebung auch im body eingesetzt wird. Die Syntax von CH erlaubt zwar keine leeren letrecs, aber Bindungen zu definieren, die nicht in body eingesetzt werden, ist erlaubt wie wir gesehen haben. Diese werden dann entfernt. Was danach entsteht ist ein Ausdruck, was nur Bindungen hat, die in body benutzt werden, oder auch einen leeren letrec Term. In diesem Fall besteht der letrec Ausdruck nur aus letrec und body, z.B.: letrec in tm+1. Für diesen durchaus möglichen Fall, definieren wir Schritt zwei der „ Garbage collection“ (gc2).

(gc2) letrec x1=s1, ..., xn=sn in t−→gc t wenn F V(t)∩x1, ..., xn=∅.

Da Letrecs auch verschachtelt vorkommen können, könnte es sein, dass in body von einem leeren letrec wieder einen leerer letrec vorkommt oder auch eine Kette von leeren Letrecs.

Es ist einfach zu überprüfen, dass durch →gc auf CH induziertes Ersetzungssystem konfluent ist und immer terminiert, d.h. es gibt nur eine gc-Normalform für einen letrec bzw. CH-Ausdrucks. Denn nur letrec (Unter-)Terme können „garbage“ enthalten oder auch nicht. Wenn ein CH-Ausdruck kein „garbage“ enthält, dann liegt er bereits in der Normalform und kein gc-Ersetzungsregel kann auf ihn angewendet werden. Man sagt der CH-Ausdruck ist „garbage free“. Jeder CH-Ausdruck t kann in polynomieller Zeit in die Normalform überführt werden. Die gc-Redexes (letrecs) können effizient ermittelt und die gc-Ersetzungsregeln können mit der „innermost-Strategie“ auf jeden letrec-Ausdruck angewendet werden. Dies kann in O(n log n) durchgeführt werden, wobei n die Größe der Ausdrücke ist.

s1

s2

s3

s4

gc∗

gc gc

gc∗ gc∗

Abbildung 11: gc - Konfluenzeigenschaft

Lemma 4.1. Sei t ein CH-Ausdruck, eine alpha-äquivalente gc-Normalform von t, kann es in O(n log n) berechnet werden.

Beweis.

Konstruiere zuerst den LDGG(t) entsprechend der Definition 3.2., markiere dann alle Knoten inG(t), die vom Knoten(t) aus erreichbar sind, ohne die Verwendung von var-Kanten. Das erfordert eine Laufzeit vonO(n log n) mit n=|G(t)|, wenn eine effiziente Datenstruktur zur Speicherung der Knoten benutzt wird. Die unmarkierten Knoten sind demzufolge „garbage“ und müssen entfernt werden, genauso wie die Kanten die zu solchen Knoten führen. Letrec-Knoten die keine ausgehenden var-Kanten haben, werden durch deren nicht leeren body ersetzt, d.h. alle in solchen letrec-Knoten eingehenden Kanten werden umgeleitet zu den Knoten für den entsprechenden In-Ausdruck. Der resultierte Graph ist ein gc-free LDG G0. Die Traversierungsprozedur (plus einige lookups, um bereits markierte Knoten nicht nochmal zu besuchen) erfordertO(n log n) mitn=|G(t)|.

Der gc-freie Ausdruck entsprechend zu t kann dann aus G0 rekonstruiert werden, was immer möglich ist.

Liegt aber ein CH-Ausdruck t bereits frei von unbenutzten Bindungen (in gc-Normalform) vor, dann ist der aus t konstruierten LDG entsprechend zu Definition 3.2., der gc-free LDG von t ist.

Es ist deutlich zu sehen, dass die Freiheit von unbenutzten Bindungen in einem CH-Ausdruck bewirkt, dass jeder Knoten im Graphen, ohne Benutzung von var-Kanten, vom Startknoten aus erreichbar ist.

Also die konstruierten gc-free-LDGs eines CH-Ausdrucks weisen folgende Eigenschaften auf; sie besitzen einen Startknoten, von dem aus alle anderen Knoten des Graphen erreichbar sind und deren ausgehenden Kanten geordnet sind (siehe Definition 3.2.) bis auf die ausgehenden Kanten von letrec Knoten, sprich den var-Kanten.

Im folgenden Abschnitt zeigen wir, dass das Alpha-Äquivalenz-Problem für garbage-free-CH-Ausdrücke effizient entschieden werden kann.