Teorema di ook (Idea generale) Dato L NP, costruire una trasformazione polinomiale f da L a L (sodd, e), cioè il linguaggio composto dalle stringhe che corrispondono ad istanze del problema sodd. La trasformazione f opera in questo modo: dato L e la specifica della NDTM N che decide L, e data la stringa di ingresso x f( = φ ( N, dove φ ( N, è vera su un assegnamento di verità sse una computazione accettante di N su x. φ ( N, è costruita in modo tale che l assegnamento di verità descriva un ramo di computazione di N su input x. Tre tipi di variabili utilizzate: o H(i, t) posizione della testina posizione i al tempo t o S(k, t) stato della macchina stato k al tempo t o (i, j, t) simboli sul nastro alla posizione i c è il simbolo σ j al tempo t. Per descrivere la macchina usando le precedenti variabili servono alcune condizioni, per assicurare che l espressione booleana specifichi una computazione della NDTM. Tali condizioni sono 7 e se sono TUTTE verificate φ è sodd x L. Per ogni condizione usiamo una diversa formula, costruita a partire dalle precedenti variabili. Es. Data la NDTM N, ad ogni istante di tempo la testina di N è posizionata su una sola cella del nastro. Per codificare questa condizione costruiamo un espressione A = A 0 A 1 A 2 A p(n) p(n) = tempo di computazione di N. Ogni A i assicura che al tempo i la testina è posizionata su una sola cella. NB La trasformazione è polinomiale deterministica: DTM che costruisce φ in tempo polinomiale. 1
Teorema di ook: SODD è NP_completo. Sodd Istanza: espressione booleana φ in FN nelle variabili (x 1, x 2, x n ). Domanda: φ è soddisfacibile? ( assegnamento di verità che soddisfi φ?) Dimostrazione: Bisogna dimostrare che: 1) SODD NP. 2) trasformazione polinomiale f da ogni linguaggio L NP a L(sodd, e) L NP si ha che L < L sat. 1) Una NDTM che risolve SODD ha le seguenti due componenti: - Guess fornisce un assegnamento di verità - heck verifica l assegnamento in tempo polinomiale. 2) Preso L NP, x *, x L sse f( L(sodd, e). Poiché L NP NDTM che decide L, NL f L ( è una codifica che ad ogni x fa corrispondere un espressione booleana. Bisogna mostrare che: x è accettata da N L f L ( è un espressione booleana soddisfacibile. L NP NDTM per L f L( sodd, e) f ( = φ( N, è sodd Identifichiamo L in NP con la NDTM che lo decide x L sse una computazione accettante di NL su x. Il passaggio a SODD lo facciamo attraverso la NDTM: una computazione accettante di N L su x sse φ ( N, è soddisfacibile. Problema: ostruire un espressione booleana a partire dalla NDTM, con le seguenti 2 richieste: 1) Data N L che decide L, costruire un espressione booleana in FN che dipende da N e da x in modo che: φ ( N, è soddisfacibile sse N accetta x. 2) La costruzione di φ ( N, deve essere fatta in tempo polinomiale da una DTM. 2
La trasformazione f ha in input: - N L = (K,,, q0) NDTM per L - x stringa in ingresso N L. (N L, Istanza di SODD f Poniamo: - = n simboli - K = l stati - p(n) = complessità temporale di N L ( L NP tempo polinomiale per NDTM). N accetta x in tempo p(n) sse accettante e si ha che q p(n). sequenza di configurazioni c0 c 1 c 2 c q tale che c q è Assumiamo che NL impieghi sempre p(n) passi per accettare. (Se richiede meno passi basta eseguire finte computazioni). Assumiamo che la stringa sul nastro abbia esattamente lunghezza p(n). Albero di computazione Tutti i rami hanno la stessa lunghezza: dalla radice alle foglie ci sono p(n) nodi. Stringa di computazione > s s 2 K s K 14444 i _ _ _ 244443 1 Lunghezza p ( n) _ = blank (vengono aggiunti affinchè la stringa raggiunga la lunghezza p(n)). 3
Problema: come distinguiamo con una formula φ ( N, il fatto che / o una computazione accettante di NL su x? φ ( N, è soddisfacibile sse assegnamento di verità che rende vera φ ( N, se sequenza di configurazioni c 0 c 1 c 2 c p(n) accettante dovrà corrispondere ad un assegnamento di verità alle variabili di φ, in modo che φ sia soddisfatta. Ogni assegnamento di verità alle variabili di φ dovrà rappresentare in modo univoco una computazione della macchina N. Dobbiamo costruire le variabili di φ in modo che descrivano delle configurazioni della NDTM. Per poter ottenere questo, dovremo costruire espressioni particolari utilizzando le operazioni logiche,,. Abbiamo bisogno di tre tipi di variabili (poiché ogni configurazione di TM è descritta da (q, σ, p) rispettivamente stato della macchina, stringa sul nastro e posizione della testina): S(k, t) con 1 k p(n) e 0 t p(n) S(k, t) = TRUE sse al tempo t lo stato della macchina è q k. (i, j, t) con 1 i p(n), 1 j e 0 t p(n) (i, j, t) = TRUE sse al tempo t la i-esima cella del nastro contiene il simbolo σ. j H(i, t) con 1 i p(n) e 0 t p(n) H(i, t) = TRUE sse al tempo t la testina è posizionata sull i-esima cella del nastro. Es. (tempo = 5) > σ σ _ _ 2 σ 4 3 q 4 S(4, 5) (1, 2, 5) (2, 4, 5) (3, 3, 5) H(2, 5) 4
Utilizzando i precedenti tre tipi di variabili posso dare una descrizione della macchina, configurazione per configurazione. Problema: costruzione dell espressione Es. (1, 1, 1) (1, 3, 1) H(2, 1) S(3, 1) Se diamo un assegnamento di verità in cui tutte queste variabili sono vere, ottengo che l espressione precedente è vera. Ma questa espressione non descrive una configurazione di una macchina (le due variabili indicano che ci sono due simboli diversi nello stesso momento, nella stessa cella). Data l espressione booleana U(x 1 x 2 x n ) che assume valore TRUE sse ESATTAMENTE UNA variabile x i assume valore true: U(x 1 x 2 x n ) = (x 1 x 2 x n ) ( ( x i, j, i j i x j ) ) vera se almeno una tra le x i è vera se ci sono due variabili entrambe vere, questa espressione risulta falsa osto per la costruzione dell espressione precedente: O(n 2 ) polinomiale per DTM. onsideriamo una stringa x. Tale stringa è accettata se: data una sequenza di configurazioni di una NDTM su ingresso x, per ciascuna configurazione c i sono verificate le seguenti condizioni: 1. La testina è posizionata su una sola cella. 2. Ogni posizione del nastro contiene un solo simbolo. 3. La macchina N si trova in un solo stato. 4. Nella configurazione c i+1, la stringa memorizzata sul nastro differisce da quella in c i in al più un simbolo, quello sotto la testina in c i. 5. La transizione tra due configurazioni è determinata dalle regole in N. 6. c 0 deve essere la configurazione iniziale, (S, >, (oppure (S, x, 0)). 7. p(n) deve essere una configurazione accettante. NB (1 4) la NDTM è costruita correttamente, (5 7) la computazione è corretta e accettante. 5
Dobbiamo costruire espressioni booleane garantiscano che le precedenti proprietà siano soddisfatte. ostruiamo allora le espressioni come segue: 1. A = A 0 A 1 A p(n) dove istante t, A t = U (H(1, t), H(2, t),, H(p(n), t)) 0 t p(n) (Posizioni della testina: ad ogni istante, la testina si trova su una sola cella.) OSTO: A i (p(n)) 3 A O(p (n)) 2 Dato che U( ) O(n 2 ) 2. B = Bi, t con 1 i p(n), 0 t p(n) t i, B i, t = true sse al tempo t, l i-esima cella del nastro contiene esattamente un simbolo di. B i, t = U ((i, 1, t), (i, 2, t),, (i,, t)) OSTO: B = O(p 2 (n)) ( B i, t dipende da ) 3. = 0 t p( n) t t = true sse la macchina all istante t è in un preciso stato. t = U (S(1, t), S(2, t),, S( K, t)) OSTO: = O(p 2 (n)) 4. D = Di, j, t con 1 i p(n), 1 j e 0 t p(n) i t, j, D i, j, t = true sse al tempo t, la testina è posizionata sull i-esima cella o il simbolo in i non viene modificato. (ontrolla che non venga modificato un simbolo diverso da quello sotto la testina all istante t). D i, j, t = ((i, j, t) = (i, j, t+1)) H(i, t) I simboli sul nastro non devono cambiare, solo quello sotto la testina può farlo. Se sono alla posizione i, i simboli possono cambiare (H(i, t) è vero, per cui D(i, j, t) è vero anche se (i, j, t) (i, j, t+1)). OSTO: D = O(p 2 (n)) 6
5. E = E i, j, k, t i, j, k, t con 1 i p(n), 1 j, 1 k K e 0 t p(n) E è vera sse nella computazione c 0 c 1 c 2 c p(n) ogni transizione tra due configurazioni successive è determinata da. E i, j, k, t = [(i, j, t) H(i, t) S(k, t)] [ ((i, jl, t+1) H(il, t+1) l I S(kl, t+1))] I = insieme degli indici l ricavati da (( σ, qk ), ( σ jl, qkl, z il )) cioè (jl, kl, il) I. j OSTO: E i, j, k, t 2 O(p (n)) 6. F = S(0, 0) H(1, 0) ( (i, ji, 0)) ( 1 i n (i, 1, 0)) n+ 1 i p( n) Inizialmente la macchina è nello stato zero. La testina è sulla prima cella. Nelle prime n celle è memorizzato l input. Nelle celle da n+1 a p(n) c è il simbolo 1 = _. F garantisce che vi sia una sola configurazione iniziale, c 0. OSTO: F = O(p(n)) 7. G = S( K, p(n)), dove K = stato di arresto. Garantisce che p(n) sia uno stato accettante. Se prendiamo φ ( N, = A B D E F G abbiamo: OSTO: ( φ ( N, ) = O(p 3 (n)) polinomiale determ. N, x φ tale che se x L c è una computazione accettante per la NDTM φ ( N, è soddisfacibile. Se φ ( N, ha un assegnamento di verità che la soddisfa questo assegnamento corrisponde ad una computazione accettante di N su x. Ne consegue: φ ( N, è soddisfacibile N accetta x. φ è costruita in tempo polinomiale da una DTM L NP, L < L(sodd, e) sodd è NP_completo. 7
ome ampliare la classe NP_completi una volta trovato un problema NP_completo Dato NP _ completi è sufficiente dimostrare che: o 1 NP, 1 o <, 1 per poter dire che NP _. NB < 1 NON viceversa! 3_sodd: versione ristretta di SAT; ogni istanza di 3_sodd è tale che ogni clausola ha ESATTAMENTE 3 letterali. Teorema: 3_sodd è NP_completo. Dimostrazione: 3_sodd NP: E sufficiente considerare una NDTM in cui il guessing stage fornisce un assegnamento di verità per le variabili e il checking stage verifica in tempo polinomiale se l assegnamento soddisfa tutte le clausole composte da 3 letterali. Poiché sappiamo che SODD NP_completi, dobbiamo dimostrare che sodd < 3_sodd. onsideriamo: U = {u 1, u 2,, u n } insieme di variabili = {c 1, c 2,, c n } insieme di clausole, facenti parte di un istanza di sodd. Dobbiamo costruire un insieme di clausole su un insieme di variabili U in modo che: - ogni clausola abbia 3 letterali. - soddisfacibile sse soddisfacibile. Variabili: avremo bisogno di tutte le variabili in U più alcune aggiuntive: U U m = U U ( j ) NB un insieme aggiuntivo clausola. j = 1 lausole: sarà ottenuto da sostituendo le clausole c j in con clausole costituite da 3 letterali: = U m j j = 1 8
Dobbiamo mostrare come costruire j e U j partendo da j. onsideriamo c j costituito da letterali {x 1, x 2,, x k }. Definiamo j e U j a seconda del valore k (cioè in base al n. di variabili che costituiscono la clausola): k = 1 c j = {x 1 } U j = { y, y j, 2 } j = {( x 1, y, y j, 2 ), (x 1, y, y j, 2 ), (x 1, y, y j, 2 ), (x 1, y, y j, 2 )} = k = 2 = (x 1 y y j, 2 ) (x1 y y j, 2 ) (x 1 y y j, 2 ). c j = {x 1, x 2 } U j = { y } j = {(x1, x 2, y ), (x 1, x 2, y )} k = 3 c j = {x 1, x 2, x 3 } U j = { } j = {c j } c k 4 c j = {x 1, x 2,, x k } U j = { yj, i 1 i k - 3} j = {( x 1, x 2, y )} {( Es. k = 4 {( x 1, x 2, y )} {( y, x 3, x 4 )} y j, i, x i+2, y j, i+1 ) : 1 i k 4} {( j, k 3 j, 2 K = 5 {( x 1, x 2, y )} {( y, x 3, y j, 2 )} {( y, x 4, x 5 )} y, x k-1, x k )} 9
Le clausole j sono costruite in modo da essere soddisfacibili sse le cj sono soddisfacibili (da cui è soddisfacibile sse è soddisfacibile). Dobbiamo far vedere come costruire l assegnamento di verità t, estensione di t alle variabili in U. ominciamo a far vedere che: è soddisfacibile è soddisfacibile. k = 1 e k = 2: va bene un assegnamento qualunque (per come sono costruite le clausole): possiamo prendere t (y) = TRUE, y U j. Il fatto che vera o falsa) j sia vera o falsa dipende solo da t (e quindi dal fatto che cj sia se t che soddisfa cj t che soddisfa j. k = 3: non ci sono variabili aggiuntive, quindi t = t. k > 3: prendiamo t che soddisfa c j. assegnamento t che rende vera j? Poiché t soddisfa c j, almeno un letterale deve essere vero. Prendiamo quello di indice minore e indichiamo con l tale indice. - se l = 1 o l = 2 t (y j, i ) = F i, 1 i k - 3 (tutte le variabili aggiunte vengono poste a Falso) - se l = k o l = k 1 t (yj, i) = T i, 1 i k 3 (tutte le variabili aggiunte vengono poste a Vero) - se 3 l k 2 t (yj, i) = T i, 1 i l 2 t (y j, h ) = F h, l - 1 h k 3 (precedenti vere, seguenti false). La scelta di t assicura che tutte le variabili aggiuntive siano poste ad un valore per cui j risulta VERO. Per cui: se t soddisfa ogni cj è soddisfatta ogni j può essere soddisfatta con t è soddisfacibile. Al contrario: se t soddisfa ogni j è soddisfatto la restrizione di t alle sole variabili in U soddisfa ogni c j è soddisfatta. 10
Ne consegue che: è soddisfacibile sse è soddisfacibile. Per dimostrare che: 3_sodd è NP_completo, rimane solo da verificare che la trasformazione può essere eseguita in tempo polinomiale. Questo si può ricavare notando che il numero di clausole in è limitato da p(m * n) e ogni clausola è costruibile in tempo polinomiale. 3_sodd è NP_completo. 11