Salta ai contenuti. | Salta alla navigazione

Strumenti personali

SAT

Un problema SAT è costituito da un insieme di clausole booleane.

Ciascuna clausola è l'OR di un insieme di letterali.

Ogni letterale può essere un atomo o un atomo negato.

Ad esempio, il seguente è un problema SAT:

 

  • X1 \/ not(X2) \/ not(X3)
  • not(X1) \/ X2 \/ not(X3)

 

Una soluzione è un assegnamento alle variabili per cui tutte le clausole sono soddisfatte (tutti gli OR sono veri), ad es X1=1, X2=1, X3=0.

 

Di solito i problemi SAT vengono dati in formato CNF DIMACS.

Per leggere il formato DIMACS, si può usare il predicato read_cnf(NomeFile) dal file read_cnf.ecl

read_cnf(NomeFile) salva l'istanza con un insieme di fatti. Il nome del file può essere dato come stringa (fra doppie virgolette) o come atomo (fra apici singoli).

È presente un fatto cnf(NumeroVariabili,NumeroClausole) e poi un insieme di NumeroClausole fatti clausola(Lista) che rappresentano le varie clausole.

Ciascuna clausola è rappresentata con una lista di numeri interi. Un valore positivo i rappresenta l'i-esima variabile, mentre un valore negativo rappresenta l'i-esima variabile negata.

Il problema sopra è quindi rappresentato come:

cnf(3,2).
clausola([1,-2,-3]).
clausola([-1,2,-3]).

Si scriva un programma ECLiPSe che risolve un problema SAT. Lo si provi poi con queste istanze:

Altre istanze si possono trovare su