Share to: share facebook share twitter share wa share telegram print page

Algoritmo di Davis-Putnam

L'algoritmo di Davis-Putnam fu sviluppato da Martin Davis e Hilary Putnam allo scopo di verificare la soddisfacibilità booleana (SAT) di formule di logica proposizionale in forma normale congiuntiva (CNF). È un tipo di procedimento di risoluzione nel quale le variabili sono scelte iterativamente ed eliminate, risolvendo ogni clausola in cui questa compaia diretta con ogni clausola in cui compaia negata.

L'algoritmo DP è stato il primo algoritmo per la risoluzione di problemi SAT. Ma questo in generale è molto inefficiente poiché richiede un uso esponenziale della memoria, quindi è adatto a problemi di piccole dimensioni. La sua evoluzione è un algoritmo di ricerca chiamato DPLL. A volte l'algoritmo di Davis–Putnam o DP è scorrettamente usato in riferimento DPLL, ma questi due sono ben distinti.

Definizione

L'algoritmo funziona nel seguente modo:

 1) elimino tutte le clausole con un solo letterale (unit propagation) |→
        - se la formula contiene le clausole (x) e (¬x) |→ la formula è insoddisfacibile.
        - se la formula contiene la clausola (x) |→
              • elimino tutte le clausole che contengono x.
              • elimino il letterale (¬x) da tutte le altre clausole.
        - se la formula è vuota |→ la formula è soddisfacibile.
 2) per un letterale puro, nella formula compare solamente (x) e non (¬x) |→ assegno x=true
 3) eliminazione di variabili per risoluzione |→
        - per ogni variabile nella formula, ad esempio x |→
              • si producono delle clausole del tipo (A  B), a partire da coppie (x  A) e (¬x  B).
        - una volta risolte ogni coppia di clausole possibili per la variabile x, vengono eliminate tutte le clausole che contengono x e ¬x.

Qui letterale e variabile hanno lo stesso significato.

In generale se ho n clausole che contengono il letterale x e m clausole che contengono il letterale ¬x, eliminerò (n+m) clausole dalla formula, ma per farlo dovrò aggiungere le (n*m) clausole generate. Per questo l'algoritmo ha un notevole consumo di memoria.

Esempio

Vogliamo verificare se la seguente formula è soddisfacibile.

 (ab)  (¬ab)  (¬ad)  (c)  (¬cb¬d)  (cd)  (a¬d)

1) Eliminiamo le clausole con un solo letterale.

 (ab)  (¬ab)  (¬ad)  (c)  (¬cb¬d)  (cd)  (a¬d) →
 (ab)  (¬ab)  (¬ad)  (b¬d)  (a¬d)

2) Assegnamo True ai letterali puri. Abbiamo un solo letterale puro, b. Possiamo quindi eliminare tutte le clausole in cui compare b.

 (ab)  (¬ab)  (¬ad)  (b¬d)  (a¬d) →
 (¬ad)  (a¬d)

3) Sono rimasti due letterali da risolvere. Scegliamo il letterale a. L'ultima formula può essere riscritta come:

 (¬ada¬d) →
 (¬ada¬d) →
 (d¬d) →
 ()

Alla fine otteniamo una formula vuota, quindi la formula originale è soddisfacibile.

Bibliografia

Kembali kehalaman sebelumnya