DPLL

Der DPLL-Algorithmus ist ein rekursiver Algorithmus zur Entscheidung der Erfüllbarkeit von Formeln in KNF.

Darstellung einer Formel

Eine Formel

φ:=⋀i=1n⋁j=1niLi,j

wird als Klauselmenge

Φ:={{L1,1,…,L1,n1},…,{Ln,1,…,Ln,nn}}}

repräsentiert.


Basis-Algorithmus:

DPLL(Φ,β)

Eingabe

Ausgabe


Algorithmus

  1. Fall 1: [[Φ]]β=1
    → gib β zurück.

  2. Fall 2: [[Φ]]β=0
    → gib "unerfüllbar" zurück.

  3. Fall 3: [[Φ]]β ist unbestimmt
    Führe nacheinander aus:

    1. (a) reduce(β, Φ)
      Reduziert die Klauselmenge, meist durch Unit Clause Propagation.
    2. (b) branch(β)
      Wähle eine unbelegte Variable X∈var(Φ) und einen Wahrheitswert t∈{0,1}.

    Rekursion:

    β′:=DPLL(Φ,β[X↦t])
    • Wenn β′≠ unerfüllbar → gib β′ zurück
    • sonstreturnDPLL(Φ,β[X↦1−t])

Hilfsfunktion: reduce(β, Φ)

Dient der Reduktion der Formel nach jedem Schritt.

Unit Clause Propagation (Einer-Klauseln):

Enthält Φ eine Klausel

C={L1,…,Lk}

in der alle bis auf ein Literal bereits durch β belegt sind,
dann muss jede erfüllende Belegung das letzte Literal Li wahr machen.

Wiederhole, bis es keine Einer-Klauseln mehr gibt.


Hilfsfunktion: branch(β)

Wählt eine unbelegte Variable zur Fallunterscheidung.

Typische Heuristiken:

DPLL Optimierungen

  1. Auswahlregeln (Heuristiken): Welches Literal wird beim Branching gewählt? (z.B. MOM, DLIS).
  2. Conflict Analysis: Bei einer Sackgasse (Konflikt) wird analysiert, warum der Konflikt auftrat, um intelligenter zurückzuspringen (Non-chronological Backtracking).
  3. Clause Learning (CDCL): Aus der Konfliktanalyse werden neue Klauseln gelernt und zur Formel hinzugefügt, um denselben Fehler in Zukunft zu vermeiden.
  4. Random Restarts: Der Solver wird neu gestartet (unter Beibehaltung gelernter Klauseln), um nicht in lokalen Minima festzustecken.