Algoritmo di Davis-Putnam

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

L'algoritmo di Davis-Putnam fu sviluppato da Martin Davis e Hilary Putnam allo scopo di verificare la soddisfacibilità booleana 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.

Algoritmo DP[modifica | modifica wikitesto]

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) |→ il problema è FALSE.
        - 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 |→ il problema è SAT.
 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[modifica | modifica wikitesto]

Vogliamo verificare se la seguente formula è soddisfacibile.

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

1) Elimino le clausole con un solo letterale.

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

2) Assegno 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 ho una formula vuota, quindi il problema è SAT.

Fonti[modifica | modifica wikitesto]

  • R. Dechter and I. Rish. Directional resolution: The Davis-Putnam procedure, revisited. In Proceedings of the Fourth International Conference on the Principles of Knowledge Representation and Reasoning (KR'94), pages 134–145, 1994.