DPLL
Der DPLL-Algorithmus ist ein rekursiver Algorithmus zur Entscheidung der Erfüllbarkeit von Formeln in KNF.
Darstellung einer Formel
Eine Formel
wird als Klauselmenge
repräsentiert.
Basis-Algorithmus:
DPLL( )
Eingabe
- Klauselmenge
- partielle Belegung
mit
Ausgabe
- eine erweiterte Belegung
mit oder - "
unerfüllbar"
Algorithmus
-
Fall 1:
→ gibzurück. -
Fall 2:
→ gib "unerfüllbar" zurück. -
Fall 3:
ist unbestimmt
Führe nacheinander aus:- (a)
reduce(β, Φ)
Reduziert die Klauselmenge, meist durch Unit Clause Propagation. - (b)
branch(β)
Wähle eine unbelegte Variableund einen Wahrheitswert .
Rekursion:
- Wenn
unerfüllbar → gib zurück - sonst
- (a)
Hilfsfunktion: reduce(β, Φ)
Dient der Reduktion der Formel nach jedem Schritt.
Unit Clause Propagation (Einer-Klauseln):
Enthält
in der alle bis auf ein Literal bereits durch
dann muss jede erfüllende Belegung das letzte Literal
- Falls
, füge zu hinzu. - Falls
, füge zu hinzu.
Wiederhole, bis es keine Einer-Klauseln mehr gibt.
Hilfsfunktion: branch(β)
Wählt eine unbelegte Variable zur Fallunterscheidung.
Typische Heuristiken:
- DLIS (dynamic largest individual sum):
Wähle Literal, das am häufigsten vorkommt; setze es auf 1. - DLCS (dynamic largest combined sum):
Wähle Variable, die (positiv+negativ) am häufigsten vorkommt. - MOM (maximal occurrence in minimal clauses):
Wähle Variable, die am häufigsten in den kürzesten Klauseln vorkommt.
DPLL Optimierungen
- Auswahlregeln (Heuristiken): Welches Literal wird beim Branching gewählt? (z.B. MOM, DLIS).
- Conflict Analysis: Bei einer Sackgasse (Konflikt) wird analysiert, warum der Konflikt auftrat, um intelligenter zurückzuspringen (Non-chronological Backtracking).
- Clause Learning (CDCL): Aus der Konfliktanalyse werden neue Klauseln gelernt und zur Formel hinzugefügt, um denselben Fehler in Zukunft zu vermeiden.
- Random Restarts: Der Solver wird neu gestartet (unter Beibehaltung gelernter Klauseln), um nicht in lokalen Minima festzustecken.