DPLL

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

Darstellung einer Formel

Eine Formel

φ:=i=1nj=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 Xvar(Φ) und einen Wahrheitswert t{0,1}.

    Rekursion:

    β:=DPLL(Φ,β[Xt])
    • Wenn β unerfüllbar → gib β zurück
    • sonstreturnDPLL(Φ,β[X1t])

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.