13. complessita’ di calcolo - uniroma1.itfiii/materiale_schaerf/13.complessita'.pdf · - nel...
TRANSCRIPT
13. COMPLESSITA’ DI CALCOLO
13.1 INTRODUZIONE Concetti di base: Upper bound e lower bound di complessità di risoluzione di un problema (es: il problema dell’ordinamento di un vettore di n elementi ha un upper bound O(n log n) ed un lower bound Ω(n log n) in termini di confronti). Obiettivo: - classificare i problemi dal punto di vista della loro complessità, cioè della quantità di risorse di calcolo che la loro soluzione richiede - caratterizzare i problemi risolubili in tempo polinomiale e quelli che sappiamo risolvere solo con algoritmi di costo esponenziale. Modelli di calcolo: prevalentemente macchine di Turing.
Risorse: tempo e spazio (memoria) di calcolo. Risultati fondamentali: • relazioni tra diversi modelli di calcolo (MT a uno e più nastri, MT deterministiche e nondeterministiche, MT e RAM) • relazioni tra spazio e tempo • gerarchie di classi • caratterizzazione dei problemi trattabili (risolubili in pratica) e dei confini del concetto di trattabilità computazionale • NP-completezza.
Tipi di problemi Data una funzione f: I → P(O) che associa ad un'istanza x ∈ I un insieme di possibili output f(x) possiamo porre i seguenti problemi: • calcolo: dato x∈I determinare f(x) • decisione: dato x∈I e y∈O decidere se y∈f(x) NB: se |f(x)| ≤ 1 questi sono i soli problemi significativi • ricerca: dato x∈I cercare un y tale che y∈f(x) • enumerazione: dato x∈I determinare |f(x)| • ottimizzazione: data una metrica su O, dato x∈I determinare y∈f(x) tale che y sia l'ottimo in f(x) rispetto alla metrica
Esempio Siano I ed O l'insieme dei grafi non orientati:
G = <N,A>.
Sia f la funzione che fa corrispondere a G ∈ I tutti i suoi sottografi completi. Problema di decisione: un grafo completo G' e' un sottografo di G? Problema di ricerca: determinare un sottografo completo di G. Problema di enumerazione: quanti sono i sottografi completi di G? Problema di ottimizzazione: se come metrica adottiamo |N|, determinare un sottografo completo di G con il massimo numero di nodi.
Complessità di problemi di decisione (riconoscimento di linguaggi). • Standardizziamo l'input: ogni problema di decisione può essere formulato come problema di riconoscimento di linguaggi. • Standardizziamo l'output: (SI, NO) I concetti di complessità di problemi di decisione possono essere traslati a problemi di enumerazione o a problemi di ottimizzazione.
Esempio Decidere se un grafo ha un sottografo completo di k nodi equivale a riconoscere l'insieme: S=<G,k>| esiste un sottoinsieme N' di N tale che |N'| = k ed il sottografo indotto da N' e' completo ovvero il linguaggio: L=g(G)#b(k) | dove g(G) e' la stringa che rappresenta un grafo G, b(k) e' la rappresentazione binaria di un intero k e <G,k> appartiene ad S
13.2 CLASSI DI COMPLESSITA’ Def. Data una funzione f: N→N possiamo definire le seguenti classi di complessità di linguaggi: DTIME (f(n)): insieme dei linguaggi riconosciuti da una MTM deterministica in tempo al più O(f(n)); DSPACE (f(n)): insieme dei linguaggi riconosciuti da una MTM deterministica in spazio (di lavoro) al più O(f(n)); NTIME (f(n)): insieme dei linguaggi accettati da una MTM non deterministica in tempo al più O(f(n)); NSPACE (f(n)): insieme dei linguaggi accettati da una MTM non deterministica in spazio (di lavoro) al più O(f(n)).
Riassumendo i risultati già visti:
Relazioni tra modelli di macchina. DTIME (t(n)) ⊆ DTIMERAM (t(n) log(t(n))) DTIMERAM (t(n)) ⊆ DTIME (t2(n)) Relazioni tra macchine deterministiche e non deterministiche. NTIME (t(n)) ⊆ DTIME (t(n)2t(n))
13.3 RELAZIONI TRA CLASSI SPAZIALI E TEMPORALI
DTIME (t(n)) ⊆ DSPACE (t(n)) Ogni passo può al più richiedere una nuova cella di memoria. DSPACE (s(n)) ⊆ DTIME ((s(n)2s(n))k) Su una quantità s di nastro una MT con 1 nastro, q stati e c caratteri può al più operare per t passi dove t ≤ qscs. Se i nastri sono k abbiamo t ≤ q(scs)k. In particolare possiamo assumere c = 2. NOTA BENE. Queste relazioni valgono anche per le macchine non deterministiche.
Cosa possiamo dire della relazione tra macchine deterministiche e non deterministiche rispetto allo spazio? NSPACE (s(n)) ⊆ DSPACE ((s(n)2s(n))k) Infatti abbiamo che se la macchina nondeterministica compie t(n) passi, il nastro della macchina deterministica che effettua la simulazione, che contiene la sequenza di scelte, utilizza s'(n)≤t(n) celle. D'altra parte se la macchina nondeterministica usa s(n) celle tutto ciò che possiamo dire sul tempo è che t(n)≤(s(n)2s(n))k . Quindi abbiamo
s'(n)≤t(n)≤(s(n)2s(n))k
Possiamo fare molto meglio!
Teorema di Savitch. Sia s(n) ≥ log n: NSPACE (s(n)) ⊆ DSPACE (s(n)2) Dim. Assumiamo per semplicità che la macchina di Turing non determ. sia ad un solo nastro. Se essa usa spazio s(n) per decidere se una data stringa x (|x|=n) appartiene ad un linguaggio L abbiamo che il numero di configurazioni possibili è cs(n) (c dipende dal numero di caratteri e dal numero di stati). Definiamo la funzione REACH(c1,c2,t): REACH (c1,c2,t)= if (c1=c2)∨(c1 |— c2) then return TRUE else if ∃c3 such that REACH(c1,c3,t/2)∧REACH(c3,c2,t/2) then return TRUE else return FALSE in cui |c1|,|c2|,|c3|≤log t.
Per decidere se x∈L la macchina deterministica può semplicemente calcolare REACH(c0,cf,2s(n)). Per far ciò è necessario utilizzare spazio pari alla dimensione di una configurazione (s(n)) per il numero di configurazoni che possono essere inserite nella pila durante le chiamate ricorsive (log 2s(n)= s(n)). In totale s(n)2.
Separazione tra le classi spaziali e temporali. Def. Chiamiamo spazio-costruibile (tempo-costruibile) una funzione totale f tale che - f(n) ≥ log n (f(n) ≥ n+1) - esiste una MTM Mx che per calcolare fx per ogni n opera in spazio (tempo) f(n).
Teoremi di gerarchia. • Siano s1, s2: N→N due funzioni spazio costruibili tali che
lim(n→∞) s1(n)/s2(n) = 0 allora esiste un linguaggio L tale che L∉DSPACE(s1(n)) e L∈DSPACE(s2(n)) (L separa le classi DSPACE(s1(n)) e DSPACE(s2(n))). • Siano t1, t2: N→N due funzioni tempo costruibili tali che
lim(n→∞) t1(n)(log t1(n))/t2(n) = 0 allora esiste un linguaggio L tale che L∉DTIME(t1(n)) e L∈DTIME(t2(n)) (L separa le classi DTIME(t1(n)) e DTIME(t2(n))).
Consideriamo ora le seguenti classi di complessità notevoli: LOGSPACE = DSPACE(log n) P = ∪k DTIME(nk) NP = ∪k NTIME(nk) PSPACE = ∪k DSPACE(nk) NPSPACE = ∪k NSPACE(nk) EXPTIME = ∪k DTIME(2nk)
Queste classi rappresentano livelli di complessità "ragionevoli". (NB Per n=10, 2n2 = 2100, se fossero nanosecondi il tempo sarebbe 1014 secoli) Non ci occupiamo di classi di complessità più elevate, come • le classi doppiamente esponenziali (per n = 10, 22n = 21000): complessità della decisione di teoremi dell'Aritmetica di Presbuger; • le classi triplamente, quadruplamente ecc. esponenziali
Chiamiamo problemi elementari tutte i problemi di decisione che, per input n, richiedono tempo
222...2n con una catasta di k esponenziali con k prefissato. Oltre i problemi elementari abbiamo problemi che, per input n, richiedono tempo:
222...22
con una catasta di n esponenziali (funzione ‘torre’) Un esempio di problema che ha questo livello di complessità è il problema di decidere l'equivalenza di espressioni regolari con negazione.
Esempi. La complessità del problema di decidere se due espressioni regolari sono equivalenti è: - esponenziale, per le usuali espressioni - doppiamente esponenziale, per le espressioni con il quadrato - non elementare, per le espressioni con lanegazione.
La complessità del problema di decidere se una formula è un teorema è: - esponenziale, per formule booleane quantificate - doppiamente esponenziale, per formule della teoria dell'addizione (Aritmetica di Presburger) es. ∀x ∃y ∃z(x+z = y ∧ ∃w(w+w = y)) (per ogni x esiste un numero pari y con x ≤ y) - non elementare, per formule della teoria dell'addizione del secondo ordine es. ∃B (∃y ∈Β ∧ ∀z (z=0 ∨ y+z ∉Β) (esiste un insieme che ha un elemento massimo)
Che relazioni legano le classi notevoli? Grazie ai teoremi di gerarchia possiamo affermare le seguenti separazioni tra classi: i) P ⊂ EXPTIME ii) LOGSPACE ⊂ PSPACE Le relazioni tra macchine deterministiche e non deterministiche e il teorema di Savitch ci permettono poi di asserire che: iii) PSPACE = NPSPACE iv) P ⊆ NP ⊆ EXPTIME
Infine le relazioni tra classi spaziali e classi temporali ci permettono di asserire che: v) PSPACE ⊆ EXPTIME vi) NP ⊆ NPSPACE=PSPACE vii) LOGSPACE ⊆ P
13.4 TRATTABILITA’ COMPUTAZIONALE. In prima approssimazione definiamo trattabili i problemi che possono essere risolti in tempo polinomiale con MT. Motivazioni: - la forte differenza nell'andamento asintotico delle funzioni polinomiali rispetto a quelle esponenziali - un aumento della potenza di calcolo degli elaboratori si riflette in un fattore moltiplicativo della dimensione delle istanze risolubili in una determinata quantità di tempo mentre nel caso dei costi esponenziali si ha solo il beneficio di un termine additivo - la classe P è una classe "stabile", cioè invariante per diversi modelli di calcolo.
Esempio Se abbiamo due problemi: - P1 risolubile in tempo O(n3) - P2 risolubile in tempo O(2n), e se con la tecnologia attuale possiamo risolvere istanze di P1 e P2 di taglia m (ad esempio un problema su grafi di 1000 nodi), nel momento in cui passiamo a tecnologie 1000 volte più potenti (ad esempio, un nuovo microprocessore o un’architettura parallela) - nel caso del problema P1 possiamo arrivare a istanze di taglia 10 m (grafi di 10000 nodi), - nel caso del problema P2 arriviamo solo a istanze di taglia m+10 (grafi di 1010 nodi)!
13.5 LA CLASSE NP E I PROBLEMI INTRATTABILI Classe dei problemi risolubili in tempo polinomiale da una MT non deterministica. Chiaramente NP include la classe P ma anche molti altri problemi che sappiamo risolvere in tempo polinomiale solo con un modello di calcolo nondeterministico. Problema della “soddisfacibilità” (SAT) Siano: X=x1,...,xn: insieme di variabili booleane; T(X)=x1,...,xn,¬x1,...,¬xn: insieme di letterali; C = l1∨l2 ∨...∨ lni : ogni clausola è la disgiunzione di più letterali; F = C1, C2, ..., Cm: una formula in forma normale congiuntiva (CNF) è la congiunzione di più clausole.
Una assegnazione di valori di verità su X: f: X→true,false soddisfa xi se f(xi)=true e ~xi se f(xi)=false; una clausola C è soddisfatta da f se esiste un li∈C soddisfatto da f; una formula è soddisfatta se tutte le clausole sono soddisfatte. Istanza: formula F in CNF su un insieme X di variabili booleane. Predicato: esiste un'assegnazione f:X→true,false che soddisfa F? (Varianti 2-SAT, 3-SAT, k-SAT, NotAllEqualSAT, ecc.) F= p∨q∨¬r, ¬p∨q∨r, ¬q∨¬r, ¬p∨r F è soddisfatta da: p=true, q=false, r=true. F= p∨q, ¬p∨q, p∨¬q, ¬p∨¬q non è soddisfacibile.
Teorema SAT∈NP, Dim. Possiamo costruire una MTND M che risolve SAT in tempo polinomiale: facciamo generare ad M tutte le possibili assegnazioni su X; (queste sono in numero esponenziale ma le possiamo generare in modo nondeterministico in tempo polinomiale) associamo ad ogni assegnazione un cammino radice-foglia dell'albero di computazione di M ogni nodo dell'albero è associato alla scelta vero/falso per una variabile ogni cammino radice-foglia è di lunghezza polinomiale su ogni foglia verifichiamo in tempo polinomiale se l'assegnazione prodotta soddisfa F.
Problema della programmazione lineare 0,1 (PL0,1) Istanza: insieme di variabili Z=z1,...,zn con dominio in 0,1; insieme I di disequazioni lineari su Z. Predicato: esiste un'assegnazione di valori alle variabili di Z che verifica tutte le disequazioni di I? Teorema. PL0,1∈NP Dim. Realizziamo una macchina non deterministica che genera in tempo O(n) tutte i possibili vettori con valori in 0 o1 e poi, alla foglia di ogni ramo dell'albero, verifica se un vettore soddisfa i vincoli.
Problema "copertura con vertici" (vertex cover, VC). Istanza: grafo G=(V,E), intero k>0. Predicato: esiste un sottoinsieme U di V con |U|≤k tale che per ogni (u,v)∈E u∈U oppure v∈U? Teorema VC ∈ NP Dim. Generiamo con una MTND tutti i sottoinsiemi di V, uno per ogni cammino radice-foglia dell'albero di computazione. Per ogni sottoinsieme U di V verifichiamo in tempo polinomiale: (1) che U è un vertex cover; (2) che |U|≤k
Per moltissimi problemi di interesse pratico non sappiamo stabilire se essi siano risolubili in tempo polinomiale. Sappiamo però che sono risolubili in tempo polinomiale con MT non deterministiche. La mancanza di separazione tra NP e P non ci consente di stabilire se essi siano o non siano ‘trattabili’. Comunque in molti casi possiamo almeno stabilire tra diversi problemi proprietà di complessità ‘relativa’. Uno dei principali obiettivi della teoria della complessità è di consentire una classificazione dei problemi almeno in termini di complessità relativa anche quando la complessità in termini assoluti non è nota. Lo strumento per determinare relazioni di complessità tra problemi sono le riduzioni da un problema ad un altro.
13.6 RIDUCIBILITA’ E COMPLETEZZA Dato un problema di decisione P definiamo IP l’insieme delle istanze di P e rispettivamente YP e NP gli insiemi delle istanze positive e negative di P. Ad esempio se SAT è il problema della soddisfacibilità di formule del calcolo proposizionale e se: w1 = (x∨y) ∧ (¬x∨¬y) w2 = (x∨y) ∧ (¬x∨¬y) ∧ (x∨¬y) ∧ (x∨¬y) allora abbiamo che w1, w2 ∈ ISAT , w1 ∈ YSAT , w2 ∈ NSAT
Ridurre un problema P1 ad un problema P2 significa ricondurre il problema di risolvere P1 al problema della ricerca di un algoritmo per risolvere P2. Se riusciamo quindi a risolvere P2 riusciamo, come effetto collaterale, a risolvere anche P1 Def. Un problema di decisione P1 è Karp-riducibile a un problema di decisione P2
(P1 ≤ P2) se esiste un algoritmo R che trasforma ogni istanza x∈IP1 di P1 in una istanza y∈IP2 di P2 in modo tale che x∈YP1 (istanza positiva di P1) se e solo se y∈YP2 (istanza positiva di P2); R è una Karp-riduzione da P1 a P2
NOTA BENE 1. Se esiste R da P1 a P2 ed esiste un algoritmo A2 per P2, allora possiamo costruire un algoritmo A1 per P1:
1. data x∈IP1 applico R a x e ottengo y∈IP2 2. applico A2 a y, se A2 restituisce SI allora restituisco SI altrimenti restituisco NO
2. La complessità computazionale di A1, costruito con A2 ed R, dipende dalla complessità di A2 e dalla complessità di R.
3. Dall'esistenza della riduzione possiamo dedurre una relazione informale tra la complessità di P1 e quella di P2. Intuitivamente:
comp (P1) ≤ comp (P2) + comp (R) Se comp (R) ≤ comp (P2) abbiamo:
comp (P1) ≤ comp (P2) e quindi un upper bound per P2 è un upper bound per P1 e un lower bound per P1 è un lower bound per P2. In questo modo quando non possiamo stabilire la complessità "assoluta" di un problema possiamo stabilire relazioni di complessità relativa.
Def. P1 è polinomialmente Karp riducibile a P2 (P1 ≤p P2) se la riduzione R è un algoritmo con complessità polinomiale. NOTA BENE Sia P1 ≤p P2 • se so risolvere in tempo polinomiale P2 allora so risolvere in tempo polinomiale P1 • se posso dimostrare che non esiste un algoritmo polinomiale per P1 ne segue che non può esistere un algoritmo polinomiale per P2.
Teorema SAT ≤p PL0,1 Dim. Ogni istanza xSAT=<X,F> di SAT può essere ridotta ad una istanza xPL0,1=<Z,I> di PL0,1 Se li1,...,lik è la i-esima clausola di F definiamo la i-esima disequazione di I τi1+...+τik>0
τij=zj se lij=xj τij=1-zj se lij=~xj
Ogni assegnazione di valori di verità f:X→true,false soddisfa F se e solo se tutte le disequazioni di I sono verificate dalla assegnazione f':Z→0,1 tale che f'(zi)=1 se e solo se f(xi)=vero La riduzione è chiaramente calcolabile in tempo polinomiale.
Un problema appartenente ad una classe di complessità è completo nella classe se ogni problema della classe può essere ridotto ad esso. In particolare un problema appartenente ad NP è NP-completo se la sua struttura combinatoria è talmente ricca che ogni problema in NP può essere ridotto ad esso. Def. Un problema di decisione P1 è NP-completo se P1∈NP e per ogni P2∈NP P2≤p P1. La completezza è uno strumento per indagare le relazioni di inclusione fra classi di complessità. La usiamo per indagare il rapporto tra P ed NP ma potremmo usarla anche per altre classi di complessità.
Se riesco a dimostrare che un problema NP-completo P1 appartiene a P, cioè è risolubile in tempo polinomiale con un algoritmo deterministico, allora ogni altro problema di NP è risolubile in tempo polinomiale da un algoritmo deterministico. Infatti, sappiamo che se P2≤p P1 e P1 è risolubile in tempo polinomiale allora anche P2 lo è. Poiché nel caso di un problema NP-completo tutti i problemi in NP sono riducibili ad esso, se esso fosse risolubile in tempo polinomiale tutti i problemi in NP lo sarebbero.
NOTA BENE • Nessuno è mai riuscito a dare per un problema NP-completo un algoritmo deterministico polinomiale. • Nessuno è mai riuscito a dimostrare un lower bound non polinomiale (es. Ω(2n) ma anche Ω(nlog n)) per un problema di NP. • Non si sa se P=NP o se P≠NP (ma chiunque scommetterebbe che P≠NP).
PROBLEMA DA UN MILIONE DI DOLLARI !!! Nel 2000 il Clay Mathematics Institute ha offerto un premio di 1000000 US$ per la risoluzione di ciascuno dei sette ‘problemi del millennio’ tra i quali la relazione tra P ed NP.
NOTA BENE Per dimostrare che un problema P è NP-completo ci sono due possibili metodi:
1. dimostrare che ogni problema P1 in NP è riducibile a P, oppure 2. trovare un problema P2 già noto per essere NP-completo e dimostrare che P2≤pP; infatti, se P2≤pP e per ogni P1∈NP P1≤pP2 e P2≤pP, allora per ogni P1∈NP P1≤pP
Perchè il metodo 2 sia applicabile c'è bisogno di almeno un problema NP-completo di base.
Teorema (Cook) SAT è NP-completo. Dim. Abbiamo già dimostrato che SAT∈NP, ora dimostriamo che per ogni P∈NP P≤pSAT. Se P∈NP allora esiste una MTND che accetta L in tempo polinomiale; sia M una MTND che accetta ogni stringa x di L in tempo p(|x|) con p polinomio. Dati M ed x costruiamo una formula w in CNF tale che w è soddisfacibile se e solo se M accetta x, cioè se e solo se x∈L. Ipotesi semplificative: M con nastro semi-infinito; nella configurazione iniziale abbiamo x nelle prime celle; ogni configurazione utilizza esattamente |p(x)| celle; esiste uno stato qY di accettazione; la computazione ha esattamente |p(x)| passi.
w è congiunzione di quattro formule: w = wT ∧ wI ∧ wF ∧ wM wT specifica le proprietà generali delle MT wI specifica la configurazione iniziale wF specifica la configurazione finale wM specifica la funzione di transizione di M. Variabili di w: Q(t,k), Q(t,k) è true se e solo se M si trova nello stato qk all'istante t
(|Q(t,k)| = k p(|x|)) H(t,i), H(t,i) e' true se e solo se la testina di M si trova sulla cella i-esima del
nastro all'istante t (|H(t,i)| = p2(|x|)) C(t,i,h), C(t,i,h) è true se e solo se la cella i-esima del nastro contiene
all'istante t il simbolo σh (|C(t,i,h)| = p2(|x|))
wT è congiunzione di tre formule: w = wTS ∧ wTH ∧ wTC wTS specifica che ad ogni istante M si trova in uno stato wTS = ∧ (∨Q(t,k) ∧ ∧ (~Q(t,k1)∨~Q(t,k2))) t k k1≠k2 Analogamente wTH specifica che ad ogni istante la testina si deve trovare su una cella e wTC specifica che ogni cella del nastro deve contenere un carattere |wT| = O(p3(|x|))
Se x=σh0,σh1,....,σh(n-1), q0 è lo stato iniziale e σ0 = b wI = Q(0,0)∧H(0,0)∧ C(0,0,h0)∧C(0,1,h1)∧....∧C(0,n-1,hn-1)∧ C(0,n,0)∧C(0,n+1,0)∧....∧C(0,p(|x|),0) wF = Q(p(|x|),k) se qk è lo stato finale di accettazione
wM è la congiunzione di due formule
wM = wM1 ∧ wM2 wM1 specifica che per ogni t i contenuti del nastro agli istanti t e t+1 sono
gli stessi, eccetto, eventualmente, per ciò che riguarda la cella su cui la testina è posizionata all'istante t (regola di inerzia).
wM1 = ∧ ∧ (H(t,i) ∨ ∧ C(t,i,h)⇔C(t+1,i,h)) t i h
wM2 codifica la funzione di transizione di M ed è la congiunzione di p2(|x|) . |Q| . (|Σ|+1) formule Se δ(qi,σj)=(ql1,σh1,d), …, (qld,σhd,d)allora: wM2 = ∧ ∧(~H(t,i)∨~C(t,i,j)∨~Q(t,i)) ∨ (H(t+1,i+1) ∧ C(t,i,h1) ∧ Q(t,l1)) ∨ t i ... ∨(H(t+1,i+1) ∧ C(t,i,hd) ∧ Q(t,ld))
La formula w ha lunghezza O(p3(|x|)) e può essere costruita in tempo propozionale alla sua lunghezza. Le formule che costruiamo non sono in CNF, ma possono essere trasformate in CNF con un aumento lineare della lunghezza. w è soddisfacibile se e solo se M accetta la striga x in tempo P(|x|).
Teorema PL-0,1 è NP completo Dim. Come abbiamo già visto PL-0,1 appartiene a NP e inoltre SAT ≤p PL-0,1.
Teorema 3-SAT è NP completo Dim. SAT≤p 3-SAT e poiché SAT è NP-completo anche 3-SAT lo è. Clausole con meno di 3 letterali possono essere trasformate in clausole con 3 letterali: (p∨q) diventa (p∨q∨r) ∧ (p∨q∨¬r). Clausole con più di 3 letterali si trasformano in clausole con 3 letterali: (p∨q∨r∨s) diventa (p∨q∨t) ∧ (¬t∨r∨s).
Teorema VC è NP-completo. Dim. 3-SAT ≤p VC . Per ogni variabile colleghiamo due nodi con un arco. p ¬p Per ogni clausola con tre letterali (¬p ∨ q ∨ r), creiamo un grafo completo di 3 nodi
¬p
q r
Infine introduciamo archi che collegano nodi con uguale etichetta. Ad esempio: p ¬p
¬p
q r
Se la formula ha n variabili ed m clausole essa è soddisfacibile se e solo se il grafo può essere ricoperto con n+2m nodi. Quindi VC è NP-completo.