Hauptseminar: Automatisches Beweisen Kombination von Theorien nach Shostak Karolin Zabel [email protected] Aufbauend auf das Kongruenzabschlussverfahren wird Shostak’s Methode des automatischen Beweisens vorgestellt. Die Besonderheit an Shostak’s Verfahren ist, dass es nicht nur Probleme innerhalb einer Theorie lösen kann, sondern auch Kombinationen aus verschiedenen Theorien. Zunächst wird Shostak’s Verfahren für einzelne Theorien erklärt, anschließend für die Kombination mehrerer Shostak Theorien. 1. Historische Einordnung von Shostak’s Verfahren Anfang der 80er wurden vermehrt automatische Beweisverfahren für mathematische Beweise und Programm-Verifikationen entworfen. Dabei stellte sich häufig das Problem, dass die Formeln, die bewiesen werden sollten, Konstrukte aus verschiedenen semantischen Bereichen enthielten. Es entstanden zunächst Sonderlösungen für einzelne Misch-Theorien. Einer der ersten allgemeinen Ansätze für kombinierte Theorien stammt von Nelson und Oppen [NO]. Bei diesem Ansatz wurde die Information über die Gleichheit mittels gemeinsamer Variablen ausgetauscht. Robert E. Shostak folgte 1984 mit seiner Veröffentlichung „Deciding Combinations of Theories“[Sho84]. Sein Verfahren ist eine Abwandlung des Kongruenzabschluss Verfahrens und arbeitet mit einem sogenannten Kanonisierer. In seinem Papier mischt er die Theorie linearer Arithmetik mit cons, car und cdr aus der Theorie der Listen. Da in Shostak’s Original jedoch ein Fehler enthalten ist, stützt sich die folgende Ausführung auf [RS02]. 1 2. Begriffsdefinitionen In 2.1 werden allgemeine Grundbegriffe der Logik wiederholt. In 2.2 werden speziell für Shostak wichtige Definitionen gegeben. 2.1 Allgemeine Grundbegriffe der Logik Lineare Gleichungen werden auch als Gleichungen erster Ordnung bezeichnet, sie haben beispielsweise die Form a x + b = c x + d. In der Mathematik gibt es zwei verschiedene Quantoren, den Existenzquantor ∃ und den Allquantor∀. ∃ bedeutet ‚es gibt ein’ und ∀ heißt ‚für alle’. Die Junktoren sind T (verum, das Wahre) und ⊥ (falsum, das Falsche), ¬(nicht), ∧ (und), ∨ (oder) und → (wenn – dann). Das Zeichen ├ steht für Ableitbarkeit. S ├ F bedeutet: F ist aus S ableitbar. Für semantische Folgerungen steht das Zeichen |=. Die Notation S |= X bedeutet: Ist S eine Aussagenmenge und X eine Aussage, dann heißt X semantische Folgerung von S, wenn jede Aussage, die S wahr macht auch X wahr macht. |= X heißt „X ist gültig“. Von einer disjunktiven Normalform (DNF) spricht man, wenn eine Formel als Disjunktion von Konjunktionen vorliegt, z. B. (L11 ∧ . . . ∧ L1n) ∨ . . . ∨ (Lm1 ∧ . . . ∧ Lmn). Jede aussagenlogische Formel kann in disjunktive oder konjunktive Normalform gebracht werden. Äquivalenzrelationen sind reflexiv (x = x), symmetrisch (x = y ⇒ y = x) und transitiv (x = y ∧ y = z ⇒ x = z). 2.2 Begriffsdefinitionen für Shostak Shostak arbeitet mit der Prädikatenlogik. Daher werden hier nur einige wichtige Begriffe, die später verwendet werden kurz wiederholt. Eine Signatur Σ ist eine endliche Menge von Funktionssymbolen ΣF = { f, g, ...}und Prädikatssymbolen ΣP = {P, Q, ...}. Dabei wird n als die Stelligkeit (arity) der Funktion f(t1, .....tn) bezeichnet. Konstanten sind Funktionssymbole mit der Stelligkeit 0 und werden mit a, b,... bezeichnet. Eine atomare Formel oder ihre Negation wird als Literal bezeichnet. Ein Modell ist eine Interpretation einer Σ-Gleichung, wenn die Gleichung unter der Interpretation für jede Variablenbelegung erfüllt ist. 2 Eine Formel heißt gültig, wenn sie für jede Interpretation wahr ist, erfüllbar, wenn es eine Interpretation gibt, die sie wahr macht und unerfüllbar, wenn sie für keine Interpretation wahr ist. 3. Abstrakter Kongruenzabschluss vs. Shostak’s Verfahren Ganz allgemein ausgedrückt entscheiden beide Verfahren Aussagen der Form T ├ a = b, wobei T eine Sammlung von Gleichungen ist, und a und b Variablen und Funktionssymbole enthalten. Sind alle Funktionssymbole uninterpretiert, mit der Gleichheit (=) als einzigem Prädikat, reicht das Kongruenzabschlussverfahren aus, um die Subterme in Äquivalenzklassen einzuteilen. In der Praxis hat man es jedoch meist mit interpretierten und uninterpretierten Funktionssymbolen zu tun. Zum Beispiel ließe sich das Problem f3(x) = f(x) ├ f5(x) = f(x) mit dem Kongruenzabschlussverfahren lösen. Dagegen enthält f(x–1) –1 = x +1, f(y) + 1 = y –1, y + 1 = x ├ false Symbole aus verschiedenen Theorien: + und – kommen aus der linearen Arithmetik, f ist ein uninterpretiertes Funktionssymbol und false ist ein boolscher Ausdruck. Hier braucht man sowohl lineare Arithmetik, als auch das Kongruenzabschlussverfahren. Zunächst werden die Gleichungen mit linearer Arithmetik umgeformt: f(x–1) –1 = x +1 wird zu f(x–1) = x +2, f(y) + 1 = y –1 wird zu f(y) = y –2 und y+1=x wird zu x – 1 = y. Aus der Kongruenz folgt f(x-1) = f(y). Weiter mit linearer Arithmetik kommt man zu x + 2 = y – 2, was einen Widerspruch zu Gleichung drei, x – 1 = y, darstellt. Also ist false aus den drei Gleichungen ableitbar. Shostak bezieht sich in seinem Papier auf ein anderes Beispiel, anhand dessen später Shostak’s Algorithmus erklärt wird: 5 + car(x + 2) = cdr(x + 1) +3 Neben linearer Arithmetik ist hier auch noch die Theorie der Listen mit cons, car und cdr enthalten. Cons steht für construct pair, car liefert die erste Komponente zurück, cdr die zweite. Die Definition der Eigenschaften von cons, car und cdr lautet: (car (cons x1 x2)) = x1 (cdr (cons x1 x2)) = x2 (cons (car x) (cdr x)) = x Hat man zum Beispiel eine Liste primzahlen(2 3 5 7) definiert, liefert car primzahlen 2, cdr primzahlen (3 5 7) und car(cdr primzahlen)) 3. Shostak versuchte auch hier die Gleichung abwechselnd einen Schritt mit linearer Arithmetik und den nächsten nach der Theorie der Listen zu lösen. So soll die Gleichung nach x aufgelöst werden. (solveA) bzw. (solveL) heißt, die Gleichung wird arithmetisch bzw. nach der Theorie der Listen gelöst. 3 5 + car(x + 2) = cdr(x + 1) +3 (solveA) : (solveL) : (solveA) : car(x + 2) x+2 x = cdr(x + 1) – 2 = cons(cdr(x + 1) – 2, k) = cons(cdr(x + 1) – 2, k) – 2 In Zeile 2 wurde k eingeführt, weil man die rechte Seite von cons nicht kennt. k hat keine weitere Bedeutung. Da x jedoch am Ende immer noch auf der rechten Seite enthalten ist, hat man keine aufgelöste Form erreicht, d.h das Ergebnis ist nicht sinnvoll. Statt dessen bringt man beide Seiten in ihre kanonische Form. Die kanonische Form eines Ausdrucks ist eine spezielle Variante aus einer Menge äquivalenter Ausdrücke. Beispielsweise sind y + 1 = x, y = x – 1, y – x = -1 und x = y +1 äquivalent, wobei die letzte Variante hier die kanonische Form sei. Um die kanonische Form zu erhalten, substituiert man die einzelnen Terme durch neue Variablen. Diesen Vorgang bezeichnet man als Variablenabstraktion. So erhält man v3 = v6, mit v1 = x + 2, v2 = car(v1), v3 = v2 + 5, v4 = x + 1, v5 = cdr(v4) und v6 = v5 + 3. Im nächsten Schritt werden die Gleichungen in verschiedene Gruppen eingeteilt: S(SV ; SU ; SA ; SL ). In SV stehen die Gleichungen in kanonischer Form, SU enthält die uninterpretierten Funktionen, wie f und g, und ist in diesem Beispiel leer. SA enthält die Lösungen für die Theorie der linearen Arithmetik und SL die Lösungen für die Listentheorie. Dann ist SV = {x = x, v1 = v1 , v2 = v2 , v3 = v6 , v4 = v4 , v5 = v5 , v6 = v6}, SA = { v1 = x + 2, v3 = v2 + 5, v4 = x + 1, v6 = v5 + 3} und SL = { v2 = car(v1), v5 = cdr(v4)}. Da v3 und v6 in SV vereinigt werden, aber nicht in SA , lösen wir die Gleichung zwischen SA (v3) und SA (v6), d.h. solveA(v2 + 5 = v5 + 3). Das ergibt v2 = v5 – 2. Dieses Ergebnis wird in SA eingefügt: SA = { v1 = x + 2, v3 = v2 + 5, v4 = x + 1, v6 = v5 + 3, v2 = v5 – 2}. Es sind keine neuen Variablengleichungen mehr in SV ,SA oder SL . v2 und v5 haben beide verschiedene Formen in SA und SL . Das wird toleriert, da die Lösungen aus verschiedenen Theorien stammen und der Kanonisierer, der die Ausdrücke in ihre kanonische Form bringt, die jeweils passende Lösung auswählen kann. 4 Nun können wir überprüfen, ob der resultierende Lösungszustand die Originalgleichung verifiziert: Der Kanonisierer liefert v1 für x + 2 (aus SA ) und v2 für car(v1 ) (aus SL ). Der resultierende Term 5 + v2 wird zu v5 + 3, was die kanonische Form v6 (aus SA ) liefert. Auf der rechten Seite ist x + 1 äquivalent zu v4 in SA und car(v4) zu v5 mit SL . Die rechte Seite wird zu v5 + 3 vereinfacht und der Kanonisierer liefert daraus v6 (aus SA ). Die kanonischen Formen der linken und der rechten Seite sind also identisch. Damit hat man nachgewiesen, dass die Gleichung gültig ist. 4. Formale Methode nach Shostak Im Folgenden wird Shostak’s Methode formal beschrieben, zunächst für einzelne Shostak Theorien und im Anschluss für die Kombination mehrerer Theorien. 4.1 Einzelne Theorien nach Shostak Eine Theorie, die kanonisierbar und lösbar ist, heißt Shostak Theorie. Dazu zählen z.B. lineare Arithmetik, die Theorie der Listen und uninterpretierte Funktionen. Ein Kanonisierer σ bringt Terme in ihre Normalform, gleichbedeutende Terme werden in die selbe Form gebracht. Ein Terme ist kanonisch, wenn der Kanonisierer wieder die gleiche Form liefert σ(b) ≡ b. Ein Solver löst Gleichungen, indem er sie in gleichwertige Substitutionen abbildet. Eine Theorie T heißt kanonisierbar, wenn es ein berechenbares σ(a) gibt, so dass: • • • |= T a = b iff σ(a) = σ(b) vars(σ(a)) ⊆ vars(a) σ(b) ≡ b für jeden Subterm b von σ(a) Eine Gleichungsmenge E hat die Form {a1 = b1, ...., an = bn}. E ist funktional, wenn a1 = b1 , a2 = b2 ∈ E impliziert b1 ≡ b2 . Lookup liefert das kanonische Element zurück: b : a = b ∈ E Lookup: E (a) := a : sonst Anwendung: E[x] := E(x) E[f(a1, ...., an)] := E(f(E[a1], ...., E[an]) 5 Eine Lösungsmenge S ist eine funktionale Gleichungsmenge der Form: {x1 = b1,…., xn= bn}, mit xi ∉ vars(bj) für 1 ≤ i, j ≤ n. dom( ρ ) ist die Domain von ρ und definiert als {a | a = b ∈ ρ für jedes b}. Eine Variablenzuordnung ρ´ erweitert ρ , wenn dom( ρ ) ⊆ dom ( ρ´ ) und ρ (x) = ρ´ (x) für alle x ∈ dom( ρ ). Seien ψ ,ψ ´ Mengen von Literalen, dann gilt: ψ ´ bewahrt ψ , wenn vars(ψ ) ⊆ vars (ψ ´ ) und es für alle T-Interpretationen M und Zuordnungen ρ ein ρ´ gibt, welches ρ so erweitert, dass M, ρ |=T ψ iff M, ρ´|=T ψ ´ . In diesem Fall: |=Tψ ⇒ φ iff |=Tψ ´⇒ φ . Eine Theorie heißt lösbar, wenn es eine berechenbare Funktion solve(a = b) gibt: • • solve(a = b) = ⊥ iff a = b in T unlösbar ist sonst: solve( a = b) = S, wobei S eine Lösungsmenge ist, so dass dom(S) ⊆ vars (a = b) und S bewahrt a = b. Neue Variablen die noch nicht in vars(a = b) enthalten sind, können auf der rechten Seite eingefügt werden. Es sei T eine Shostak Theorie mit dem Kanonisierer σT(.) und dem Solver solveT(.). Für das Gültigkeitsproblem |=T E ⇒ a = b gehe wie folgt vor: 1. Bilde eine Lösungsmenge S:= process(idE, E), indem man eine endliche Menge von Umformungen anwendet, welche die Bedeutung von T nicht verändern. 2. Berechne die kanonischen Formen von a und b: a´:= S a , b´:= S b 3. Wenn die beiden kanonischen Formen die selben sind (a´≡b´), dann ist a = b aus E ableitbar. Die Kanonisierung ist definiert als S a := σ T ( S[a]) . Die Fusion ist S R := {a = R b | a = b ∈ S} . Die Kompositionen sind S ° ⊥ := ⊥, ⊥ ° S := ⊥ und S ° R := R ∪( S R ). Für bereits aufgelöste Formen ist S ° S = S. Die Konfiguration (S, E) enthält die Menge von Gleichungen E und die Lösungsmenge S. Die Lösungsmenge wird folgendermaßen konstruiert: Es gibt zwei Endzustände, die man erreichen kann: entweder es sind keine neuen Variablen mehr vorhanden, dann process(S, 0/ ) = S. Oder man trifft auf einen Widerspruch, dann process(⊥ , E) = ⊥. Solange man nicht bei einem dieser beiden Zustände ist berechne process(S, a = b ∪ E) = process(assert( a = b, S), E). Mit assert wird die bisher gefundene Lösungsmenge erweitert: für S´= process*(E, idE) assert(a = b, S) = S ° solve( S a = S b ) 6 |=T (E ⇒ a = b) iff entweder S´ = ⊥ oder S´ a ≡ S´ b Ein Beispiel für die Umwandlung von Gleichungen in ein Termersetzungssystem nach Shostak’s Verfahren mit nur einer Theorie ist E0 = {a = gab, fffa = fgab} Zunächst ersetzt man alles Ausdrücke aus E mit Variablenabstraktion: Aus a wird c1, fc1 wird zu c2, usw.. Man formt die Notation aus Gleichungen (=) in ein Termersetzungssystem (→) um. Man wandelt erst die erste Gleichung in ein Termersetzungssystem um. Anschließend verwendet man die Termersetzung aus Gleichung eins um die Gleichung zwei in ein Termersetzungssystem zu verwandeln. a = gab, fffa = fgab a → c1, b → c5, gc1c5 → c1 fffc1 = fc1 fc1 →c2, fc2 → c3, fc3 → c2 finaler Kongruenzabschluss { a → c1, b → c5, gc1c5 → c1, fc1 →c2, fc2 → c3, fc3 → c2 } 4.2 Kombination von Shostak Theorien Zwei Theorien T1 und T2 werden als unterschiedlich angesehen, wenn sie keine gemeinsamen Funktionssymbole haben. Sei σi der Kanonisierer für Ti, dann ist ein Term f(a1, ..., an) in Ti, wenn f in Ti ist; auch dann, wenn einige der ai Funktionssymbole enthalten, die nicht in Ti enthalten sind. Die Kanonisierer behandeln die Terme in der jeweils anderen Theorie als Variablen. Da σi nur i-Terme behandeln kann, muss er zunächst so angepasst werden, dass er Terme aus Tj als Variablen behandelt, wenn j ≠ i. Πi sei eine ausgewählte bijektive Menge von Gleichungen zwischen den Variablen X und der Menge {a | (∃j : j ≠ i ∧ a ∈Tj}. Uninterpretierte Funktionssymbole werden behandelt, als würden sie zu einer speziellen Theorie T0 gehören, in der σ0 (a) = a, für a ∈ T0. Der erweiterte Kanonisierer lautet dann σi´(a) = Πi [σi (a´)], 7 wenn a´: a´ ein i-Term ist, ist Πi [a´] ≡ a. Da die Bedingung immer erfüllt werden kann, lässt sich der kombinierte Kanonisierer so definieren: σ(x) = x σ(f(a1, ..., an)) = σi´(f(σ (a1) ,..., σ (an))), wenn i : f ist in Ti. Wie wir oben am Beispiel mit den Theorien der linearen Arithmetik TA und der Listen TL gesehen haben, lassen sich die Solver der einzelnen Theorien nicht einfach vermischen. Löst man 5 + car(x + 2) = cdr(x + 1) +3 mit einem gemeinsamen Solver erhält man: x = cons(cdr(x + 1) – 2, k) – 2. Die Idee oben war nun, dass man zwar einen gemeinsamen Kanonisierer verwendet, die Solver aber getrennt lässt: Man bringt beide Seiten der Gleichung in kanonische Form. Sind die kanonischen Formen identisch, so sind auch die Originalgleichungen gleich. Genau wie beim einfachen Shostak Verfahren ersetzt man die Ausdrücke durch neue Variablen. Diese Zuordnung zwischen den Ausdrücken und den neuen Variablen kommen in die Lösungsmenge S. Die Lösungsmenge wird in unserem Beispiel in vier Gruppen unterteilt: in SV stehen die Gleichungen in kanonischer Form. In SU die uninterpretierten Gleichungen, diese Menge ist bei unserem Beispiel leer. Sowie den arithmetischen Lösungen SA und den Lösungen nach der Theorie der Listen SL. Lösungen die in SV enthalten sind, aber nicht in SA oder SL werden dorthin übernommen. In unserem Beispiel war v3 = v6 in SV enthalten, nicht aber in SA. v3 = v6 wird auch in SA vereinigt: v3 = v2 + 5 und v6 = v5 + 3 wird zu v2 = v5 – 2. Diese neue Gleichung wird in SA aufgenommen. Dieses Vorgehen entspricht Punkt 4b von Shostak’s Algorithmus. Nachdem nun in keiner Menge aus S noch neue Gleichungen enthalten sind, arbeitet man nun mit dem Kanonisierer weiter und versucht die Originalgleichung zu verifizieren, indem man die Ausdrücke im Original durch die neuen Variablen ersetzt und in kanonische Form bringt. process(S, 0/ ) := S process(S:{a = b}∪ T) := process(assert(S; a = b); T) assert(S; a = b) := close*(merge(abstract*(S;S a = b ))) 1. Kanonisiere a = b um a´ = b´ zu erhalten. 2. mit Variablenabstraktion a´ = b´: Ersetze f(x1, ...., xn) durch ein neues x, und füge x = x in SV ein und x = f(x1, ...., xn) in Si . Die Iteration ergibt x = y aus a´ = b´ 3. vereinige x = y in S um SV ° {x = y} zu erhalten, es gelte x ≺ y 4. schließe S ab: wenn für x, y gilt a. Si (x) ≡ Si (y) und SV (x) ≡/ SV (y), merge x = y in S b. SV (x) ≡ SV (y) und Si (x) ≡/ Si (y), merge solve( Si ( x) = Si ( y )) in Si 8 5. Bedeutung von Shostak’s Verfahren Varianten von Shostak’s Algorithmus werden in verschiedenen Systemen eingesetzt, darunter STP, EHMD, PVS und SVC, obwohl lange Zeit ein Beweis für die Korrektheit des Verfahrens fehlte. Erst 1999 erkannte Jeremy Levitt die Schwierigkeiten, die sich bei Shostak’s Umgang mit getrennten Theorien ergaben. Shostak hatte behauptet, dass die Kanonisierer und Solver für getrennte Theorien einfach kombiniert werden könnten. Diese Behauptung war jedoch falsch. Die korrigierte Variante von Shostak’s Verfahren, die hier vorgestellt wurde, ist viel mehr eine Abwandlung der Nelson-Oppen Methode, da auch hier der Informationsaustausch über die Variablen realisiert wird. Sie wurde in ICS – Integrated Canonizer and Solver - implementiert. Momentan werden Gleichungen, Ungleichungen, rational und ganzzahlig lineare Arithmetik, Theorie der Tupel und S-Ausdrücke, boolesche Konstanten, Arrays und Bitvektoren unterstützt. ICS ist unter ics.csl.sri.com frei verfügbar. 9 Literatur [HE02] F.v. Henke, Maschinelles Beweisen. Universität Ulm, Vorlesungsskript WS 2002/03 [NO] G. Nelson and D.C. Oppen. Fast decision procedures based on congruence closure. JACM 27(2) (1980). 356-364. [RS] H. Rueß, N. Shankar, A. Tiwari. On Shostak’s Combination of Decision Procedures. Proc. Automated Deduction - CADE 13, LNAI (1104 )Springer Verlag ( 1996). 463-477 [RS01] Harald Rueß, Natarajan Shankar. Deconstructing Shostak. In 16th Annual IEEE Symposium on Logic in Computer Science, pages 19-28, Boston, MA, July 2001. IEEE Computer Society [RS02] H. Rueß, N. Shankar. Combinig Shostak Theories. RTA`02 [Sho84] R. E. Shostak. Deciding combinations of theories. Journal of the ACM, 31(1):12-12, January 1984 10