1.1 NP Completo
Un problema decisionale appartiene ad NP se una macchina di Turing non de-
terministica può calcolare la soluzione in tempo polinomiale.
Un problema decisionale è NP-completo se appartiene a NP e se ogni problema
appartenente ad NP può essere ridotto ad esso in tempo polinomiale.
Un’istanza del problema di soddisfacibilità booleana è un’espressione booleana
che combina variabili booleane usando degli operatori booleani. Un’espressione
è soddisfacibile se c’è almeno un assegnamento di valori di verità alle variabili
tale che l’espressione sia vera.
2 Il Problema 3SAT
Il 3SAT è un problema decisionale di ”soddisfacibilità booleana” (logica binaria
o SAT), dove si vogliono trovare le soluzioni di una funzione logica, costituita
da AND di clausole, dove una clausola è però costituita da due OR di 3 letterali
e in gioco vi sono n variabili con n>3. In altri termini ad esempio per n=4
variabili A1,A2,A3,A4 abbiamo clausole costituite dall’OR con sole 3 variabili
(o combinazioni di NOT e/o variabili) e tutte le clausole scelte sono poi in AND.
Le soluzioni sono tutte quelle ottenute, tenendo conto dei valori assunti dalle
variabili (condizioni iniziali), mettendo prima in OR i valori di 3 letterali di una
clausola e infine mettendo in AND le varie clausole assegnate, e che compor-
tano alla fine che la funzione logica valga TRUE. Le clausole si dicono in forma
normale congiuntiva ( CNF ). Ciò comporta che:
1) può esistere o meno la soluzione costituita da tutte le variabili (esistono delle
clausole che vanno scartate o che se usate comportano che la funzione logica
dà come risultato FALSE). Ad esempio supponiamo il problema n=4, alcune
soluzioni non utili per la funzione sono:
A1 A2 A3 A4
FUNZIONE LOGICA
FALSE PER LA SOLUZIONE
1 1 1 1 AND(OR(OR(NOT(A1),NOT(A2)),NOT(A3)),OR(OR(A1,A2),A4) 0 0
1 0 AND(OR(OR(A1,A2),A3),OR(OR(A1,A2),A4))
A1 A2 A3 A4
FUNZIONE LOGICA
TRUE PER LA SOLUZIONE
0 0 0 1 AND(OR(OR(NOT(A1),NOT(A2)),NOT(A3)),OR(OR(A1,A2),A4)
Ovviamente la stessa funzione per una configurazione di valori dei letterali
risulta falsa e per un’altra vera; in altri casi può essere addirittura sempre falsa,
1
ovvero non ammette soluzione. Per cui sono possibili vari tipi di problemi:
a) assegnata la funzione logica trovare le soluzioni
b) assegnata una soluzione quali clausole devono essere scartate per non dare
FALSE nella funzione logica
c) se è possibile minimizzare la funzione logica in taluni casi, il che vuol dire che
alcune clausole potrebbero essere ininfluenti o che la funzione logica è invariante
rispetto a inserire o togliere certe clausole. In sostanza sono, quindi, importanti
le minimizzazioni della funzione logica e l’esistenza della soluzione. In generale
esistono molti metodi di minimizzazione tra cui quello degli Implicanti primi (
Quine-McCluskey ) o più semplicemente le mappe di Karnaugh .
Le mappe di Karnaugh hanno un limite di utilizzabilità pratica appena il nu-
mero dei letterali in gioco supera 4-5 diventano poco facili a gestirsi; mentre
il metodo degli implicanti Primi (vedi [1]) gestisce meglio n variabili, ma risol-
vendo un problema NP-difficile il tempo di esecuzione è esponenziale al crescere
dei letterali.
L’interesse per i pro blemi SAT, 2SAT, 3SAT è nato col Teorema di Cook e
Levin (vedi [4]), che afferma che il problema della soddisfacibilità booleana è
NP-complete. Il che vuol dire che un problema in NP può essere ridotto in un
tempo polinomiale con una macchina di Turing deterministica se una formula
booleana è soddisfacibile. SAT fu proprio il primo problema che fu dimostrato
da Cook come NP-difficile. Ovviamente ne esistono molti altri problemi come
quello dello zaino, etc.
2
3.2 Ogni linguaggio in NP è riducibile a SAT in tempo
polinomiale
Usiamo una tabella per codificare tutti gli stati di un ramo di una computazione
di una macchina non deterministica. Quindi l’alfabeto dei simboli che com-
paiono nella tabella è:
C = Q ∪ Γ ∪ { ]}
Visto che ogni ramo di computazione può avere al più tempo polinomiale, sap-
piamo che gli stati possibili all’interno di questo ramo sono al più nk configu-
razioni. Quindi è possibile creare una tabella avente nk righe ed nk colonne, di
cui ogni riga rappresenta una configurazione del ramo di computazione.
Ogni riga di questa tabella contiene il contenuto del nastro della macchina di
Turing e lo stato corrente, messo prima del simbolo su cui la macchina punta
attualmente. Inoltre, il simbolo ] rappresenta l’inizio e la fine di ogni stringa ed
il simbolo rappresenta una cella vuota. Ad esempio, una configurazione iniziale
conterrà i simboli:
], q0 , w0 , w1 , ..., wn ,, ...,, ]
E se la testina dovesse spostarsi in avanti, si avrebbe la stringa:
], w0 , q0 , w1 , ..., wn ,, ...,, ]
È possibile creare un insieme di formule booleane che verifichino determinate
condizioni di questa tabella:
-ad ogni cella è associato un ed un solo simbolo;
-la prima riga della tabella rappresenta la configurazione iniziale;
-ogni transizione da una riga alla riga successiva è valida;
-almeno una riga della tabella rappresenta uno stato di accettazione.
La formula finale sarà la congiunzione di queste quattro formule:
φ = φcell ∧ φstart ∧ φmove ∧ φaccept φ = φcell ∧ φstart ∧ φmove ∧ φaccept
Detto questo, bisogna dimostrare due cose:
-è effettivamente possibile generare una formula booleana di lunghezza polino-
miale dalla congiunzione delle formule di cui sopra;
. -una assegnazione di tale formula rappresenta un ramo di computazione che
accetti
3
-Questo è un controllo più che altro sintattico sul contenuto della tabella. In
questa formula non viene fatta alcuna verifica sul reale significato dei simboli
presenti.
-un simbolo che cambia da una riga ad un’altra senza che la testina sia pun-
tata sulla cella in cui il simbolo si trova;
-una riga contiene due stati della macchina di Turing;
-i simboli scritti e gli spostamenti a destra o sinistra non rientrano nella funzione
di transizione della macchina
^ di Turing. ^
Cioè: φmove = (laf inestra(i, j) è lecita)φmove = (laf inestra(i, j)èlecita)
1≤i<nk ,1<j<nk 1≤i<nk ,1<j<nk
La finestra (i, j) è la finestra di due righe e tre colonne che ha la cella in alto al
centro in posizione (i, j).
3.7 Conseguenze
Una volta dimostrato che ogni problema appartenente a NP può essere ridotto
in tempo polinomiale ad una istanza del problema di soddisfacibilità booleana,
4
si deduce che se questo problema potesse essere risolto in tempo polinomiale
da una macchina di Turing deterministica, tutti i problemi in NP potrebbero
essere risolti in tempo polinomiale, e quindi la classe di complessità NP sarebbe
uguale alla classe di complessità P.