…zur Spezifikation, Analyse (Verifikation), Synthese von Hard- und Softwaresystemen.
für (geplantes) System (Bsp: CPU, Programm)
formales Modell angeben (Bsp: logische Schaltung, endl. Automat)
gewünschte System-Eigenschaft angeben
(Bsp: Boolesche Formel, reguläre Sprache)
Analyse: mit Werkzeug(unterstützung) feststellen, ob das Modell die Eigenschaft hat (Bsp: , )
Synthese (Constraint-Programmierung): Werkzeug konstruiert aus Constraint ein passendes Modell
Schritt von System zu Modell ist Abstraktion (es werden Details ignoriert), das ist
teils nützlich (verbessert die Übersicht, Einsicht),
teils notwendig (nur wenn entscheidbar oder aus berechenbar, kann überhaupt ein Werkzeug zur Analyse bzw. Synthese implementiert werden)
in den einfachen Beispielen (besonders am Anfang der VL) beginnen wir die Betrachtung bereits bei (damit wir sehen, welche Theorien angewendet werden sollen)
das Abstrahieren muß aber auch geübt werden, es ist aber eine anwendungsspezifische Kunst
Verifikation von Schaltkreisen
(bevor man diese tatsächlich produziert)
wenn unerfüllbar (), dann ist Impl. korrekt
Verifikation von Software durch model checking:
Programmzustände abstrahieren durch Zustandsprädikate, Programmabläufe durch endliche Automaten.
z. B. Thomas Ball et al. 2004: Static Driver Verifier
benutzt Constraint-Solver Z3 (Nikolaj Björner et al., 2007–)
automatische Analyse des Resourcenverbrauchs von Programmen
Termination (jede Rechnung hält)
Komplexität (…nach Schritten)
mittels Bewertungen von Programmzuständen:
wenn , dann .
Parameter der Bewertung werden durch Constraint-System beschrieben.
vgl. Carsten Fuhs: Automated Termination Analysis…, Intl. School on Rewriting, 2022
Berechnungsmodell: Wortersetzung ( Turingmaschine)
Programm: ( Bubble-Sort)
Beispiel-Rechnung:
Bewertung durch Interpretation: lineare Funktionen mit
Interp. ist monoton:
Interp. ist kompatibel mit Programm:
resultierendes Constraint-System für ,
Lösung mittels Z3
(set-logic QF_NIA)(set-option :produce-models true)
(declare-fun P () Int) (declare-fun Q () Int)
(declare-fun R () Int) (declare-fun S () Int)
(assert (and (< 0 P) (<= 0 Q) (< 0 R) (<= 0 S)))
(assert (> (+ (* P S) Q) (+ (* R Q) S)))
(check-sat)(get-value (P Q R S))
Constraint-System: eine prädikatenlogische Formel
Lösung: Interpretation (Var.-Belegung), für die wahr ist
CP ist eine Form der deklarativen Programmierung.
Vorteil: Benutzung von allgemeinen Suchverfahren (bereichs-, aber nicht anwendungsspezifisch).
Nikoli (1980–, „the first puzzle magazine in Japan.“)
Erich Friedman: Math Magic 1998–2020
Simon Tatham’s Portable Puzzle Collection
Angela und Otto Janko:
,
Donald Knuth: A Potpourri of Puzzles, 2022,
TAOCP, Band 4, Pre-Faszikel 9b,
für aussagenlogische Formeln:
http://www.satcompetition.org/
(SAT satisfiability)
für prädikatenlogische Formeln
(SMT satisfiability modulo theories)
Theorien: mit , Plus, Mal; mit , Plus; …
Termination und Komplexität
Aussagenlogik
zur Modellierung (SAT-Kodierung) von Systemen mit endlichem Zustandsraum, begrenzter Schritt-Zahl (bounded model checking)
Werkzeuge: SAT-Kompiler (Tseitin-Transformation), SAT-Solver (Propagation, Backtracking, Lernen)
eingeschränkte Prädikatenlogik
Unbekannte aus unendlichen Bereichen (Zahlen)
Werkzeuge: SMT-Solver (SAT modulo Theory)
allgemeine Beweis-Systeme
zur Modellierung beliebiger (unbeschränkter) Systeme
Methode: Typisierung (Curry-Howard-Isomorphie, program proof), Werkzeuge: interaktive Beweiser
jede Woche 1 Vorlesung 1 Übung
Hausaufgaben (Haus bedeutet: zuhause bearbeiten, in der Übung diskutieren)
Aufgaben im Skript
Aufgaben in autotool
Prüfungszulassung: regelmäßiges und erfolgreiches Bearbeiten von Hausaufgaben
Klausur (2 h, keine Hilfsmittel).
Quelltexte, Planung und Diskussion der Übungsaufgaben
(Projekt-Mitgliedschaft beantragen, Zugang wird dann auf Mitglieder eingeschränkt)
Cerone, A., Roggenbach, M., Schlingloff, B.-H., Schneider, G., Shaikh, S.A.: Teaching formal methods for software engineering - ten principles, Informatica Didactica, Nr. 9, (2015). https://www.informaticadidactica.de/uploads/Artikel/Schlinghoff2015/Schlinghoff2015.pdf
Uwe Schöning, Jacob Toran: Das Erfüllbarkeitsproblem SAT , Lehmanns (2012)
Christel Baier, Joost Katoen: Principles of Model Checking. MIT Press, Cambridge (2008)
Samuel Mimram: Program Proof, https://www.lix.polytechnique.fr/Labo/Samuel.Mimram/teaching/INF551/course.pdf
WS 25: 1b, 5, 4a, 2.
Pierluigi Crescenzi, Viggo Kann A compendium of NP optimization problems
https://web.archive.org/web/20200227195925/http://www.nada.kth.se/~viggo/problemlist/compendium.html
Beispiele:
Minimum File Transfer Scheduling (node195).
Minimum Dynamic Storage Allocation (node163).
Erläutern Sie die Spezifikation an einem Beispiel. Geben Sie eine lösbare Instanz sowie dafür zwei Lösungen mit unterschiedlichem Maß an.
Aufgabe: formalisieren Sie Math Magic Februar 2007.
Was ist dabei für Springer und König einfacher als für Dame, Läufer, Turm?
(allgemein für Math Magic: offene Fragen
Aufgabe: formalisieren Sie Wolkenkratzer oder Towers (was ist der Unterschied?) https://www.janko.at/Raetsel/Wolkenkratzer https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/towers.html
, Unbekannte: für
Constraint für eine Zeile : (entspr. für Spalte)
Bsp: , Vorgabe links 2, rechts 1, kompatibel sind .
diese Formel wird exponentiell groß (wg. Anzahl Permutationen),
Folge-Aufgabe: geht das auch polynomiell?
Geben Sie eine Aufgabenstellung der Größe an mit Vorgaben (d.h., alle Vorgaben), die mehr als eine Lösung hat.
…für , für größere (einige, alle)
(offene Frage?) Geben Sie eine eindeutig lösbare Instanz mit möglichst wenigen Vorgaben an. (Sind Vorgaben für immer möglich?)
Modellierung von Puzzles (aus Tatham-Collection)
geben Sie ein Modell an für Pegs (Solitaire). Hinweise:
Zustand Boolesche Matrix,
Schritt Relation zwischen Matrizen,
Lösung Schrittfolge ( Zustandsfolge). Wieviele Schritte?
Modell für Unruly. (keine Zustandsfolge, sondern direkt die Lösung. Welches sind die Unbekannten, welches sind ihre Beziehungen, untereinander und zur Vorgabe)
modellieren Sie Untangle
Vergleichen Sie mit den tatsächlichen Quelltexten
Constraint für monotone kompatible Bewertungsfunktion:
lösen Sie mit Z3 (ist im Pool installiert, vgl. https://www.imn.htwk-leipzig.de/~waldmann/etc/pool/)
eine kleinste Lösung finden (Summe von möglichst klein) — dafür Assert(s) hinzufügen.
Abstieg der so gefundenen Bewertungsfunktion nachrechnen für
gibt diese Bewertungsfunktion die maximale Schrittzahl genau wieder? (nein)
Folge-Aufgabe: entspr. Constraint-System für Bewertungsfunktion für aufstellen und lösen.
aussagenlogische Formel:
elementar: Variable
zusammengesetzt: durch Operatoren
einstellig: Negation
zweistellig: Implikation, Äquivalenz, Antivalenz,
mehrstellig möglich: Konjunktion, Disjunktion,
damit auch Quantifikation über endlichen Bereich
ist (endliche!) Konjunktion
Wertebereich , Halbring
Übung: weitere Halbringe mit 2 Elementen?
Belegung ist Abbildung
Wert einer Formel unter Belegung :
wenn , dann ist ein Modell von , Schreibweise:
Modellmenge
erfüllbar, wenn
Modellmenge einer Formelmenge:
Autoren: Edward Kmett et al.,
import Prelude hiding ((&&),(||),not )
import Ersatz
main = do
ans <- solveWith minisat $ do
p <- exists @Bit ; q <- exists @Bit
assert $ (p || not q) && (not p || q)
return [p,q]
case ans of (Satisfied, Just res) -> print res
Unbekannte erzeugen (exists), Formel konstruieren
(&&,…), assertieren, lösen, Antwort
benutzen
zu Implementierung vgl.
Eingabeformat: SAT-Problem in CNF:
Variable positive natürliche Zahl
Literal ganze Zahl (, mit Vorzeichen)
Klausel Zeile, abgeschlossen durch .
Formel Header
p cnf <#Variablen> <#Klauseln>,
danach Klauseln
Beispiel: die (konj. Normal-)Formel :
p cnf 2 2
1 -2 0
-1 2 0
Löser (Bsp.):
minisat input.cnf output.text
Niklas Eén, Niklas Sörensson: An Extensible SAT Solver, 2003, https://minisat.se/,
stelle möglichst viele Damen auf
-Schachbrett,
die sich nicht gegenseitig bedrohen.
Unbekannte: für
mit Bedeutung: Position ist belegt
Constraint: .
„möglichst viele“ läßt sich hier vereinfachen zu:
„in jeder Zeile genau eine“.
vereinfachen zu: „…wenigstens eine.“
wir schreiben Programm,
Hilfsfunktionen für Boolesche Matrizen mit
import qualified Ersatz.Relation as R
queens n = do
out <- solveWith (cryptominisat5Path "kissat") $ do
b <- R.relation ((1,1),(n,n))
assert $ flip all (rows b) $ \ r -> or r
assert $ flip all (R.indices b) $ \ p ->
flip all (R.indices b) $ \ q ->
encode (reaches p q) ==> not (b R.! p && b R.! q)
return b
case out of
(Satisfied, Just b) -> do putStrLn $ R.table b
(vollst. Quelltext: siehe Repo)
innerhalb von solveWith steht Befehlsfolge, Befehl
ändert Zustand (Variablenzähler, Klausel-Ausgabe)
exists @Bit :: MonadSAT s m => m Bit,
R.relation _
konstruiert neue Variable(n)
assert :: Bit -> m ()
übersetzt Formel in CNF, gibt Klauseln aus
der Typ Bit beschreibt aussagenlogische Formeln
(genauer: Schaltkreise), d.h., symbolische Repräsentation von
(unbekannten) Wahrheitswerten
Typ Bool beschreibt konkrete (bekannte)
Wahrheitswerte
booleschen Operatoren (
import Ersatz
) sind polymorph
not :: Boolean b => b -> b,
instance Boolean Bool,
instance Boolean Bit
gesucht ist Kanten-2-Färbung des ohne einfarbigen .
Aussagenvariablen Kante ist rot (sonst blau).
Constraints:
das ist ein Beispiel für ein Ramsey-Problem
(F. P. Ramsey, 1903–1930) http://www-groups.dcs.st-and.ac.uk/~history/Biographies/Ramsey.html
diese sind schwer, z. B. ist bis heute unbekannt: gibt es eine Kanten-2-Färbung des ohne einfarbigen ?
Spielzug: Stein überspringen und entfernen,
Aufgabe: existiert Zugfolge von Initial (gegeben)
zu Final (genau ein Stein übrig)
Beispie: Initial ist volles Rechteck minus ein Stein
(Wdhlg.) aussagenlog. Modell als Folge von Relationen , für die gilt .
eine Realisierung:
mit:
Brett,
Position (des übersprungenen Steins),
Richtung
und
Finalität von ist einfach: das Zählen muß nicht SAT-kodiert werden—warum?
WS 25: 2,3,4 (5, 7, 8 siehe Repo)
unterschiedliche Halbringe auf zwei Elementen?
für die Formel (abhängig von Parametern )
Variablen: für
Constraints:
für jedes gilt: wenigstens einer von ist wahr
und für jedes gilt: höchstens einer von ist wahr
unter welcher Bedingung an ist erfüllbar?
Für den erfüllbaren Fall: geben Sie ein Modell an.
Für den nicht erfüllbaren Fall: einen Beweis.
Erzeugen Sie (eine konjunktive Normalform für) durch ein Programm (Sprache/Bibliothek beliebig)
( von der Kommandozeile, Ausgabe nach stdout)
Lösen Sie durch minisat (kissat, Z3, …), vergleichen Sie die Laufzeiten (auch im nicht erfüllbaren Fall).
Für (vorige Aufgabe): Formel-Konstruktion, Löser-Aufruf mit Ersatz.
vom Typ Relation Int Int (vgl.
Damen)
„für jedes
“:
verwenden Sie rows
„für jedes
“:
schreiben und verwenden Sie entsprechende Fkt.
columns
„höchstens einer“: verwenden Sie „keine zwei“.
Für : die Ramsey-Zahl ist die kleinste Zahl , für die gilt: jede rot-blau-Kantenfärbung eines enthält einen roten oder einen blauen .
(Der Satz von Ramsey ist, daß es für jedes tatsächlich solche gibt.)
Beweisen Sie:
(das liefert einen Beweis des Satzes von Ramsey)
wenn dabei beide Summanden rechts gerade Zahlen sind, dann
Bestimmen Sie damit obere Schranken für und vergleichen Sie mit den unteren Schranken durch SAT-Kodierung.
SAT-Kodierung für mit Ersatz:
main = ramsey 3 3 5
ramsey a b n = do
out <- solveWith (cryptominisat5Path "kissat") $ do
r <- R.symmetric_relation ((1,1),(n,n))
assert $ flip all (subs a [1 .. n]) $ \ c ->
flip any (subs 2 c) $ \ [x,y] ->
r R.! (x,y)
assert $ flip all (subs b [1 .. n]) $ \ c ->
flip any (subs 2 c) $ \ [x,y] ->
not $ r R.! (x,y)
return r
...
Hilfsfunktion: verteilten Teilfolgen gegebener Länge:
Beispiel: subs 3 [1,2,3,4,5]
= [[1,2,3],[1,2,4],[1,2,5],...,[3,4,5]] (nicht notwendig in
dieser Reihenfolge)
subs :: Int -> [a] -> [[a]]
subs 0 xs = [ [] ] ; subs k [] = []
subs k (x:xs) = map _ _ <> subs k xs
mit subs a [1 .. n] zur Auswahl des
sowie subs 2 c zur Auswahl der Kanten.
Diskutieren Sie Existenz (obere Schranke) und SAT-Kodierung für dreifarbigen Ramsey:
das kleinste mit: jeder Kanten-3-Färbung des enthält einen roten oder einen grünen oder einen blauen .
Ergänzen und beweisen: , anwenden für .
Modellierung als aussagenlogisches Constraint:
Rösselsprung ( Hamiltonkreis)
ABCEndView (oder ähnlich) https://www.janko.at/Raetsel/AbcEndView/
Vorgehen bei Modellierung:
welches sind die Unbekannten, was ist deren Bedeutung?
(Wie rekonstruiert man eine Lösung aus der Belegung, die der Solver liefert?)
welches sind die Constraints?
(wie stellt man sie in CNF dar? — falls nötig)
Unruly (S. Tatham Puzzles)
u1 = M.fromList -- eine Aufgabe (8 x 8)
$ map (,False) [(1,7),(3,2),(5,1),(5,3),(5,4),(5,7),(6,7)]
<> map (,True) [(1,4),(6,2),(6,3),(7,5),(8,4),(8,5)]
unruly u = do
let bnd = ((1,1),(8,8))
out <- solveWith (cryptominisat5Path "kissat") $ do
b <- R.relation bnd
assert $ flip all (M.toList u) $ \ (k,v) ->
b R.! k === encode v
assert $ flip all (rows b <> columns b) $ \ rc ->
balanced rc && mixed 3 rc
...
wie kann man feststellen, daß es genau eine Lösung gibt? (Solver nochmals aufrufen für modifizierte Formel.)
Peg (S. Tatham Puzzles)
peg b = do
let bnd = ((1,1),(b,b))
full = A.genArray bnd $ \ i -> True
start :: A.Array (Int,Int) Bool
start = full A.// [((1,2), False)]
out <- solveWith (cryptominisat5Path "kissat") $ do
boards <- replicateM (b*b - 1) $ R.relation bnd
assert $ R.equals (head boards) (encode start)
assert $ all step $ zip boards $ drop 1 boards
return boards
...
type Board = R.Relation Int Int
step :: (Board, Board) -> Bit
move :: Board -> (Int,Int) -> (Int,Int) -> Board -> Bit
model checking: feststellen, ob
ein Modell eines realen Hard- oder Softwaresystems
(z.B. Zustandsübergangssystem f. nebenläufiges Programm)
eine Spezifikation erfüllt
(z.B. gegenseitiger Ausschluß, Liveness, Fairness)
symbolic model checking:
symbolische Repräsentation von Zustandsfolgen
im Unterschied zu tatsächlicher Ausführung (Simulation)
bounded: für Folgen beschränkter Länge
Armin Biere et al.: Symbolic Model Checking without BDDs, TACAS 1999, http://fmv.jku.at/bmc/
Software damals: Übersetzung nach SAT, später: SMT
(QB_BV), Solver: http://fmv.jku.at/boolector/
Daniel Kroening und Ofer Strichman: Decision Procedures, an algorithmic point of view, Springer, 2008. http://www.decision-procedures.org/
Software: http://www.cprover.org/cbmc/
Nikolaj Bjørner et al.: Program Verification as Satisfiability Modulo Theories, SMT-Workshop 2012, http://smt2012.loria.fr/
System mit zwei (gleichartigen) Prozessen :
A0: maybe goto A1
A1: if l goto A1 else goto A2
A2: l := 1; goto A3
A3: [critical;] goto A4
A4: l := 0; goto A0
B0: maybe goto B1
B1: if l goto B1 else goto B2
B2: l := 1; goto B3
B3: [critical;] goto B4
B4: l := 0; goto B0
Schließen sich A3 und B3 gegenseitig aus?
(Nein.)
(nach: Donald E. Knuth: TAOCP, Vol. 4 Fasz. 6, S. 20ff)
Zustände:
jeder Zustand besteht aus:
Inhalte der Speicherstellen (hier: )
Programmzähler (PC) jedes Prozesses
(hier: )
Initialzustand:
Menge der Fehlerzustände:
Übergangsrelation (nichtdeterministisch): für :
führt eine Aktion aus (schreibt Speicher, ändert PC)
Aussagenlog. Formel für angeben,
deren Erfüllbarkeit durch SAT- oder SMT-Solver bestimmen
symbolisch repräsentieren durch Folge von symbolischen Wahrheitswerten
…von denen genau einer wahr ist
Bsp: kodiert durch .
das ist die one hot-Kodierung (eine Stelle ist hot stromführend)
eine Realisierung ist
es gibt andere Kodierungen für endliche Bereiche (z.B.: binär: benötigt weniger Unbekannte, aber evtl. größere Formeln)
überprüfe 1. gegenseitigen Ausschluß, 2. deadlock, 3. livelock (starvation) für weitere Systeme, z.B.
E. W. Dijkstra, 1965: https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD123.html#2.1.
G. L. Peterson, Myths About the Mutual Exclusion Problem, Information Processing Letters 12(3) 1981, 115–116
.
(at most one): , entspr. ,
Schubfach-Constraint (als Testfall, erfüllbar gdw. )
Schubfach für : dann ist Permutationsmatrix,
repräsentiert Bijektion von auf sich
Anwend.: Rösselsprung, Hamiltonkreis in
Pfad in als Bijektion von Indexmenge in Knotenmenge mit .
let n = height * width; places = [0 .. n-1]
let decode p = divMod p width
edge p q =
let (px,py) = decode p; (qx,qy) = decode q
in 5 == (px-qx)^2 + (py-qy)^2
rotate (x:xs) = xs <> [x]
a <- replicateM n $ replicateM n $ exists @Bit
assert $ all exactly_one a
assert $ all exactly_one $ transpose a
assert $ flip all (zip a $ rotate a) $ \ (e, f) ->
flip all places $ \ p -> e!!p ==>
flip any (filter (edge p) places) (\ q -> f!!q)
quadratisch:
Klauseln, keine zusätzlichen Variablen
linear: mit Kodierung :
Addition:
so daß
binär repräsentiert mit Bits.
Bsp.
Klauseln, zusätzliche Variablen
die Hilfsvariablen sind keine Funktionen der Eingangsvariablen. (wenn alle falsch, dann beliebig)
Ü: man kann eine Skolem-Funktion trotzdem einfach angeben
für : die in einem Rechteck anordnen,
(Zeile ), (Spalte ),
dann .
Jingchao Chen: A New SAT Encoding of the At-Most-One Constraint 10th Workshop Constraint Modeling and Reformulation, 2010
Formelgröße , mit Hilfsvar.
Lineare Faktoren sind klein. Ü: wenn
assert (amo xs),
kann man einige Klauseln weglassen. Welche?
amo_quad bs = and $ do
(b : cs) <- L.tails bs; c <- cs
return $ not b || not c
benutzt
L.tails [1,2,3] = [[1,2,3],[2,3],[3],[]]
erster (äußerer) Generator
(b : cs) <- L.tails bs
es werden der Reihen nach gebunden:
b=1,cs=[2,3], dann b=2,cs=[3], dann
b=3,cs=[].
zweiter (innerer) Generator c <- cs
für b=1, cs=[2,3] werden der Reihe nach gebunden:
c=2, dann c=3.
x :: [[Bit]] <-
replicateM h $ replicateM b $ exists @Bit
replicateM: wiederholt Aktion, liefert Liste der
Resultate
exists @Bit: liefert eine neue Variable
replicateM b $ ...: liefert
Variablen
(
eine Zeile)
replicateM h $ ...: liefert
Zeilen
(
eine Matrix)
L.transpose transponiert Matrix
L.transpose [[1,2,3],[4,5,6]] = [[1,4],[2,5],[3,6]]
Anw.: flip all x alo, bedeutet
benutzt Funktionen
flip :: (a -> b -> c) -> b -> a -> c
all :: (Boolean b, Foldable t)
=> (a -> b) -> t a -> b
dabei ein Containertyp (über den man iterieren kann)
das flip nur, damit Argumentreihenfolge wie bei Quantor
bzw. Zählschleife (erst Bereich, dann Prädikat)
eine mögliche Implementierung dafür ist
all f x = and $ do e <- x ; return f e
entsprechend any für endlichen
Existenz-Quantor
Anw.: foldMap enc bs, realisiert
wobei „Addition“ die durch (<>) definierte
Verknüpfung ist (mit neutralem Element mempty)
benutzt Funktion und Typklassen
foldMap :: (Foldable t, Monoid m)
=> (a -> m) -> t a -> m
class Semigroup a where
(<>) :: a -> a -> a
class Semigroup a => Monoid a where
mempty :: a : mappend :: a -> a -> a
vgl. https://www.imn.htwk-leipzig.de/~waldmann/etc/list/ (Lists that are really not there)
WS26: 2, 10, 12
Modellierung Sudoku: Kodierung eines (ausgefüllten) Schemas durch unbekannte Bit mit auf Koordinate steht Zahl .
für welche Teilmengen gelten EXO-Constraints?
Hinweis: für Mengen, jede mit 9 Elementen.
geben Sie Beispiele aus Rätsel-Sammlungen von Nikoli, Janko, Tatham, bei deren SAT-Kodierung AMO- oder EXO-Constraints vorkommen sollten
Vergleiche Sie die commander-Kodierung für AMO von Klieber und Kwon, Int. Workshop Constraints in Formal Verification, 2007, mit Kodierungen aus dem Skript.
a) auf dem Papier, b) praktisch: mit ersatz implementieren, Formelgrößen messen, auch nach Vorverarbeitung durch minisat
für AMO-log: geben Sie eine Skolem-Funktion für an.
d.h., die eine erfüllende Belegung der bestimmt, falls wahr ist.
für über Argumente: verwenden Sie sqrt-Kodierung für Rechteck mit Abmessungen , dann rekursiv über .
Vergleichen Sie mit der log-Kodierung.
für AMO-lin: untersuchen Sie den Unterschied zwischen der
Verwendung von foldr (von rechts) und foldb
(balanciert)
welche Maße der erzeugten Formel stimmen überein, welche unterscheiden sich?
vergleichen Sie Formelgrößen und Solver-Laufzeiten für unterschiedliche AMO-Kodierungen für die Spalten in den unlösbaren Schubfach-Formeln .
für die AMO-Kodierungen linear und sqrt: wie kann man mit möglichst wenig Zusatz-Aufwand EXO erhalten?
ordnen Sie die EXO-Kodierung im Bounded Model Checker (boumchak) in die Systematik der VL ein.
Für den Rösselsprung (Code in fmw-24/leap)
gegebene EXO-Implementierung diskutieren, durch andere ersetzen, Formelgröße/Solverlaufzeit beobachten
zusätzliches assert $ a !! 0 !! 0
diskutieren
andere Sprung-Distanzen (Giraffe usw., siehe unten)
Kamel (1,3)-Sprung (auf nur schwarzen? oder weißen?) Feldern implementieren
andere Kodierung für Hamiltonkreis: Neng-Fa Zhou: In Pursuit of an Efficient SAT Encoding for the Hamiltonian Cycle Problem, CP 2020, ModRef 2019, https://www.sci.brooklyn.cuny.edu/~zhou/
Anwendung: George Jelliss: Leapers at Large, 2001, 2022 http://www.mayhematics.com/t/pl.htm
Resultate zur Existenz von Hamilton-Pfaden (HP) und -Kreisen (HC) nachrechnen und ergänzen, Bsp.:
HP für Giraffe auf 11 11?
(Nein—unsat nach 6 Stunden)
HP für Zebra auf 13 13?
HP für Antilope auf 20 20?
vgl. Donald Knuth: Leaper Graphs, 1994, https://arxiv.org/abs/math/9411240
Plan SAT-Kodierung Skyline (Towers, Wolkenkratzer)
Jede Zahl (jedes Haus) wird one-hot-kodiert, dann
type Haus=[Bit];type Zeile=[Haus];type Stadt=[Zeile]
(ohne Vorgaben) welche AMO-Constraints gelten? Eine Matrix, die diese Constraints erfüllt, heißt lateinisches Quadrat (Anzahl der lateinischen Quadrate: https://oeis.org/A002860)
(mit Vorgaben) Implementieren Sie die Berechnung der (von links)
sichtbaren Dächer einer Zeile sicht :: Zeile -> [Bit].
Das Resultat soll der Bitvektor
sein mit
Dach der Höhe
ist sichtbar.
für die anderen Blickrichtungen: die Funktion sicht
bleibt, die Stadt wird transformiert. Wie?
Benutzen Sie eine SAT-Kodierung, um zu beweisen: jedes lateinische Quadrate der Seitenlänge 6 enthält wenigstens eine Zelle, die von keiner Seite sichtbar ist.
SAT-Kodierungen für das -Damen-Problem:
naiv
für alle aus Spielfeld: für alle aus Spielfeld: sich und sehen, dann
besser
für alle aus Spielfeld: für alle , die von gesehen werden: …
noch besser
AMO-Constraints (jeweils lineare Formelgröße) über geeigneten (linear vielen) Mengen
Ansatz: zusätzliche Constraints schnellere Lösung.
viele Anwendungsaufgaben haben Symmetrien: bijektiv mit
Bsp: Damen: die 8 Symmetrien des Quadrates
eine Menge von Symmetrien definiert eine Äquivalenzrelation
eine Brechung einer Symmetriemenge ist ein Constraint , so daß für jedes die Menge genau ein Element hat.
Satz (Korrektheit,Vollständigkeit):
Rösselsprung:
(bricht zyklische Verschiebung der Permutation)
Ü: was bricht die Spiegelung?
Damen (und allgemeines Prinzip)
definiere totale Ordnung auf und
z.B. lexikografische Ordnung auf Bitvektoren
Ü: welche Symmetrien und Brechungen für
peacable coexisting armies of queens (A250000)
square free point set (A227133)
für eine Gruppe von Symmetrien von verwende zusätzliches Constraint
Bsp: Damen: Konfiguration ist drehsymmetrisch.
aus
Solver findet eventuell schneller
aus folgt nicht
M. Heule: Avoiding Triples in Arithmetic Progression. Journal of Combinatorics 8(3): 391-422.
(Abschnitt 4. Symmetry and Satisfiability)
Symmetriebrechung für verallg. Rösselsprung:
Rotation der Zeit mit
gebrochen durch (Zeit 0: Pos. oben links)
Spiegelung der Zeit:
kann gebrochen werden durch
(beweisen, implementieren)
Symmetrievermutung für verallg. Rösselsprung:
Bsp: Drehung um Grad und Zeitverschiebung um halbe Periode (bei Quadrat: 90/viertel)
Welche Symmetrien? Bsp. .
Lösen Sie die offenen Fälle (Bachelorarbeit, SAT-Kodierung von Anzahl-Constraints)
Definitionen:
Variable: Literal: oder
DNF-Klausel: Konjunktion von Literalen
DNF-Formel: Disjunktion von DNF-Klauseln
CNF-Klausel: Disjunktion von Literalen
CNF-Formel: Konjunktion von CNF-Klauseln
Disjunktion als Implikation: diese Formeln sind äquivalent:
Def: Formeln und heißen äquivalent, wenn .
Satz: zu jeder Formel existiert äquivalente Formel in DNF.
Satz: zu jeder Formel existiert äquivalente Formel in CNF.
aber …wie groß sind diese Normalformen?
Def: und erfüllbarkeitsäquivalent, wenn .
Satz: es gibt einen Polynomialzeit-Algorithmus, der zu jeder Formel eine erfüllbarkeitsäquivalente CNF-Formel berechnet.
(Zeit Platz, also auch )
Beweis (folgt): Tseitin-Transformation
Vor-Überlegung: warum gibt es keine vergleichbare Aussage für DNF?
Grigori Tseitin, On the Complexity of Derivation in propositional calculus, 1966
Spezifikation:
Geg.: , ges,: erfüllbarkeitsäquivalentes in CNF.
wir verschärfen das zu: und .
Plan:
für jeden nicht-Blatt-Teilbaum des Syntaxbaumes von eine zusätzliche Variable einführen,
so daß .
Realisierung:
(Bsp.) , dann als CNF
für jeden der Knoten: Klauseln mit Literalen
beschriebenes Verfahren funktioniert ebenso für Schaltkreise (azyklische gerichtete Graphen, mit Booleschen Operatoren markiert)
Schaltkreis entsteht aus Baum durch Identifikation (sharing) von Knoten
für jeden Knoten eine neue Variable angelegen und deren Wert lokal durch eine CNF bestimmen
Ersatz realisiert observable sharing durch
Adress-Vergleich von Syntaxbaumknoten (des Typs Bit)
-- (xor a b) wird nur einmal T-transformiert:
let {s = (xor a b)} in (c || s ) && (not c || not s)
Beispiel
import qualified Ersatz.Bit.Display as D
D.display $ do
a <- exists ; b <- exists; c <- exists
return $ let {s = (xor a b)}
in (c || s ) && (not c || not s)
zu zeichnende Formel steht nach return
so ausprobieren:
ghci> runSAT' $ do
x <- exists; y <- exists @Bit; assert (x === y)
((),SAT 4 ((1) & (-4 | -3 | -2) & (-4 | 2 | 3)
& (-2 | 3 | 4) & (-3 | 2 | 4) & (-4)) mempty)
zu transformierende Formel steht nach assert (nicht:
nach return, wie bei display)
Tseitin-Transformation nach jedem assert (ohne
assert: keine Ausgabe einer CNF)
Aufgabe: damit observable sharing bestätigen
Aufgabe: CNF zu assert (x /== (y /== z))
(XOR)
(die Frage ist nicht, ob AMD Epyc in SP5-Sockel paßt)
Def. Schaltkreis (circuit): gerichteter kreisfreier markierter Graph, als symbolische Repräsent. einer Booleschen Fkt.
Def. Abmessung (complexity):
Def. Größe (size): Anzahl der Knoten
bei Hardware: Material-Aufwand
für SAT-Kodierung: (nach Tseitin-T.) Größe der CNF
Def. Tiefe (depth): Länge eines längsten Pfades
bei (paralleler!) Hardware: Rechenzeit
bei SAT-Kodierung: Länge von Abhängigkeitsketten von (Hilfs)variablen, beeinflußt Solver-Laufzeit
Bsp: XOR -stellig: Größe, Tiefe
SAT-Kodierung: man möchte immer die (Teil)Formel, für die der Solver am schnellsten die Erfüllbarkeit entscheiden kann
das läßt sich sehr schwer vorhersagen, abhängig von
Lösungsverfahren auf Teilformeln
nicht-lokale Kombination von Teil-Lösungen
betrachten stattdessen die Größe der Eingabe (CNF, Größen sind: Anzahl Variablen, Anzahl Klauseln)
in vielen Publikationen so durchgeführt (siehe AMO)
…stattdessen Größe eines Schaltkreises
mit beschränktem Eingangsgrad (z. B. 2)
unbeschränkt nur f. Disjunktion, Konjunktion
für diese Formeln:
Halb-Adder (2 Eingänge , 2 Ausgänge )
Full-Adder (3 Eingänge, 2 Ausgänge)
jeweils:
führe die Tseitin-Transformation durch
gibt es kleinere erfüllbarkeitsäquivalente CNF? (deren Modelle Erweiterungen der Original-Modelle sind)
data Bit hat weitere Konstruktoren (Xor, Mux).
Wo werden diese benutzt?
Helfen sie tatsächlich bei der Erzeugung kleiner CNFs?
Eingabe: eine Formel in CNF
,[-4,-3,11],[-11,3],[-11,4],[-11],[3,4,13],[-13,-3],[-13,-4],[-2,12,13],[-12,2],[-13,-12],[-12],[-7,-6,14],[-14,6],[-14,7],[-14],[6,7,16],[-16,-6],[-16,-7],[-5,15,16],[-15,5],[-16,-15],[-15],[-10,-9,17],[-17,9],[-17,10],[-17],[9,10,19],[-19,-9],[-19,-10],[-8,18,19],[-18,8],[-19,-18],[-18],[2,5,8,20],[-20,-2],[-20,-5],[-20,-8],[-20],[3,6,9,21],[-21,-3],[-21,-6],[-21,-9],[-21],[4,7,10,22],[-22,-4],[-22,-7],[-22,-10],[-22]]
Ausgabe:
eine erfüllende Belegung
oder ein Beweis für Nichterfüllbarkeit
benutzt die Schnittstelle aus ersatz
minisat :: Solver SAT IO
type Solver s m
= s -> m (Result, IntMap Bool)
data Result
= Unsolved | Unsatisfied | Satisfied
class DIMACS t where
dimacsNumVariables :: t -> Int
dimacsClauses :: t -> Seq IntSet
data SAT; instancs DIMACS Satvollständige Suche (alle Belegungen, vollst. Binärbaum)
unvollständige Suche (einige Belegungen)
evolutionär (Genotyp Belegung)
lokale Suche (Selman, Kautz, Cohen 1993: Walksat)
verbesserte vollständige Suche (Erkennen und Abschneiden sinnloser Teilbäume)
DPLL (Davis, Putnam, Logeman, Loveland 1960/61)
weitere Verbesserungen durch
Lernen (und Vergessen!) von zusätzlichen Klauseln
Vorverarbeitung zum Entfernen von Variablen
Parallelisierung
(Kommunikation mehrerer Suchverfahren)
Genotyp: Bitfolge fester Länge
Phänotyp: Belegung
Fitness: z. B. Anzahl der von erfüllten Klauseln
Operatoren:
Mutation: einige Bits ändern
Kreuzung: one/two-point crossover?
Problem: starke Abhängigkeit von Variablenreihenfolge
Bart Selman, Cornell University,
Henry Kautz, University of Washington
https://web.archive.org/web/20070311005144/http://www.cs.rochester.edu/u/kautz/walksat/
Algorithmus:
beginne mit zufälliger Belegung
wiederhole: ändere das Bit, das die Fitness am stärksten erhöht
Problem: lokale Optima — Lösung: Mutationen.
Davis, Putnam (1960), Logeman, Loveland (1962),
Zustand partielle Belegung
Decide: eine Variable belegen
Propagate: alle Schlußfolgerungen ziehen
Beispiel: Klausel , partielle Belegung ,
Folgerung:
bei Konflikt (widersprüchliche Folgerungen)
(DPLL original) Backtrack (zu letztem Decide)
(DPLL mit CDCL) Backjump (zu früherem Decide)
für partielle Belegung (Bsp: ): Klausel ist
erfüllt, falls , Bsp:
Konflikt, falls , Bsp:
unit, falls ,
Bsp: . Dabei ist das Unit-Literal.
offen, sonst. Bsp: .
Eigenschaften: für CNF und partielle Belegung :
wenn : ist Konflikt für , dann mit
(d.h., die Suche kann dort abgebrochen werden)
wenn : ist Unit für mit Literal , dann
(d.h., kann ohne Suche belegt werden)
Eingabe: CNF
,
Ausgabe: Belegung
mit
oder UNSAT.
(verwendet Keller für Entscheidungspunkte):
(success) falls , dann halt (SAT), Ausgabe .
(backtrack) falls eine -Konfliktklausel enthält, dann:
falls Keller leer, dann halt (UNSAT)
sonst und .
dabei ist die Belegung vor decide
(propagate) falls eine -Unitklausel mit Unit-Literal enthält: .
(decide) sonst wähle , push, und .
Termination: DPLL hält auf jeder Eingabe
Korrektheit: wenn DPLL mit SAT hält, dann .
Vollständigkeit: wenn DPLL: UNSAT, dann
wird bewiesen durch Invariante
(wenn DPLL derzeit betrachtet, und wenn ein Modell besitzt, dann ist unterhalb oder rechts von )
dabei bedeutet: :
oder
Satz (Ü): für alle endlichen : ist eine wohlfundierte Relation auf der Menge der partiellen -Belegungen:
[[2,3],[3,5],[-3,-4],[2,-3,-4]
,[-3,4],[1,-2,-4,-5],[1,-2,4,-5]]
decide belegt immer die kleinste freie Variable, immer zunächst negativ
[[2,3],[3,5],[-3,-4],[2,-3,-4]
,[-3,4],[1,-2,-4,-5],[1,-2,4,-5]]
[Dec (-1),Dec (-2),Prop 3,Prop (-4),Back
,Dec 2,Dec (-3),Prop 5,Prop (-4),Back
,Dec 3,Prop (-4),Back,Back,Back
,Dec 1,Dec (-2),Prop 3,Prop (-4),Back
,Dec 2,Dec (-3),Prop 5]
Grundlage ist effiziente Impl. von UP und Konflikt-Erkennung
Methoden:
Wahl der nächsten Entscheidungsvariablen
(kommt am häufigsten in aktuellen Konflikten vor)
Lernen von Konflikt-Klauseln (erlaubt Backjump)
Vorverarbeitung (Variablen und Klauseln eliminieren)
alles vorbildlich implementiert und dokumentiert in Minisat http://minisat.se/ (Niklas Een, Niklas Sorenson) (seit ca. 2005 sehr starker Solver)
später übernimmt diese Rolle: Cadical, Kissat https://fmv.jku.at/kissat/ (Armin Biere)
Geben Sie eine erfüllbare CNF an, für die monotone lokale Suche
improve n cnf b0 = ...
let b1 = S.insert (negate l) $ S.delete l b0
if badness cnf b1 <= badness cnf b0
then improve n cnf b1
else improve n cnf b0
nicht funktioniert: es gibt eine Belegung , von der aus keine zulässige Schrittfolge zu einer erfüllenden Belegung führt. Hinweis: z.B., weil es überhaupt keine erlaubten Schritte gibt.
Wie behandeln gsat/walksat diesen Fall?
wenden Sie den SAT-Solver mit lokaler Suche auf realistische CNFs an, z.B. aus Kodierung Rösselsprung.
wie werden in minisat (kissat, …) Einheits- und Konfliktklauseln erkannt? (Hinweis: two watched literals)
unit propagation (UP) implementieren:
Einheitsklauseln erkennen:
type Literal = Int
units :: CNF -> [Literal]
units [[1,2],[-3],[3,4]] = [-3]
ein Literal belegen:
assign :: Literal -> CNF -> CNF
assign (-3) [[1,2],[-3],[3,4]] = [[1,2],[4]]
Wo stehen die entsprechenden Funktionen im Quelltext der Autotool-Aufgabe zu DPLL?