Formale Spezifikation und Verifikation Martin Hofmann Sommersemester 2015 1 Überblick über die Vorlesung Was ist Spezifikation? Beschreibung eines Teils des gewünschten Systemverhaltens. QuickSort berechnet sortierte Permutation Iterator bietet alle Elemente der Menge in einer beliebigen Reihenfolge an Wird equals() überschrieben, so muss auch hashcode() entsprechend angepasst werden Die vom Roboterarm beschriebene Trajektorie muss innerhalb der erlaubten Toleranz mit der im Programm vorgegebenen übereinstimmen. Die Grenzgeschwindigkeiten und -beschleunigungen dürfen nicht überschritten werden Die Handy-Anwendung darf nicht mehr SMS verschicken als zuvor autorisiert. Nicht: Zweck des Systems (“Ihre Software soll in der Buchhaltung 10% Personal einsparen.”) 2 Überblick über die Vorlesung Was ist Verifikation? Nachweis, dass System eine gegebene Spezifikation erfüllt Durch Tests (“unvollständig”) Durch Argumentation Durch rigorosen Beweis Durch automatisches Verifikationswerkzeug Durch formalisierten Beweis 3 Überblick über die Vorlesung Was heißt “formal”? Mit Mitteln der Logik ausgedrückt. Bedeutung einer formalen Spezifikation ist exakt festgelegt (könnte aber möglicherweise das Gewünschte nicht erfassen) Eine formale Verifikation liefert die Gültigkeit der zugehörigen Spezifikation mit 100%-iger Sicherheit, allerdings nur für das zugrundegelegte formale Modell des Systems. (Extrembeispiele: Kurzschluss, Überlastung, Compilerfehler) Formale Spezifikation und Verifikation kann die Systementwicklung sinnvoll unterstützen, ist aber kein Allheilmittel. 4 Überblick über die Vorlesung Inhalt Kapitel I Propositionale Logik: Wdh. Syntax, Semantik. Reduktion auf SAT, SAT-Solver, Anwendung auf Modellierung. BDDs. Kapitel II Temporallogik und Model Checking: Temporallogik CTL, Syntax und Semantik, Model Checking Algorithmen, Temporallogik LTL und Büchi-Automaten, die Werkzeuge SMV und SPIN. Kapitel III Programmanalyse und Typsysteme: Operationelle Semantik, Datenflussanalyse, Java Bytecode Verifier, Typsysteme für Ressourcen. Kapitel IV Erststufige Logik, Programmlogik: Wdh. Syntax, Semantik, Hoare-Logik, JML. 5 Überblick über die Vorlesung Organisatorisches, Literatur Vorlesungs- und Klausurtermine, siehe Homepage der Veranstaltung. Literatur Huth, Ryan: Logic in Computer Science. Clarke, Grumberg, Peled: Model checking. Nielson, Nielson, Hankin: Program analysis. Als Wdh. der Logik: Skripten von Till Tantau, Martin Lange und MH. Das Folienskript sollte als Unterlage genügen; ersetzt aber nicht den Besuch der Vorlesung und Übungen. 6 Propositionale Logik Kapitel I Propositionale Logik 7 Propositionale Logik Inhalt Kapitel I 2 3 4 5 6 7 8 9 8 Motivation Syntax und Semantik der Aussagenlogik Tautologien und Erfüllbarkeit Mengennotation und indizierte Variablen Normalformen SAT-Solver Optimierungen Gleichheit von Schaltkreisen Modellierung nebenläufiger Systeme Peterson Algorithmus BDDs (binäre Entscheidungsdiagramme) Grundlegende Definitionen Logische Operationen auf BDDs Implementierung von BDDs Nebenläufige Systeme mit BDDs Propositionale Logik Motivation Protokollchef Der Botschafter bittet Sie eine Einladungsliste für den Ball der Botschaft zusammenzustellen. Sie sollen Peru einladen oder Katar nicht einladen. Der Vizebotschafter möchte, dass Sie Katar, Rumänien, oder beide einladen. Aufgrund eines aktuellen Vorfalls können Sie nicht Rumänien und Peru zusammen einladen. Wie stellen Sie die Einladungsliste zusammen? 9 Propositionale Logik Motivation Modellierung in propositionaler Logik Peru oder nicht Katar: P _ K Katar oder Rumänien: K _ R Nicht Rumänien und Peru zusammen: pR ^ Pq Man muss die propositionalen Variablen P, K , R so mit Wahrheitswerten true, false belegen, dass alle drei Formeln wahr werden. Ist das möglich, so ist die Formelmenge erfüllbar. Ist hier der Fall, z.B. mit P “ true, K “ true, R “ false. Alternative: P “ false, R “ true, K “ false. Die Formelmenge tP _ K , K _ R, pR ^ Pqu ist also erfüllbar. Oben stehen zwei erfüllende Belegungen. 10 Propositionale Logik Syntax und Semantik der Aussagenlogik Syntax der Aussagenlogik Sei eine Menge A von Aussagenvariablen A, B, C , D . . . gegeben. Die aussagenlogischen Formeln über A sind durch folgende BNF Grammatik definiert. F ::“ | | | | | | | A F F ^F F _F F ñF F ôF J K (Negation, Verneinung) (Konjunktion, logisches Und) (Disjunktion, logisches Oder) (Implikation, Wenn-Dann-Beziehung) (Äquivalenz, Genau–Dann-Wenn-Beziehung, “iff”) Verum, wahre Formel Falsum, falsche Formel Die Symbole t , ^, _, ñ, ôu heißen Junktoren. 11 Propositionale Logik Syntax und Semantik der Aussagenlogik Syntaxbäume Formal ist eine Formel also ein Syntaxbaum: entspricht pA ^ Bq _ ppC ñ Dq ^ p Aqq. Manche Klammern darf man weglassen, da nach Konvention stärksten bindet und dann ^, _, ñ, ô. Gleiche Junktoren werden von rechts geklammert, also A ñ B ñ C ist A ñ pB ñ C q. 12 am Propositionale Logik Syntax und Semantik der Aussagenlogik Semantik der Aussagenlogik Eine Formel der Form φ ^ ψ ist wahr, wenn φ und ψ beide wahr sind. Ist entweder φ oder ψ falsch, so ist φ ^ ψ falsch. Eine Formel der Form φ _ ψ ist wahr, wenn φ wahr ist oder wenn ψ wahr ist. Nur wenn φ und ψ beide falsch sind, ist die Formel φ _ ψ falsch. φ ist wahr, wenn φ falsch ist. Ist φ wahr, so ist φ falsch. φ ñ ψ ist wahr, wenn entweder φ falsch ist, oder aber φ wahr ist und ψ dann auch wahr ist. Nur wenn φ wahr ist und zugleich ψ falsch ist, ist φ ñ ψ falsch. Eine Formel der Form φ ô ψ ist wahr, wenn φ und ψ denselben Wahrheitsgehalt haben, also entweder beide wahr, oder beide falsch sind. Die Formel J ist wahr, die Formel K ist nicht wahr; beides unabhängig vom Wahrheitsgehalt der Variablen. 13 Propositionale Logik Syntax und Semantik der Aussagenlogik Formale Semantik Formal definiert man für jede Belegung η, die den Variablen Wahrheitswerte zuweist und Formel φ einen Wahrheitswert rrφssη. Z.B.: rrφ ^ ψ _ ρssη “ prrφssη & rrψssηq || rrρssη wobei & und || durch folgende Wahrheitstafeln gegeben sind. false true & false false false true false true 14 false true || false false true true true true Propositionale Logik Syntax und Semantik der Aussagenlogik Tautologien und Erfüllbarkeit Tautologien Definition Eine Formel φ ist eine Tautologie, wenn sie unabhängig vom Wahrheitsgehalt der Variablen stets wahr ist. Formal also, wenn für alle Belegungen η ihrer Variablen gilt rrφssη “ true. Beispiele für Tautologien A_ A pA ñ Bq ñ pB ñ C q ñ pA ñ C q AñA A^B _A^ B _ A^B _ A^ B 15 Propositionale Logik Syntax und Semantik der Aussagenlogik Tautologien und Erfüllbarkeit Erfüllbare Formeln Definition Eine Formel φ ist erfüllbar (satisfiable), wenn es eine Belegung ihrer Variablen gibt, die sie erfüllt (wahrmacht). Formal heißt das, dass eine Belegung η existiert, derart, dass rrφssη “ true. Eine Formel φ ist unerfüllbar (unsatisfiable), wenn sie nicht erfüllbar ist. Beispiele erfüllbarer Formeln A A^B pA _ Bq ^ p A _ Bq ^ pA _ Bq 16 Propositionale Logik Syntax und Semantik der Aussagenlogik Tautologien und Erfüllbarkeit Äquivalenz Äquivalenz Zwei Formeln φ und ψ sind äquivalent, wenn für alle Belegungen η gilt: rrφssη “ rrψssη Beispiele äquivalenter Formeln φ _ ψ ist äquivalent zu ψ _ φ φ ñ ψ ñ ρ ist äquivalent zu 17 pφ ^ ψq _ ρ Propositionale Logik Syntax und Semantik der Aussagenlogik Tautologien und Erfüllbarkeit Erfüllbarkeitsäquivalenz Erfüllbarkeitsäquivalenz Zwei Formeln φ und ψ sind erfüllbarkeitsäquivalent, wenn gilt: φ erfüllbar gdw. ψ erfüllbar. Beispiele erfüllbarkeitsäquivalenter Formeln A _ B ist erfüllbarkeitsäquivalent zu J φ _ ψ ist erfüllbarkeitsäquivalent zu p A _ φq ^ pA _ ψq 18 Propositionale Logik Syntax und Semantik der Aussagenlogik Tautologien und Erfüllbarkeit Zusammenhänge Satz φ ist Tautologie, gdw. φ unerfüllbar ist. φ ist Tautologie, gdw. φ äquivalent zu J ist. φ ist erfüllbar, gdw. φ erfüllbarkeitsäquivalent zu J ist. 19 Propositionale Logik Mengennotation und indizierte Variablen Mengennotation Ź Ź Abkürzung iPI φi “ tφi | i P I u “ φi1 ^ ¨ ¨ ¨ ^ φin , wenn I “ ti1 , . . . , in u. Ž Analog iPI φi . Ź Leere Konjunktion: H “ J. Ž Leere Disjunktion: H “ K. 20 Propositionale Logik Mengennotation und indizierte Variablen Beispiel Sudoku Für i, j P t0, . . . , 8u und k P t1, . . . , 9u führen wir eine Variable xijk ein. Bedeutung von xijk : In Zeile i, Spalte j steht die Zahl k. Folgende Formeln modellieren die Sudoku Spielregeln. Ź Ź Ž xijk (alle Felder sind ausgefüllt). Źi Źj Źk pxijk ^ xijk 1 q (nur eine Zahl pro Feld). 1 Źi Źj k‰k Ź i j‰j 1 k pxijk ^ xij 1 k q (nicht dieselbe Zahl zweimal in einer Zeile) Ź Ź Ź i‰i 1 j k pxijk ^ xi 1 jk q (nicht dieselbe Zahl zweimal in einer Spalte) Ź Ź Ź Ź Ź if u ‰ zPt0,1,2u w Pt0,1,2u k u,u 1 Pt0,1,2u v ,v 1 Pt0,1,2u 1 1 u || v ‰ v then px3z`u,3w `v ,k ^ x3z`u1 ,3w `v 1 ,k q else J (nicht dieselbe Zahl zweimal in einer 3x3 Box) 21 Propositionale Logik Mengennotation und indizierte Variablen Lösung eines Sudoku Gibt man zu den so formulierten Spielregeln die schon besetzten Felder dazu (per ^), so entsprechen die erfüllenden Belegungen gerade den Ź Lösungen. Beispiel: pi,j,kqPI xijk wobei I “ tp0, 0, 6q, p0, 4, 1q, p0, 5, 7q, p0, 6, 5q, p1, 1, 8q, p1, 2, 1q, p1, 3, 2q, p1, 7, 7q, p2, 5, 5q, p3, 1, 2q, p3, 2, 9q, p3, 3, 4q, p3, 8, 1q, p4, 1, 5q, p4, 2, 4q, p4, 4, 2q, p4, 7, 3q, p5, 2, 6q, p5, 4, 7q, p5, 5, 8q, p5, 7, 5q, p5, 8, 4q, p6, 5, 9q, p6, 6, 3q, p6, 8, 7q, p7, 2, 3q, p7, 3, 8q, p7, 6, 4q, p8, 2, 5q, p8, 7, 9qu 22 Aus der “Zeit” vom 22.10.2009 (“schwer”). Propositionale Logik Normalformen Literale und Maxterme Literal Ein Literal ist eine negierte oder nichtnegierte Variable. Ist ` ein Literal, so definiert man ` durch pAq “ A und p Aq “ A. Minterm, Und-Block Eine Konjunktion (Ver-undung) von Literalen heißt Minterm oder Und-Block. Maxterm, Klausel Eine Disjunktion (Ver-oderung) von Literalen heißt Maxterm oder Klausel oder Oder-Block. 23 Propositionale Logik Normalformen Konjunktive Normalform, Disjunktive Normalform Konjunktive Normalform, KNF Eine Konjunktion von Klauseln (Oder-Blöcken) heißt Konjunktive Normalform (KNF). Disjunktive Normalform, DNF Eine Disjunktion von Mintermen (Und-Blöcken) heißt Disjunktive Normalform (DNF). Satz von der DNF Jede aussagenlogische Formel ist äquivalent zu einer DNF. Beweis: Man führt je einen Minterm pro true-Zeile in der Wahrheitstafel ein. Analoges gilt für die KNF (hier je ein Maxterm pro false-Zeile). 24 Propositionale Logik Normalformen Berechnung einer erfüllbarkeitsäquivalenten KNF Die zu einer Formel äquivalente KNF kann sehr (exponentiell) groß sein. Besteht man nur auf Erfüllbarkeitsäquivalenz, so geht es effizienter: Satz Zu jeder Formel φ kann in polynomieller Zeit eine erfüllungsäquivalente KNF Γ linearer Größe (bezogen auf die Größe von φ) berechnet werden. Man definiert rekursiv eine Funktion KNF, die zu jeder Formel φ eine KNF Γ und eine Variable A liefert, sodass Γ erfüllungsäquivalent mit A ô φ ist. Die gesuchte KNF ist dann A ^ Γ. 25 Propositionale Logik Normalformen Definition der Funktion KNF (Tseitin Übersetzung) KNFpAq “ pA, Jq (leere KNF) KNFp φq “ let pB, Γq “ KNFpφq in pC , Γ ^ pC _ Bq ^ p C _ Bqq. KNFpφ1 _ φ2 q “ let pB1 , Γ1 q “ KNFpφ1 q in let pB2 , Γ2 q “ KNFpφ2 q in pC , Γ1 ^ Γ2 ^ p C _ B1 _ B2 q ^ p B1 _ C q ^ p B2 _ C qq Rest als Übung. 26 NB: Die Variable C ist jeweils frisch zu wählen. NB: Ź A1 _ ŽA2 _ ¨ ¨ ¨ _ Am _ B1 _ ¨ ¨ ¨ _ Bn ist äquivalent zu p i Ai q ñ p j Bj q. NB: Es bietet sich an, mit dynamischer Programmierung dafür zu sorgen, dass identische Teilformeln nur einmal verarbeitet werden. Das ist insbesondere wichtig, wenn Teilformeln ge”shart” sind (Schaltkreise). Propositionale Logik Normalformen Beispiel X Y C A AND XOR E AND G OR OR Z OR B NEG D F pA _ X _ Y q ^ p A _ X q ^ p A _ Y q^ p B _ Y _ Z q ^ pB _ Y q ^ pB _ Z q^ p C _ A _ Bq ^ p C _ A _ Bq ^ pC _ A _ Bq ^ pC _ A _ Bq^ p D _ A _ Bq ^ pD _ Aq ^ pD _ Bq^ pE _ C _ Dq ^ p E _ C q ^ p E _ Dq^ p F _ Dq ^ pF _ Dq^ p G _ E _ F q ^ pG _ E q ^ pG _ F q^ G 26 Propositionale Logik SAT-Solver Das SAT-Problem Das SAT-Problem besteht darin, von einer gegebenen KNF zu entscheiden, ob sie erfüllbar ist. Mit der Tseitin-Übersetzung lässt sich Erfüllbarkeit von Formeln und beliebigen Schaltkreisen auf SAT reduzieren. Formeln (Schaltkreise) φ, ψ sind äquivalent, genau dann wenn pφ ô ψq unerfüllbar ist. Das SAT-Problem ist bekanntlich NP vollständig. Dennoch lässt es sich in vielen Fällen mittlerer Größe (ă 106 Variablen und Klauseln) praktisch lösen. Dazu gibt es als SAT-Solver bezeichnete Programme, z.B. zChaff, Minisat. 27 Propositionale Logik SAT-Solver DIMACS-Format Die SAT-Solver akzeptieren eine KNF in einem standardisierten Format (“DIMACS-Format”). Variablen werden durch Integer ą 0 repräsentiert. Negierte Variablen durch entsprechende negative Zahlen. Klauseln werden durch 0-terminierte Zeilen, die ihre Literale enthalten, repräsentiert. Außerdem ist in einem Header die Zahl der Variablen und Klauseln anzugeben. Beispiel für p A _ B _ C q ^ pA _ B _ D _ E q: c Kommentarzeile. p cnf 5 2 -1 2 3 0 1 -2 4 50 28 Verwendet man einen SAT-Solver, so muss man eine Zuordnung der Variablen zu Zahlen fixieren und sich merken. Hier A “ 1, B “ 2, C “ 3, D “ 4, E “ 5. Propositionale Logik SAT-Solver DPLL-Algorithmus Alle SAT-Solver verwenden den DPLL-Algorithmus (Davis, Putnam, Logemann, Loveland). Prinzip: “Vorrechnen” und wenn das nicht hilft, verzweigen. Formal kann DPLL als rekursive Prozedur DPLLpη, Γq beschrieben werden, die zu gegebener Belegung η und KNF Γ entweder eine erfüllende Belegung für Γ liefert, die η erweitert, oder “UNSAT” liefert, wenn es keine solche gibt. 29 Propositionale Logik SAT-Solver DPLL genauer 30 DPLLpη, Γq : 1 Vereinfache alle Klauseln gemäß η. D.h. entferne falsche Literale aus Klauseln, entferne Klauseln, die ein wahres Literal enthalten. 2 Falls Γ die leere Klausel enthält, so gib UNSAT zurück. Die leere Klausel entsteht insbesondere nach Schritt 1, wenn Γ Einerklauseln enthält, die η widersprechen. 3 Falls Γ noch Einerklauseln enthält, so füge die entsprechenden Setzungen zu η hinzu und wiederhole die Schritte 1 und 2. Das passiert z.B., wenn Γ eine Klausel t A, Bu enthält und ηpAq “ true. 4 Wenn die Schritte 1,2,3 keinen Fortschritt mehr bringen, so wähle beliebige noch nicht von η belegte Variable X und rufe der Reihe nach DPLLpΓ, ηrX ÞÑfalsesq und DPLLpΓ, ηrX ÞÑtruesq auf. Gibt es keine zu setzende Variable mehr, so ist η selbst die gesuchte erfüllende Belegung. Propositionale Logik SAT-Solver DPLL Algorithmus: Anmerkungen Die Schritte 1,2,3 heißen Unit Propagation Hilft die Unit Propagation nicht mehr weiter und sind alle Variablen gesetzt, so ist η in der Tat erfüllende Belegung. Vorsicht: Man darf Γ nicht als globale Variable vorhalten, da sonst der Aufruf DPLLpΓ, ηrX ÞÑfalsesq das Γ modifiziert (“zerschießt”) und es dann nicht mehr für den Aufruf DPLLpΓ, ηrX ÞÑtruesq zur Verfügung steht. Bei rekursiver Implementierung werden die Γs und ηs auf dem Keller abgelegt. In der Praxis implementiert man diesen Keller explizit und speichert auf diesem nur jeweils die Änderungen ab. 31 Propositionale Logik SAT-Solver Optimierungen Optimierungen Anstatt die KNF Γ explizit zu verändern, merkt man sich nur für jede Klausel, welche Literale bereits gesetzt sind. Um neu gefundene Setzungen schnell zu propagieren, “beobachtet” jede Klausel die Variablen zweier ihrer unbesetzten Literale (watched literals). Wird eine von diesen gesetzt, so wird ein neues watched literal gesucht. Gibt es keines, so liegt eine Einerklausel vor (; Unit Propagation). Bei einem Konflikt (UNSAT) wird ermittelt, welche Variablensetzungen für den Konflikt verantwortlich waren und als neue “gelernte” Klausel der KNF hinzugefügt. War z.B. X “ true, Y “ false, Z “ false verantwortlich, so “lernt” man X _ Y _ Z. Man speichert hierzu bei jeder Setzung den entsprechenden Grund mit ab. 32 Propositionale Logik SAT-Solver Optimierungen Beispiel Ź Ž Ž Ž Γ“ Ž t tA, B, C u, tA, Ž B, C u, tA, B, C , X u, tA, B, C , X u, t A, B, C , X uu Wir beginnen mit X “ false und dann A “ false und dann B “ false. Durch Unit Propagation erhalten wir aus den ersten beiden Klauseln einen Konflikt. Beteiligt waren nur die Setzungen A “ B “ false. Wir können daher die Klausel A _ B lernen. Sie hilft uns später bei X “ true. 33 Propositionale Logik Gleichheit von Schaltkreisen Schaltkreise Ein Schaltkreis ist ein DAG (gerichteter azyklischer Graph) dessen Knoten mit Junktoren beschriftet sind. VA2 VA OR OR HA XOR XOR AND OR HA XOR AND AND AND HA Um VA “ VA2 zu zeigen, beginnen wir mit drei Variablen X , Y , C und bilden die Formel ppVApX , Y , C q1 ô VA2pX , Y , C q1 q^pVApX , Y , C q2 ô VA2pX , Y , C q2 qq 34 wobei VApX , Y , C q1 den ersten Ausgang von VApX , Y , C q bezeichnet, etc. Propositionale Logik Gleichheit von Schaltkreisen Übersetzung in KNF Tseitin-Transformation: KNF mit 37 Variablen, 58 Klauseln (UNSAT) Ersetzt man das untere XOR von VA2 durch ein OR, so wird die entsprechende KNF erfüllbar. zChaff findet: x “ y “ true, c “ false 35 Propositionale Logik Gleichheit von Schaltkreisen Erzeugung von KNF mit OCAML Das OCAML Modul cnf.ml auf der Homepage erlaubt die Erzeugung von KNF in DIMACS-Format ausgehend von logischen Formeln. Es bietet u.a. folgende Funktionen an: type var val newvar : unit -> var val nvar : unit -> int val reset : unit -> unit (* resetting the variable generator *) type formula (* abstract type of formulas *) val var : var -> formula val dtrue, dfalse : formula val dor, dand : formula -> formula -> formula val xor : formula -> formula -> formula val iff : formula -> formula -> formula val neg : formula -> formula val dands : formula list -> formula val dors : formula list -> formula 36 Propositionale Logik Gleichheit von Schaltkreisen Ein- und Ausgabe Tseitin-Transformation und Ausgabe als DIMACS Format: val mk_dimacs : string -> formula list -> string -> unit Aufruf (mk_dimacs filename formulas header) Einlesen einer zChaff-Ausgabe: val parse_zchaff : string -> int list option Falls (parse_zchaff filename) = None, dann enthält filename die Info UNSAT. Falls (parse_zchaff filename) = Some l, dann ist l die in filename enthaltene erfüllende Belegung. (parse_zchaff funktioniert auch für MiniSat-Ausgaben) 37 Propositionale Logik Gleichheit von Schaltkreisen Gleichheit von Addierern Halbaddierer: let ha x y = (xor x y, dand x y) Volladdierer: let va x y c = let (yc, d) = ha y c in let (s, e) = ha x yc in let cr = dor e d in (s, cr) Volladdierer (zweite Variante): let va2 x y c = let s = xor (xor x y) c in let cr = dor (dor (dand c y) (dand y x)) (dand c x)) in (s, cr) 38 Propositionale Logik Gleichheit von Schaltkreisen Gleichheit von Addierern let not_equiv = let xx = var (newvar()) in let yy = var (newvar()) in let cc = var (newvar()) in let (s1, cr) = va xx yy cc in let (s2, cr2) = va2 xx yy cc in neg (dand (iff s1 s2) (iff cr cr2)) let main = mk_dimacs "adder_not_equiv.cnf" [not_equiv] "" 39 Propositionale Logik Gleichheit von Schaltkreisen Compilierung und Ausführung ocamlopt -c adder.ml ocamlopt -c cnf.mli ocamlopt -c cnf.ml ocamlopt -o adder cnf.cmx adder.cmx ./adder zchaff adder_not_equiv.cnf 40 Propositionale Logik Gleichheit von Schaltkreisen Ripple-Addierer Um Binärzahlen zu addieren, kann man Volladdierer hintereinanderschalten (Ripple-Adder): s0 s1 s2 VA VA VA x0 y0 x1 y1 x2 y2 s3 co VA x y3 Die Durchlaufzeit ist hier proportional zur Zahl n der addierten Bits (schlecht bei n “ 64). Grund: Der Übertrag muss durch alle n Volladdierer laufen (“ripple”). 41 Propositionale Logik Gleichheit von Schaltkreisen Carry-Lookahead Addierer Günstiger ist es, den Übertrag ci am i-ten Volladdierer als logische Funktion der Eingaben direkt zu berechnen. carry, gen und prop ci genij propij “ if i“0 then K else gen0pi´1q “ if i“j then xi ^ yi else genkj _ pgenipk´1q ^ propkj q “ if i“j then xi _ yi else propipk´1q ^ propkj wobei jeweils k “ tpj ´ i ` 1q{2u ` i der “Mittelpunkt” von i und j. Idee: genij — Am Ende des Blocks i . . . j entsteht ein Übertrag. propij — Der Block i . . . j propagiert einen einlaufenden Übertrag. Da sich das Intervall jeweils halbiert, ist die Rekursionstiefe und damit die Tiefe der entstehenden Schaltkreise Oplogpnqq. 42 Propositionale Logik Gleichheit von Schaltkreisen Implementierung in OCaml (1) Wir verwenden das Funktional fordo aus cnf.mli: fordo i j a f “ f pj ´ 1q pf pj ´ 2q . . . pf pi ` 1q pf i aqq . . . q um zwei Assoziationslisten (“maps”) für die Eingabevariablen zu erzeugen: let size = 30 let let let let xs = fordo 0 size [] x i = var(List.assoc ys = fordo 0 size [] y i = var(List.assoc (fun i l -> (i, newvar()) :: l) i xs) (fun i l -> (i, newvar()) :: l) i ys) Jetzt ist zum Beispiel x 5 die Eingabevariable x5 . 43 Propositionale Logik Gleichheit von Schaltkreisen Implementierung in OCaml (2) Den Ripple-Addierer implementiert man so: let rec rippleadd i = if i = 0 then ([], dfalse) else let (ss, c) = rippleadd (i-1) in let (s, d) = va (x (i-1)) (y (i-1)) c in (s :: ss, d) Es gilt insbesondere rippleadd size“ cout, rssize´1 ; . . . ; s0 s. 44 Propositionale Logik Gleichheit von Schaltkreisen Implementierung in OCaml (3) Die gen- und prop-Schaltkreise als Formeln: let rec carry i = if i = 0 then dfalse else gen 0 (i-1) and gen i j = if i = j then dand (x i) (y i) else let k = (j+1-i)/2 + i in dor (gen k j) (dand (gen i (k-1)) (prop k j)) and prop i j = if i = j then dor (x i) (y i) else let k = (j+1-i)/2 + i in dand (prop k j) (prop i (k-1)) 45 Propositionale Logik Gleichheit von Schaltkreisen Implementierung in OCaml (4) Lookahead-Addierers: let rec lookaheadadd i = if i = 0 then ([], dfalse) else let (ss, _) = lookaheadadd (i - 1) in let (s, d) = va2 (x (i - 1)) (y (i - 1)) (carry (i - 1)) in (s :: ss, d) 46 Propositionale Logik Gleichheit von Schaltkreisen Implementierung in OCaml (5) Äquivalenz der Addierer: let carryout1, sumbits1 = rippleadd size let carryout2, sumbits2 = lookaheadadd size let test2 = neg (dand (iff carryout1 carryout2) (dands (List.map2 (fun s1 s2 -> iff s1 s2) sumbits1 sumbits2))) let _ = mk_dimacs "adder2.cnf" [test2] "" 47 Propositionale Logik Modellierung nebenläufiger Systeme Modellierung nebenläufiger Systeme Wir wollen Eigenschaften von nebenläufigen Systemen überprüfen. Beispiel: Wechselseitiger Ausschluss (Mutual Exclusion) P Prozesse arbeiten nebenläufig. Die Prozesse teilen sich eine Resource. Es dürfen nicht zwei Prozesse gleichzeitig auf die Resource zugreifen. Verschieden Lösungen: Semaphoren Synchronisierung durch gemeinsame Variablen (z.B. Peterson Algorithmus) 48 Propositionale Logik Modellierung nebenläufiger Systeme Modellierung nebenläufiger Systeme Modellierung als Zustandsübergangssystem: Eine Menge Z , die Menge aller möglichen Systemzustände. Eine Menge I Ď Z von möglichen Anfangszuständen. Eine Relation ÞÑĎ Z ˆ Z . Die Aussage z ÞÑ z 1 drückt aus, dass z 1 P Z ein möglicher Nachfolgezustand von z P Z ist. Eine Menge V Ď Z von verbotenen bzw. unerwünschten Zuständen. Frage: Kann das System einen verbotenen Zustand erreichen? I Q z0 ÞÑ z1 ÞÑ . . . ÞÑ zn P V 49 Propositionale Logik Modellierung nebenläufiger Systeme Beispiel: Mutual Exclusion mit Semaphor Es gibt k Prozesse mit Pseudocode sleep: goto wait; wait: if (sem == free) { sem = occ; goto work } work: sem = free; goto sleep sowie einen Semaphor mit zwei möglichen Zuständen free und occ. Modellierung: Z “ tpp1 , . . . , pk , sq | pi P tsleep, wait, worku, s P tfree, occuu I “ tpsleep, . . . , sleep, freequ V “ tpp1 , . . . , pk , sq P Z | pi “ work, pj “ work, i ‰ ju 50 Zu jedem Zeitpunkt macht genau ein Prozess und möglicherweise der Semaphor eine Aktion. Möglich sind: p. . . , sleep, . . . , sq ÞÑ p. . . , wait, . . . , sq p. . . , wait, . . . , freeq ÞÑ p. . . , work, . . . , occq p. . . , work, . . . , sq ÞÑ p. . . , sleep, . . . , freeq Propositionale Logik Modellierung nebenläufiger Systeme Kodierung in Aussagenlogik Man kann SAT-Solver dazu verwenden, um zu zeigen, dass ein System nach n Schritten keinen verbotenen Zustand erreicht: Definiere dazu eine Formel, die genau dann erfüllbar ist, wenn es einen Pfad der Form I Q z0 ÞÑ z1 ÞÑ . . . ÞÑ zt P V für t ď n gibt. Wähle eine frische Variable qzt für alle z P Z und 0 ď t ď n. (Intention: qzt sagt, dass z der t-te Zustand in einem schlechten Pfad ist.) Klauseln: Für alle t ist genau ein qzt wahr (vgl. Sudoku). Ž qz0 ŹzPI n´1 Ž 1 pqzt ^ qz 1 pt`1q q Žt“0 Ž zÞÑz n t“0 zPV qzt (verbotener Zustand erreichbar) 51 Propositionale Logik Modellierung nebenläufiger Systeme Kodierung in Aussagenlogik Ist die Zustandsmenge durch Tupel gegeben, d.h. z “ pz1 , . . . , z` q, so kann man auch Variablen q1z1 t , . . . , q`z` t statt qzt einführen. Bei vier Komponenten à 10 Möglichkeiten benötigt man dann 10 ` 10 ` 10 ` 10 Variablen statt 10 ¨ 10 ¨ 10 ¨ 10. Die Intention von qizi t ist: Der t-te Zustand in einem schlechten Pfad hat zi als i-te Komponente. Die Aussage qzt kann man durch q1z1 t ^ ¨ ¨ ¨ ^ q`z` t ausdrücken. 52 Propositionale Logik Modellierung nebenläufiger Systeme Semaphor-Beispiel mit Aussagenlogik Variablen: Für 0 ă p ď k und z P tsleep, wait, worku und t ď n je eine Variable qpzt . Außerdem für w P tfree, occu und t ď n je eine Variable swt . Klauseln: Für t ă n, 0 ă p ď k, genau ein qpzt und genau ein swt gesetzt. Ź qp sleep 0 ^ sfree 0 Žp Ž qp work t ^ qp2 work t 1 ‰p2 ľ ` 1 ľ ˘ Źt pŽ qp1 zt ôqp1 zpt`1q ^ tăn p p1 ‰p z ł qpzt ^ qpz 1 pt`1q ^ swt ^ sw 1 pt`1q pz,w ,z 1 ,w 1 qPR 53 Hier ist R “ tpsleep, w , wait, w q | w P tfree, occuu Y tpwait, free, work, occqu Y tpwork, w , sleep, freeq | w P tfree, occuu. Propositionale Logik Modellierung nebenläufiger Systeme Peterson Algorithmus Peterson Algorithmus Semaphor erfordert atomares Abprüfen und Setzen. Ohne solche Unterstützung funktioniert der Peterson Algorithmus. Zwei Prozesse 0,1. Jeder hat ein Flag flagris und es gibt eine Variable turn : t0, 1u, die angibt, wer dran ist. Möchte ein Prozess den kritischen Bereich betreten, so signalisiert er das durch Setzen seines Flags. Sodann setzt er turn auf den jeweils anderen Prozess und wartet dann (“busy wait”), bis er an der Reihe ist oder das Flag des anderen nicht gesetzt ist. p: 54 0 1 2 3 4 flag[p] := 1; goto 1 turn := other(p); goto 2 if flag[other(p)] goto 3 else goto 4 if turn = p goto 4 else goto 2 (* kritischer Bereich hier *); flag[p] := 0; goto 0 Propositionale Logik Modellierung nebenläufiger Systeme Peterson Algorithmus Peterson Algorithmus Variablen linep,i,t für alle p P t0, 1u, i P t0, 1, 2, 3, 4u, t ă n. Zum Zeitpunkt t ist Prozess Nummer p in Zeile i. Variablen flagf ,p,t für alle p, f P t0, 1u, t ă n. Zum Zeitpunkt t hat flagrps den Wert f . Variablen turnp,t für alle p P t0, 1u, t ă n. Zum Zeitpunkt t hat turn den Wert p. 55 Die Klauseln erzwingen, dass die Variablen die gewünschte Bedeutung haben, sowie dass zwei Prozesse den kritischen Bereich irgendwann gleichzeitig betreten (erfüllbar gdw. System inkorrekt). sanity: Zu jeder Zeit ist jeder Prozess in genau einer Zeile, und die Variablen flag und turn haben genau einen Wert. initial: Anfangszustand des Systems transitions: Aufzählung aller möglichen Zustandsübergänge von Zeit t zu t ` 1, für alle t ă n. undesired: Ungewünschter Systemzustand Propositionale Logik BDDs (binäre Entscheidungsdiagramme) BDDs Grundidee Man kann Boole’sche Funktionen durch Entscheidungsdiagramme (binary decision diagrams, BDDs) repräsentieren: F x T y T F y F T c F T F 56 Ein Entscheidungsdiagramm für die Boole’sche Funktion x ^y _x ^c _y ^c, welche den Übertrag in einem Volladdierer berechnet. T Um zu gegebener Belegung den Funktionswert auszurechnen, verfolgt man im Entscheidungsdiagramm den entsprechenden Pfad. Man endet dann im Knoten, der dem Funktionswert entspricht. Z.B.: x “ c “ true (im Diagramm “T”) und y “ false (im Diagramm “F”): F x T y T F y F T F c T F T Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Grundlegende Definitionen Definition BDD Es wird eine Ordnung auf den Variablen fixiert. Definition BDD Ein BDD ist ein gerichteter azyklischer Graph, so dass: Jeder Knoten ist entweder ein Blatt oder ein innerer Knoten. Blätter besitzen keine ausgehenden Kanten und sind mit true oder false beschriftet. Jeder innere Knoten ist mit einer Variablen x beschriftet und besitzt genau zwei ausgehende Kanten, die mit false, bzw. true beschriftet sind. Ist ein Nachfolger ein innerer Knoten, so muss dessen Variable in der Variablenordnung nach x kommen. Ein Knoten ist als Wurzelknoten ausgezeichnet. Es gibt keine zwei verschiedene isomorphe Teilgraphen, insbesondere gibt es höchstens zwei Blätter. 57 Kein Knoten hat zwei identische Nachfolger. Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Grundlegende Definitionen Beispiele Ordnung der Variablen: x ă y ă c F x T y T F y F F T F c T F T OK y x F T y T F x T y F T c T c F F T F T Isomorphe Teilgraphen F x F F T F c T F T Falsche Ordnung x F T T y T F c T F y F T c F T F T Knoten mit ident. Nachf. NB: “Isomorph” heißt: “bis auf Herumschieben von Knoten”. Formal: bijektive Abbildung der Knoten, die mit den Kanten und den Beschriftungen verträglich ist. Im zweiten Beispiel sind die Teilgraphen mit Wurzel c isomorph. 58 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Grundlegende Definitionen Erzeugung von BDDs Ein nichtreduziertes BDD ist ein BDD, welches isomorphe verschiedene Teilgraphen und identische Nachfolger enthalten kann. Etwa das zweite Beispiel der letzten Folie. Mit folgenden Regeln kann ein nichtreduziertes BDD in ein BDD überführt werden. Reduktion Knoten mit identischen Nachfolgern entfernen. Knoten mit derselben Beschriftung und gleichen Nachfolgern (true und false Kanten) verschmelzen. Alle true-Blätter verschmelzen; alle false-Blätter verschmelzen. Satz: Kann keine dieser Regeln mehr angewendet werden, so liegt ein BDD vor. 59 Bemerkung: Oft werden unsere BDDs als OBDDs (ordered BDD) oder ROBDDs (reduced OBDDs) bezeichnet. Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Grundlegende Definitionen Eindeutigkeit der BDDs Satz Definieren zwei BDDs über derselben Ordnung dieselbe Boole’sche Funktion, so sind sie gleich (genau: isomorph). Beweis durch Induktion über die Größe der beiden BDDs p1 und p2 . Daraus ergibt sich ein Algorithmus für Äquivalenz Boole’scher Formeln: Für jede der beiden BDD aufstellen; prüfen, ob isomorph. 60 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Grundlegende Definitionen Shannon Zerlegung und sub-BDDs Shannon-Zerlegung Sei f eine Boole’sche Funktion und x eine Variable. Mit f rx:“trues und f rx:“falses bezeichnet man die Funktionen, die man erhält, wenn x entsprechend vorbesetzt wird. Es gilt (Shannon-Zerlegung): f “ x ^ f rx:“trues _ x ^ f rx:“falses “ p x _ f rx:“truesq ^ px _ f rx:“falsesq Beweis durch Fallunterscheidung nach x. Ist p ein BDD und x die erste Variable, die in p abgefragt wird, so sind die beiden Nachfolger des ersten Knotens BDDs für fp rx:“falses und fp rx:“trues (wobei fp die durch p definierte Boole’sche Funktion ist). 61 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Negation und einstellige Operationen Um ein BDD zu negieren, vertauscht man einfach die beiden Blätter. Damit ist die Anwendung einstelliger Boole’scher Funktionen auf ein BDD bereits erledigt, denn es gibt nur die Negation und die Identitätsfunktion. F x T y T F y F T F 62 T T y T F y F T c F T F c T F x T F Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Setzen einer Variablen Um eine Variable x in einem BDD auf einen Boole’schen Wert b zu setzen, entfernt man alle Knoten für diese Variable und lenkt die einlaufende Kante zum b-Nachfolger um. Anschließend ggf. reduzieren! F x y T F y F T F c T F F T T x T [y:=F] F c T F T Es gilt also fprx:“bs “ pfp qrx:“bs (hier bezeichnet prx:“bs das BDD p nach der Einsetzoperation). 63 Spezialfälle: x kommt in p nicht vor: prx:“bs “ p x ist p’s Kopfvariable: prx:“bs ist der entsprechende Nachfolger der Wurzel; insbes. ist keine Reduktion erford. Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Zweistellige Boole’sche Operationen Die Berechnung von zweistelligen Booleschen Operationen auf BDDs (_, ^, Ñ, . . . ) kann durch einen einzigen Algorithmus erklärt werden. Sei ‘ eine zweistellige Boolesche Funktion. (Infix-Schreibweise, d.h. x ‘ y statt ‘px, y q) Gegeben: BDDs p1 und p2 bezüglich der gleichen Variablenordnung. Aufgabe: Berechnung eines BDDs p1 ‘ p2 mit Boolescher Funktion fp1 ‘p2 p~x q “ fp1 p~x q ‘ fp2 p~x q. 64 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Zweistellige Boole’sche Operationen (2) Rekursiver Algorithmus zur Berechnung von p1 ‘ p2 . Fall: p1 ist ein Blatt mit Beschriftung b1 . Man erhält p1 ‘ p2 , indem man die einstellige Funktion b1 ‘ ´ auf die Blätter von p2 anwendet und das Ergebnis reduziert. Fall: Die Wurzeln von p1 sind p2 ist innere Knoten mit Variablen x1 und x2 . Fall x1 ď x2 . Dann sind p1 rx1 :“bs und p2 rx1 :“bs Sub-BDDs von p1 bzw. p2 . Berechne rekursiv: rfalse :“ p1 rx1 :“falses ‘ p2 rx1 :“falses rtrue :“ p1 rx1 :“trues ‘ p2 rx1 :“trues Das Ergebnis p1 ‘ p2 erhält man durch Reduktion von: F rfalse 65 x1 T rtrue Fall x1 ą x2 . Analog mit x2 statt x1 . Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Zweistellige Boole’sche Operationen (3) Implementierung mit dynamischer Programmierung Bei der Berechnung von p1 ‘ p2 werden rekursiv BDDs q1 ‘ q2 berechnet, wobei q1 und q2 Sub-BDDs von p1 bzw. p2 sind. Um die mehrfache Berechnung von q1 ‘ q2 zu verhindern, legt man eine Tabelle an, in der für jedes Paar pq1 , q2 q von Sub-BDDs von p1 bzw. p2 das Ergebnis q1 ‘ q2 gespeichert wird. Die Tabelle wird dann sukzessive ausgefüllt. 66 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Beispiel F Man berechne: x y T F x F T T y T F y F c T F T T T F Nebenrechnungen: F T F T T T T T F F c T T y F c T F c T 67 c F T y T F y T F F F c T F T y F T c F T F T F F T T T T T Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Beispiel Forts. y y F T F T F c T F c T F F T T T F x y T F y F T F 67 T T T T x T y F T F c T T y F y T F F c T F F F x T T T Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Beispiel Forts. y F T y T F F c T F c T F T T y F F T F c T F T F F x y T F T F F T c T T TF x F y F F T y F c F T T T y c TF T T F c T T T F c T T F y T F c T F T xT T F c TT T F F Diese Nebenrechnungen sind nicht wirklich erforderlich, illustrieren aber die Vorgehensweise zusätzlich. 68 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Existentielle Quantifizierung In den Anwendungen ist es häufig nützlich, eine oder mehrere Variablen existentiell zu quantifizieren. Man führt das auf Einsetzen und Disjunktion zurück: Dx.p :“ prx:“falses _ prx:“trues Im allgemeinen wird sich die Größe hier verdoppeln und also bei der Quantifizierung von n Variablen ver-2n -fachen. Man hofft natürlich, dass die jeweils anfallenden Reduktionen die Größe wieder verringern. 69 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Größe der BDDs Im allgemeinen haben BDDs eine (in der Zahl der Variablen) exponentielle Größe. In den praktisch vorkommenden Beispielen sind die BDDs aber häufig beherrschbar klein. Allerdings hängt die Größe oft von der gewählten Ordnung ab. Es gibt viel Literatur über die richtige Wahl der Variablenordnung ... 70 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Beispiel einer Familie von BDDs exponentieller Größe Wir betrachten die Variablenordnung x1 ă x2 ă ¨ ¨ ¨ ă xn ă y1 ă y2 ă ¨ ¨ ¨ ă yn Das BDDŹfür die Boole’sche n Funktion i“1 xi ôyi beginnt mit einem vollständigen binären Baum der Tiefe n, in dem jede der 2n Belegungen der xi separat behandelt wird. Danach sind die yi leicht zu behandeln. F T x2 x2 F F T x3 y1 F T y2 x3 T y1 T T F y2 F F y3 F F T F y3 T T F 71 x1 T x3 T x3 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Logische Operationen auf BDDs Selbe Funktion, andere Ordnung x1 F Mit der Variablenordnung T y1 y1 T F x1 ă y1 ă x2 ă y2 ă x3 ă y3 ă ¨ ¨ ¨ ă xn ă yn x2 T F haben die BDDs lineare Größe. Alle fehlenden Kanten führen in das falseBlatt. y2 y2 F T F x3 y3 y3 F T T 72 F T Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Implementierung I In der Praxis repräsentiert man alle während einer Sitzung auftretenden BDDs nur einmal (sharing): f2 f1 Treten zum Beispiel die Funktionen f1 “ xôy , f2 “ x ^ y , f3 “ y auf, so entsteht nebenstehendes Diagramm: x F F y F F x T T f3 y T T F T Gleichheit von BDDs ist dann einfach Gleichheit von Zeigern. 73 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Implementierung II Um festzustellen, ob ein gerade benötigter BDD schon vorhanden ist, verwendet man eine Hashtabelle. Den Hashwert eines BDDs berechnet man aus der Kopfvariablen und (rekursiv) aus den Hashwerten der beiden Nachfolger. Vgl. Behandlung von Stringliteralen in Java. 74 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Implementierung III Anstatt einen BDD durch Vertauschen der Blätter zu komplementieren, kann man auch in jedem Knoten ein Komplementbit vorsehen, welches besagt, dass sich der darunterliegende BDD komplementiert versteht. Man kann für jeden Knoten einen Referenzzähler einführen, der die Zahl der Verweise auf den Knoten mitzählt. Sind keine vorhanden, so kann er freigegeben werden. (“garbage collection”). Es gibt viele BDD-Bibliotheken mit Frontends für viele verschiedene Programmiersprachen. Wir verwenden die C-Bibliothek BuDDy mit Bindings für OCaml und Java. 75 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Die Bibliothek BuDDy Bibliothek für BDDs in C/C++ Datentyp für BDDs Konstruktion von BDDs: , _, ^, D, @, . . . Variablenumbenennung, Variablenumordnung, . . . Siehe Dokumentation für weitere Funktionen. OCaml Binding: ocaml-buddy: https://github.com/abate/ocaml-buddy Benötigt BuDDy (libbdd) Java-Version: javabdd Enthält Java-Version von BuDDy und benötigt keine Installation von Bibliotheken. Siehe Vorlesungshomepage für Beispielprogramme. 76 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Beispielsitzung in OCaml # #use "topfind";; # #require "buddy";; # open Buddy;; # let x = bdd_pos (bdd_newvar());; val x : bdd = <abstr> # let y = bdd_pos (bdd_newvar());; val y : bdd = <abstr> # let c = bdd_pos (bdd_newvar());; val c : bdd = <abstr> # let carry = bdd_or (bdd_and x y) (bdd_or (bdd_and x c) (bdd_and y c));; val carry : bdd = <abstr> # bdd_compare carry (bdd_or x (bdd_or y c));; - : int = -1 # bdd_compare carry (bdd_or (bdd_and x (bdd_or y c)) (bdd_and y c));; - : int = 0 77 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Beispielsitzung in OCaml (2) # bdd_fprintdot stdout carry;; digraph G { ... } - : unit = () # bdd_fprintdot stdout (bdd_or x (bdd_or y c));; digraph G { ... } - : unit = () Diese Graphen können mit den Graphviz-Tools angezeigt werden. 78 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Lookahead Addierer mit BDDs Der Programmtext ist ähnlich wie bei der Lösung mit SAT-Solver. Siehe adder.ml. Für jedes Summenbit und das Übertragsbit wird ein BDD berechnet. Wir berechnen das BDD genau wie die aussagenlogische Formel. Die Verknüpfungen ^, _ werden jetzt als binäre Operationen auf BDDs interpretiert. Im Programmcode müssen wir nur Cnf.dor, Cnf.dand durch bdd_or, bdd_and, . . . ersetzen. Der Test auf Gleichheit für alle möglichen Eingaben wird zum Vergleich der BDDs: bdd_compare b1 b2 vergleicht b1 und b2. 79 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Implementierung von BDDs Lookahead Addierer mit BDDs N.B.: Jedes SAT-Problem kann mit BDDs gelöst werden. Dazu berechnet man ein BDD für die aussagenlogische Formel. Die Formel ist erfüllbar genau dann wenn das BDD ungleich dem BDD für false ist. In der Praxis sind SAT-Solver meist effizienter als BDDs. 80 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Nebenläufige Systeme mit BDDs Nebenläufige Systeme mit BDDs BDDs erlauben eine Modellierung nebenläufiger Systeme ohne Zeitschranke (“tmax”). Beispiel: Wechselseitiger Ausschluss mit Semaphore Mengen von Zuständen können durch BDDs repräsentiert werden. 81 Wähle folgende Variablen: Für p ă P (Anzahl der Prozesse) und z P tsleep, wait, worku je eine Variable qpz . Außerdem für w P tfree, occu je eine Variable sw . Jeder Zustand im Semaphoren-Beispiel entspricht einer Belegung dieser Variablen. Boolesche Funktionen (und damit BDDs) über diesen Variablen repräsentieren Zustandsmengen. Ziel: Finde ein BDD über diesen Variablen, welches die Menge der von einem (hier: dem) Anfangszustand aus erreichbaren Zustände repräsentiert. Prüfe, ob diese Menge verbotene Zustände enthält. Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Nebenläufige Systeme mit BDDs Semaphor mit BDDs Sinnvolle Zustände: ľł ľ sanity “ qpz ^ p z qpz 1 ^psfree _socc q^ psfree ^socc q z‰z 1 Anfangszustand(e): initial “ sanity ^ ľ qpsleep ^ sfree p Verbotene Zustände: undesired “ sanity ^ ł qpwork ^ qp1 work păp 1 Erreichbare Zustände: reachable “ “siehe nächste Folien” 82 Man prüfe, ob reachable ^ undesired “ K. Wenn ja: OK; wenn nein: System fehlerhaft. Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Nebenläufige Systeme mit BDDs Zustandsübergangsrelation 1 Führe einen zweiten Satz Variablen für Folgezustand ein: qpz 1 und sw für alle p, z und w . Wähle Variablenordnung so, dass eine gestrichene Variable immer unmittelbar auf ihr ungestrichenes Pendant folgt, also nicht: erst alle ungestrichenen, dann alle gestrichenen. Definiere nun BDD next für die Relation “ist möglicher Folgezustand von”. Im Beispiel: ł ł ľľ 1 1 qpz ^qpz next “ p qp1 z ôqp1 1 zt q^ 1 ^sw ^sw 1 p p1 ‰p z pz,w ,z 1 ,w 1 qPR wobei R “ tpsleep, w , wait, w q | w P tfree, occuu Y tpwait, free, work, occqu Y tpwork, w , sleep, freeq | w P tfree, occuu. 83 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Nebenläufige Systeme mit BDDs Iteration Für i “ 0, 1, 2, 3, . . . berechne nun die Menge reachi der in höchsten i Schritten erreichbaren Zustände. Es ist: reach0 “ initial, Falls reachi bereits definiert ist, so ist reachi`1 “ reachi _ sanity ^ substpexistspreachi ^ nextqq 84 Hier bezeichnet: exists die existentielle Quantifizierung der ungestrichenen Variablen. Die Formel (BDD) existspreachi ^ nextq enthält also nur noch die gestrichenen Variablen; subst die Ersetzung der gestrichenen Variablen durch die ungestrichenen. Bezeichnen wir mit s, s 1 , š Kopien der Variablensätze und machen wir die Abhängigkeiten durch Klammern explizit, so haben wir intuitiv: reachi`1 psq “ reachi psq _ Dš.reachi pšq ^ nextpš, sq. Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Nebenläufige Systeme mit BDDs Erreichbare Zustände Es ist klar, dass reachi ñ reachi`1 Tautologie ist. “In höchstens i Schritten” impliziert ja “in höchstens i ` 1 Schritten. Da es nur endlich viele Zustände gibt, muss es also ein i0 geben, sodass reachi0 “ reachi0 `1 Ab diesem Zeitpunkt i0 ändert sich also nichts mehr und reachi0 beschreibt somit die Menge der überhaupt erreichbaren Zustände. Wie gesagt, ist i0 höchstens so groß wie die Zahl der Zustände. In der Praxis ist i0 aber meist viel kleiner. Es ist ja die maximale Zeit, nach der jeder überhaupt erreichbare Zustand erreicht wird. Im Semaphorbeispiel ist z.B. i0 “ |P| ` 1. 85 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Nebenläufige Systeme mit BDDs Algorithmus zur Berechnung der erreichbaren Zustände Mit folgendem Algorithmus kann man also die erreichbaren Zustände als BDD berechnen. new :“ K repeat old :“ new new :“ old _ sanity ^ substpexistspold ^ nextqq until new “ old reach :“ new Die Abbruchbedingung in der repeat-until Schleife kann bei BDD-Repräsentation in konstanter Zeit geprüft werden. Siehe bdd.zip und javaBDD.zip für entsprechende Implementierung für Semaphor und Peterson Algorithmus. 86 Propositionale Logik BDDs (binäre Entscheidungsdiagramme) Nebenläufige Systeme mit BDDs Zusammenfassung Kapitel 1 Wdh. Aussagenlogik Erfüllungsäquivalente KNF mit Tseitin Übersetzung DPLL Algorithmus, SAT Solver Äquivalenz von Schaltkreisen, Bsp. Lookahead Addierer Modellierung nebenläufiger Systeme durch exhaustive Simulation in Aussagenlogik Binäre Entscheidungsdiagramme BDDs, Definition und Grundalgorithmen Implementierung von BDDs Modellierung nebenläufiger Systeme mit BDDs, Berechnung aller erreichbarer Zustände durch Fixpunktiteration. 87