Gleichungsspezifikationen Kongruenzabschluss fur ... · Deduktion, SS 10, Folien TES, Seite 18,...

Post on 11-Aug-2019

216 views 0 download

Transcript of Gleichungsspezifikationen Kongruenzabschluss fur ... · Deduktion, SS 10, Folien TES, Seite 18,...

Ubersicht

• Gleichungsspezifikationen

• Kongruenzabschluss fur Grundtermgleichungen

• Kritische Paare und Knuth-Bendix-Vervollstandigung

• Orthogonale Termersetzungssysteme

Deduktion, SS 10, Folien TES, Seite 1, 13. Juli2010

Gleichungsspezifikationen

Eine (Gleichungs-)Spezifikation ist ein Paar spec = (Σ, E), wobei

• Σ = (S, F,arity) eine Signatur

• E = {u1 = v1, . . .} ein Gleichungssystem uber Σ und einem System

von Variablen V, d.h.

– ui, vi ∈ TermS(F,V) fur ein S ∈ S

Deduktion, SS 10, Folien TES, Seite 2, 13. Juli2010

Σ-Algebra

Signatur Σ = (S, F,arity), System von Variablen V , Spezifikation

spec = (Σ, E)

Eine Σ-Algebra A = (A, F ) besteht aus

• Tragermenge A =⋃

S∈SAS mit AS 6= ∅ und AS ∩AS′ = ∅ fur S 6= S′.

• Menge von Funktionen F = {f | f ∈ F}, so dass fur arity(f) =

S1 . . . Sn → S gilt, dass f eine Funktion f : AS1× . . .×ASn → AS ist.

Deduktion, SS 10, Folien TES, Seite 3, 13. Juli2010

Interpretation, Modell

Eine Interpretation ϕ zur Σ-Algebra A ist gegeben durch ϕ : V → A

wobei ϕ : VS → AS fur alle S ∈ S

Erweiterung auf Terme:

ϕ(f) = f , falls f eine Konstanteϕ((f(t1, . . . , tn)) = f(ϕ(t1), . . . , ϕ(tn)), sonst.

Σ-Algebra A ist ein Modell von spec = (Σ, E),

falls fur jede Interpretation ϕ gilt:

ϕ(s) = ϕ(t) fur alle s = t ∈ E.

Deduktion, SS 10, Folien TES, Seite 4, 13. Juli2010

Semantische E-Gleichheit

Sei spec = (Σ, E) eine Spezifikation.

• Σ-Algebra A erfullt eine Gleichung s = t falls fur jede Interpretation

ϕ gilt: ϕ(s) = ϕ(t) gilt in A.

• s, t sind E-gleich, falls jedes Modell von spec die Gleichung s = t

erfullt. Schreibweise: E |= s = t

Deduktion, SS 10, Folien TES, Seite 5, 13. Juli2010

Operationale E-Gleichheit

Sei spec = (Σ, E) eine Spezifikation.

t1E−→ t2 gdw.

formal:

es gibt p ∈ Pos(t1), s1 = s2 ∈ E und Substitution σ

mit σ(s) = t1/p und t2 = t1[σ(s2)/p]

informal:

t2 entsteht aus t1 durch Anwenden einer Gleichung

auf einen Teilterm von t1

t1 =E t1 gdw. t1E,∗←−→ t2

Schreibweise: E ` t1 = t2

Deduktion, SS 10, Folien TES, Seite 6, 13. Juli2010

Satz von Birkhoff

Fur jede Spezifikation spec = (Σ, E) gilt

E ` s = t gdw. E |= s = t

Deduktion, SS 10, Folien TES, Seite 7, 13. Juli2010

Unentscheidbarkeit

Gleichheit von Termen bzgl. einer endlichen Menge von Gleichheits-

axiomen E ist unentscheidbar.

D.h. das Wortproblem in beliebigen Gleichheitstheorien (mit endlichen

vielen Axiomen) ist unentscheidbar.

Aber: Es gibt Falle in denen das Wortproblem entscheidbar ist!

Deduktion, SS 10, Folien TES, Seite 8, 13. Juli2010

Zu betrachtende entscheidbare Falle

• endlich viele Grundtermgleichungen

– Berechne Congruence Closure

• konvergentesE−→

– Zeige Konvergenz. Ausreichend: Terminierung und lokale Kon-

fluenz.

Methode fur lokale Konfluenz: Knuth-Bendix-Test

– oder: Erstelle konvergentesE′−→ mit

E′,∗←−→=

E,∗←−→,

Methode: Knuth-Bendix-Vervollstandigung

Deduktion, SS 10, Folien TES, Seite 9, 13. Juli2010

Wortproblem auf endlicherMenge von

Grundtermgleichungen

Deduktion, SS 10, Folien TES, Seite 10, 13. Juli2010

Endliches Grundtermgleichungssystem

Grundterm : Term ohne Variablen

Grundtermgleichung s = t: s, t Grundterme

Fur Grundtermgleichungssystem E gilt: =E ist der Kongruenzabschluss

CC(E) von E, d.h. die kleinste Kongruenz uber Term(Σ,V) die E

enthalt.

Deduktion, SS 10, Folien TES, Seite 11, 13. Juli2010

Berechnung des Kongruenzabschlusses

Sei EG Grundtermgleichungssytem. Berechnung von CC(EG)

Fur

refl(E) = {s = s | s ∈ Term(Σ,V)}symm(E) = {t = s | s = t ∈ E}trans(E) = {s = t | s = r, r = t ∈ E}cong(E) = {f(s1 . . . sn) = f(t1 . . . tn) | si = ti ∈ E}cl(E) = E ∪ refl(E) ∪ symm(E) ∪ trans(E) ∪ cong(E)

gilt CC(EG) =⋃

i≥0cli(EG) wobei

cl0(EG) = EG

cli(EG) = cl(cli−1(EG)) fur i > 1

Terminiert nicht immer, da u.U. CC(EG) unendlich groß!

Deduktion, SS 10, Folien TES, Seite 12, 13. Juli2010

Losung

Um u =EGv zu entscheiden, braucht man nicht alle Terme aus CC(EG)

Es reicht nur die Terme aus CC(EG) berechnen, die benotigt werden.

Das sind gerade alle Unterterme der Gleichungen aus EG und von u

und v.

subterms(s) = {s/p | p ∈ Pos(s)}subterms(s = t) = subterms(s) ∪ subterms(t)

Deduktion, SS 10, Folien TES, Seite 13, 13. Juli2010

Berechnung des relevanten Teils

Sei EG Grundtermgleichungssytem. Frage: Gilt u =EGv ?

Sei S = subterms(EG) ∪ subterms(u) ∪ subterms(v)

Fur

refl(E) = {s = s | s ∈ S}symm(E) = {t = s | s = t ∈ E}trans(E) = {s = t | s = r, r = t ∈ E}cong(E) = {f(s1 . . . sn) = f(t1 . . . tn) | si = ti ∈ E}cl(E) = E ∪ refl(E) ∪ symm(E) ∪ trans(E) ∪ cong(E)

gilt: u =EGv gdw. (u, v) ∈

⋃i≥0

cli(EG) wobei

cl0(EG) = EG

cli(EG) = cl(cli−1(EG)) ∩ (S × S) fur i > 1

terminiert, da S endlich und cli(EG) ⊆ cli+1(EG) ⊆ (S × S)

Deduktion, SS 10, Folien TES, Seite 14, 13. Juli2010

Programm in Haskell (Ausschnitt)

Datentyp fur Terme:

data Term = Fn String [Term] -- Funktionssymbol mit Argumenten

| Var String -- Variablen

Z.B. f(x, g(y)) als Term: Fn "f" [Var "x", Fn "g" [Var "y"]]

Gleichungen:

type Gleichung = (Term,Term)

Deduktion, SS 10, Folien TES, Seite 15, 13. Juli2010

Operationen fur Reflexivitat, Symmetrie, Transitivitat und Kongruenz

-- s: Alle Unterterme

-- e: Gleichungen

-- fs: (Alle Funktionssymbole mit Stelligkeiten)

refl s e = [(t,t) | t <- s]

symm s e = [(t1,t2) | (t2,t1) <- e]

trans s e = [(t1,t3) | (t1,t2) <-e, t3 <-s, (t2,t3) ‘elem‘ e]

cong fs s e = [(Fn f a, Fn f b) |

(f,l) <- fs,

(a,b) <- nub (map unzip (gen l e)), l > 0]

-- berechnet Liste aller Paare ([s1,...,sl],[t1,...,tl])

-- mit (si,ti) aus e

Eine Iteration:

oneIter fs s e = let s_X_s = [(t,r) | t <- s, r <- s]

ohneS q = intersect q s_X_s

in e ‘union‘ (ohneS $ refl s e)

‘union‘ (ohneS $ symm s e)

‘union‘ (ohneS $ trans s e)

‘union‘ (ohneS $ cong fs s e)

Gesamten Kongruenzabschluss berechnen:

closure e u v =

let

s = nub $ unterterme u ++ unterterme v ++ gleichungenUT e

...

go e = let eneu = nub (oneIter fs s e)

in if eqSet eneu e -- e = eneu ??

then e -- ja, dann fertig (Fixpunkt erreicht)

else go eneu -- nein, dann weiter mit eneu

in go e

Beispiel: Binare Addition

e = parseEq "add(0,0)=0; add(0,1)=1; add(1,0)=1; add(1,1)=0"

u = parseTerm "add(add(add(0,1),add(1,0)),1)"

v = parseTerm "1"

closure e u v ergibt

[(add(0,0),0), (add(0,1),1), (add(1,0),1), (add(1,1),0),(add(add(add(0,1),add(1,0)),1),add(add(add(0,1),add(1,0)),1)),(add(add(0,1),add(1,0)),add(add(0,1),add(1,0))), (add(0,1),add(0,1)), (0,0), (1,1),(add(1,0),add(1,0)), (add(0,0),add(0,0)), (add(1,1),add(1,1)), (0,add(0,0)),(1,add(0,1)), (1,add(1,0)), (0,add(1,1)), (add(add(0,1),add(1,0)),add(1,1)),(add(1,1),add(add(0,1),add(1,0))), (add(0,0),add(1,1)), (add(0,1),add(1,0)),(add(1,0),add(0,1)), (add(1,1),add(0,0)), (add(add(0,1),add(1,0)),0),(0,add(add(0,1),add(1,0))), (add(add(0,1),add(1,0)),add(0,0)),(add(0,0),add(add(0,1),add(1,0))), (add(add(add(0,1),add(1,0)),1),add(0,1)),(add(0,1),add(add(add(0,1),add(1,0)),1)), (add(add(add(0,1),add(1,0)),1),1),(add(add(add(0,1),add(1,0)),1),add(1,0)), (1,add(add(add(0,1),add(1,0)),1)),(add(1,0),add(add(add(0,1),add(1,0)),1))]

Deduktion, SS 10, Folien TES, Seite 18, 13. Juli2010

Wortproblem fur konvergentesReduktionssystem E−→

Deduktion, SS 10, Folien TES, Seite 19, 13. Juli2010

Konvergenz impliziert Entscheidbarkeit

Spezifikation spec = (Σ, E). SeiE−→ konvergentes Reduktionssystem.

Dann ist das Wortproblem entscheidbar: Frage: Gilt u =E v? Es reicht

zu testen, ob gilt u↓= v↓. Denn fur konvergentesE−→ gilt u↓= v↓ gdw.

uE←−→ v

Frage: Wie entscheidet man, obE−→ konvergent ist?

• Im allgemeinen unentscheidbar!

• Hinreichende Bedingung: Zeige

1.E−→ ist noethersch. (zeige Terminierung)

2.E−→ ist lokal konfluent. (Methode: Knuth-Bendix-Test)

Deduktion, SS 10, Folien TES, Seite 20, 13. Juli2010

Kritische Paare

Zwei (variablendisjunkte) Regeln: • l1 → r1 • l2 → r2

Sei u ∈ Pos(l1), so dass• l1/u 6∈ V und• l1/u und l2 sind unifizierbar

Sei σ ∈ mgu(l1/u, l2).

Dann heißt σ(l1) eine Uberlappung von l2 → r2 in l1 → r1

Kritisches Paar zu l1 → r1 und l2 → r2: 〈σ(r1), σ(l1)[u→ σ(r2)]〉

Uberlappungstripel 〈σ(r1), σ(l1), σ(l1)[u→ σ(r2)]〉

CP(R) = Menge aller kritischen Paare, die man aus Regeln in R bilden kann

Deduktion, SS 10, Folien TES, Seite 21, 13. Juli2010

Kritische Paare

Deduktion, SS 10, Folien TES, Seite 22, 13. Juli2010

Kritische Paare

Deduktion, SS 10, Folien TES, Seite 23, 13. Juli2010

Kritische Paare

Deduktion, SS 10, Folien TES, Seite 24, 13. Juli2010

Kritische Paare

Deduktion, SS 10, Folien TES, Seite 25, 13. Juli2010

Kritische Paare

Deduktion, SS 10, Folien TES, Seite 26, 13. Juli2010

Kritische Paare in Haskell (Ausschnitt)-- start fuer (l1,r1) (l2,r2) mit-- cp l1 id l2 r1 r2

cp :: Term -> (Term -> Term) -> Term -> Term -> Term -> [(Term,Term)]cp (Var v) lcon l2 r1 r2 = []cp l1@(Fn f args) lcon l2 r1 r2 =let rek = cpL [] argsincase unify [(l1,l2)] ofNothing -> rekJust sigma -> (apply sigma r1 , apply sigma (lcon (apply sigma r2))) : rek

wherecpL bs [] = []cpL bs (a:as) = (cp a (\x -> lcon (Fn f (bs ++ [x] ++ as))) l2 r1 r2)

++ (cpL (bs ++ [a]) as)

-- Substitutionapply [] t2 = t2apply ((v,t):xs) t2 = apply xs (subst v t t2)

subst v t (Var v’)| v == v’ = t| otherwise = Var v’

subst v t (Fn f args) = Fn f (map (subst v t) args)

Deduktion, SS 10, Folien TES, Seite 27, 13. Juli2010

Unifikation in Haskellunify :: [(Term,Term)] -> Maybe [(String,Term)]unify [] = Just []unify (((Fn a argsA),(Fn b argsB)):xs)| a == b = unify $ (zip argsA argsB) ++ xs -- Dekomposition| otherwise = Nothing -- Fail

unify ((Var v,Var v’):xs)| v == v’ = unify xs -- Loeschen v=v

unify ((Var v,t):xs)| v ‘occursInNonVar‘ t = Nothing -- Fail (Occurs Check)| otherwise = case unify (map (\(l,r) -> (subst v t l, subst v t r)) xs) of

-- Einsetzen + Rekursiver AufrufJust ys -> Just ((v,apply ys t):ys) -- Voll instanziierenNothing -> Nothing -- Fail

unify ((t,Var v):xs) = unify ((Var v,t):xs) -- Drehen t=v -> v=t

-- Occurs CheckoccursInNonVar v (Var _) = FalseoccursInNonVar v t = v ‘elem‘ (varsOf t)

-- Variablen eines Terms berechnenvarsOf (Var v) = [v]varsOf (Fn f args) = concatMap varsOf args

Deduktion, SS 10, Folien TES, Seite 28, 13. Juli2010

Eigenschaften Kritischer Paare

Zwei Terme s und t heißen zusammenfuhrbar, falls es ein z gibt mit

s∗−→ z und t

∗−→ z. (Notation s↓↓t).

Critical Pair Lemma von Knuth und Bendix:

Aus t1R←− t

R−→ t2 folgt t1↓↓t2 oder t1CP (R)←−→ t2.

Satz:

• Regelsystem R ist genau dann lokal konfluent,

wenn alle kritischen Paare zusammenfuhrbar sind.

• Noethersches R ist genau dann konfluent (und auch konvergent),

wenn alle kritischen Paare zusammenfuhrbar sind.

Deduktion, SS 10, Folien TES, Seite 29, 13. Juli2010

Knuth-Bendix-Test

Eingabe: Noethersches Regelsystem R.

Ausgabe: R ist Konfluent? ja / nein

1. Berechne CP(R).

2. Fur alle (s, t) ∈ CP(R):

Berechne s↓ und t↓Wenn s↓6= t↓, dann gebe Nein aus und breche ab

3. Gebe Ja aus

Deduktion, SS 10, Folien TES, Seite 30, 13. Juli2010

Einfacher Test fur Spezifikationen

spec = (Σ, E) Spezifikation,E−→ die operationale E-Gleichheit.

Wir wissen: WennE−→ konvergent, dann ist das Wortproblem fur spec

entscheidbar.

Methode:

1. Richte Gleichungen in E und zeige, dassE−→ terminierend.

2. Zeige lokale Konfluenz mit Knuth-Bendix-Test

Nachteil: Funktioniert oft nicht!

Deduktion, SS 10, Folien TES, Seite 31, 13. Juli2010

Knuth-Bendix-Vervollstandigung

Sei spec(Σ, E) Spezifikation,E−→ die operationale E-Gleichheit

1. Richte Gleichungen in E und finde Ordnung zum Nachweis, dassE−→ terminiert.

2. Berechne CP (E−→) und teste auf Zusammenfuhrbarkeit.

Seien E′ die nicht zusammenfuhrbaren kritischen Paare

3. Wenn E′ = ∅dann: stoppe mit Ausgabe

E−→,

sonst: gehe zu 1. mit E := E ∪ E′.

Deduktion, SS 10, Folien TES, Seite 32, 13. Juli2010

Knuth-Bendix-Vervollstandigung

Wenn die Vervollstandigung terminiert, dann gilt fur die AusgabeE′−→:

• E′−→ ist konvergent

• sE,∗←−→ t gdw. s

E′,∗←−→ t, d.h.

E′−→ entscheidet E.

Deduktion, SS 10, Folien TES, Seite 33, 13. Juli2010

Beispiel

Betrachte E = {f(g(x)) = g(x), f(f(x)) = g(x)}Richten der Gleichungen

E−→:= {f(g(x))→ g(x), f(f(x))→ g(x)},E−→ terminiert, da Termgroße strikt kleiner wird

Berechnen von CP(E−→):

• f(g(x))→ g(x) mit sich selbst: keine kritischen Paare

• f(g(x))→ g(x) mit f(f(x))→ g(x): keine kritischen Paare

• f(f(x))→ g(x) mit sich selbst:

f( f(x) ) //g(x)

f(f(y))��

g(y)

mgu:{x 7→ f(y)} f( f(f(y))

��

) //g(f(y))

f( g(y) )

Kritisches Paar 〈g(f(y)), f(g(y))〉

Deduktion, SS 10, Folien TES, Seite 34, 13. Juli2010

• f(f(x))→ g(x) mit f(g(y))→ g(y):

f( f(x) ) //g(x)

f(g(y))��

g(y)

mgu:{x 7→ g(y)} f( f(g(y))

��

) //g(g(y))

f( g(y) )

Kritisches Paar 〈g(g(y)), f(g(y))〉

Die Kritischen Paare 〈g(f(y)), f(g(y))〉 und 〈g(g(y)), f(g(y))〉 sind beide

nicht zusammenfuhrbar (daE−→:= {f(g(x))→ g(x), f(f(x))→ g(x)} )

Neues

E1 = { f(g(x)) = g(x),f(f(x)) = g(x),g(f(y)) = f(g(y)),g(g(y)) = f(g(y))}

Richten der Gleichungen

E1−−→ = { f(g(x))→ g(x),f(f(x))→ g(x),g(f(y))→ f(g(y)),g(g(y))→ f(g(y))}

terminiert: Ordnungen (Termgroße, Term als String)

Kritische Paare:

〈g(f(x)), f(g(x))〉,〈f(g(g(x))), g(f(g(x)))〉,〈g(f(x)), f(f(g(x)))〉,〈g(g(x)), f(f(g(x)))〉,〈g(g(x)), f(g(x))〉,〈f(g(g(x))), g(g(x))〉,〈f(g(f(x))), g(g(x))〉,〈f(g(f(x))), g(f(g(x)))〉

Alle zusammenfuhrbar, d.h.E1−−→ entscheidet E.

OrthogonaleTermersetzungssysteme

Deduktion, SS 10, Folien TES, Seite 37, 13. Juli2010

Lineare Termersetzungssysteme

Linearer Term := keine Doppelvorkommen der

selben Variablen.

Rewrite-Regel l→ r rechts-linear := r ist linear

Rewrite-Regel l→ r links-linear := l ist linear

Rewrite-Regel l→ r linear := l→ r ist recht- und links-linear

TES ist linear

(links-linear, rechts-linear)

:= alle Regeln sind linear

(links-linear,rechts-linear)

Z.B. sind die linken Seiten von Definitionen von Funktionen in funk-

tionalen Programmiersprachen linear ({fi(x1, . . . , xi,n) = ei})

Knuth-Bendix-Test benotigt Terminierung, um Konfluenz zu zeigen,

aber z.B. Programmiersprachen lassen i.A. auch nichtterminierende

Funktionen zu.

Deduktion, SS 10, Folien TES, Seite 38, 13. Juli2010

Konfluenzbeweis trotz Nichtterminierung

Methode: Zeige Konfluenz uber das Kriterium der starken Konfluenz.

Proposition

Wenn das TES R linear ist, und alle kritischen Paare

die starke Konfluenzbedingung erfullen,

dann ist das TES auch (stark) konfluent.

u∗~~~~

~~~~

~~ ∗��@

@@@@

@@@

x∗ @

@@

@ y∗��~

~~

~

z

u

~~~~~~

~~~~

��@@@

@@@@

@

x∗ @

@@

@ y

≤1��~~

~~

zkonfluent stark konfluent

Deduktion, SS 10, Folien TES, Seite 39, 13. Juli2010

Orthogonale TES

Ein TES heißt orthogonal, wenn es links-linear ist und keine kritischen

Paare hat.

Theorem

Jedes orthogonale Termersetzungssystem ist konfluent.

Deduktion, SS 10, Folien TES, Seite 40, 13. Juli2010

Funktionale Programmiersprachen

Funktionen in funktionalen Programmiersprachen sind links-linear und

haben keine kritischen Paare, wenn die Definition jeweils mit disjunkten

Pattern gemacht wird.

Man muss aber eine parallele Reduktion (mehrere Definitionseinset-

zungen auf einmal) zulassen

Die parallele Reduktion kann man als stark konfluent nachweisen, und

kann danach das Kriterium der starken Konfluenz verwenden.

Deduktion, SS 10, Folien TES, Seite 41, 13. Juli2010

Linkslinearitat ist notwendig als Voraussetzung

Beispiel: TES bestehend aus den Regeln

f(x, x) → af(x, g(x)) → bc → g(c)

Eigenschaften:

• Keine kritischen Paare

• nicht terminierend wg. c→ g(c)

• nicht links-linear (aber rechts-linear).

• Der Ausdruck f(c, c) hat als Normalform a und b,

d.h. das TES ist nicht konfluent

Deduktion, SS 10, Folien TES, Seite 42, 13. Juli2010

Funktionale Programmiersprachen

• Konfluente TES haben eindeutige Normalformen, wenn eine exi-

stiert.

• Konsequenz: Wenn die Regeln einer Programmiersprache orthogo-

nal sind, dann ist die Sprache deterministisch.

Deduktion, SS 10, Folien TES, Seite 43, 13. Juli2010

Programmiersprache mit letrec (1)

Regeln:

letrec . . . , x = t, . . . in C[x]→ letrec . . . , x = t, . . . in C[t]

letrec . . . , x = t, . . . , y = C[x], . . . in s→ letrec . . . , x = t, . . . , y = C[t], . . . in s

letrec . . . , y = C[x], . . . , x = t, . . . , in s→ letrec . . . , y = C[t], . . . , x = t, . . . , in s

Deduktion, SS 10, Folien TES, Seite 44, 13. Juli2010

Programmiersprache mit letrec (2)

Ist nicht konfluent:letrec x = g(y), y = h(x) in x

rrffffffffffffffffffffffff

++XXXXXXXXXXXXXXXXXXXXXXX

letrec x = g(y), y = h(g(y)) in x

��

letrec x = g(h(x)), y = h(x) in x

��

letrec x = g(y), y = h(g(y)) in g(y)

��

letrec x = g(h(x)), y = h(x) in g(h(x))

��letrec x = g(y), y = h(g(y)) in g(h(g(y)))

��

. . .

��

. . .

��

. . . in g(hg)n(y) . . . in (gh)n(y)

Deduktion, SS 10, Folien TES, Seite 45, 13. Juli2010