Formale Spezifikation und Verifikation

Werbung
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
Herunterladen