SAT-ongelman rajoitetut muodot olemme juuri osoittaneet että SAT on NP-täydellinen perusidea on nyt osoittaa joukolle kiinnostavia ongelmia A NP että SAT p m A, jolloin kyseiset A myös ovat NP-täydellisiä tässä A = IS, VC, HC, TSP,... tekninen ongelma: hankalaa käsitellä mielivaltaisia propositiologiikan kaavoja ratkaisu: määritellään luokka syntaktisesti yksinkertaisia kaavoja, jotka kuitenkin ovat riittävän vaikeita että SAT on NP-täydellinen myös näihin yksinkertaisiin kaavoihin rajoitettuna tarkemmin: määritellään SAT-ongelman erikoistapaus CSAT, ja edelleen tämän erikoistapaus 3SAT, joille SAT p m CSAT p m 3SAT p m SAT ja siis SAT p m A jos ja vain jos 3SAT p m A 208
Propositiologiikan kaavojen luokittelua (Jatkossa kaava tarkoittaa propositiologiikan kaavaa.) Literaali on muuttuja tai muuttujan negaatio; esim. x 7 tai x 3 Klausuuli (engl. clause) on literaalien disjunktio; esim. x 3 x 2 x 4 tai x 1 kaava on konjunktiivisessa normaalimuodossa (conjunctive normal form, CNF) jos se on klausuulien konjunktio; esim. (x 3 x 2 x 4 ) (x 7 x 3 ) x 1 CNF-kaava on k-konjunktiivisessa normaalimuodossa (k-cnf) jos jokaisessa klausuulissa on tasan k literaalia; esim. (x 3 x 2 ) (x 7 x 3 ) (x 1 x 4 ) on 2-CNF-kaava Määritellään nyt SAT-ongelman erikoistapaukset CSAT ja ksat, k = 1, 2, 3,...: CSAT = { φ φ on toteutuva CNF-kaava } ksat = { φ φ on toteutuva k-cnf-kaava } 209
Kuten pian nähdään, jokaiselle kaavalle φ(x 1,..., x n ) on olemassa CNF-kaava ψ(x 1,..., x n ) jolle φ(v 1,..., v n ) = ψ(v 1,..., v n ) kaikilla (v 1,..., v n ) { 0, 1 } n. Todetaan ensin että mikä tahansa kaava voidaan muuntaa muotoon, jossa negaatiot kohdistuvat suoraan muuttujiin, ts. ei esiinny muotoa (A B) tai (A B) olevia osakaavoja. Tämä perustuu de Morganin lakeihin ja kaksinkertaisen negaation lakiin (A B) (A) (B) (A B) (A) (B) A A. 210
Esimerkki negaatioiden painamisesta literaaleihin Lähtökohtana kaava Saadaan (x 2 ( (x 1 x 3 ) (x 3 x 4 ))). (x 2 ( (x 1 x 3 ) (x 3 x 4 ))) x 2 ( (x 1 x 3 ) (x 3 x 4 )) x 2 (x 1 x 3 ) (x 3 x 4 ) x 2 (x 1 x 3 ) ( x 3 x 4 ). 211
jotta saataisiin CNF-kaavoja pitää lisäksi painaa disjunktiot konjunktioiden sisäpuolelle tämä onnistuu osittelulakien avulla: A (B C) (A B) (A C) A (B C) (A B) (A C) Ongelma: kaavan koko voi kasvaa eksponentiaalisesti; esim. kaavan (x 1 x 2 ) (x 3 x 4 ) (x 5 x 6 ) CNF-esitys on (x 1 x 3 x 5 ) (x 1 x 3 x 6 ) (x 1 x 4 x 5 ) (x 1 x 4 x 6 ) (x 2 x 3 x 5 ) (x 2 x 3 x 6 ) (x 2 x 4 x 5 ) (x 2 x 4 x 6 ). Ratkaisu: muodostetaan ei-cnf-kaavasta φ(x 1,..., x n ) CNF-kaava ψ(x 1,..., x n, y 1,..., y m ) missä y 1,..., y m ovat uusia muuttujia ja φ(v 1,..., v n ) = 1 jos ja vain jos ψ(v 1,..., v n, v 1,..., v m ) jollain (v 1,..., v m) { 0, 1 } m 212
Seuraava rekursiivinen funktio CNF(φ) palauttaa CNF-kaavan ψ joka on toteutuva joss φ on, olettaen että kaavassa φ negaatiot kohdistuvat suoraan muuttujiin. CNF(φ): kolme tapausta kaavan φ muodon mukaan. 1. φ on literaali: palauta φ sellaisenaan. 2. φ = φ 1 φ 2 : laske ψ 1 = CNF(φ 1 ) ja ψ 2 = CNF(φ 2 ); palauta ψ = ψ 1 ψ 2. 3. φ = φ 1 φ 2 : laske ψ 1 = CNF(φ 1 ) ja ψ 2 = CNF(φ 2 ); olkoon ψ 1 = g 1 g 2... g p ψ 2 = h 1 h 2... h q missä g i ja h j ovat klausuuleja. Ota käyttöön uusi muuttujasymboli y ja palauta kaava (y g 1 )... (y g p ) ( y h 1 )... ( y h q ). 213
Esimerkki Lasketaan CNF(φ) kun φ(x 1, x 2, x 3, x 4, x 5, x 6 ) = ((x 1 x 2 ) (x 3 x 4 )) (x 5 x 6 ). Yksinkertaisyyden vuoksi tehdään laskenta alhaalta ylöspäin. Selvästi CNF(x 1 x 2 ) = x 1 x 2 ja CNF(x 3 x 4 ) = x 3 x 4. Siis CNF((x 1 x 2 ) (x 3 x 4 )) = (y x 1 ) (y x 2 ) ( y x 3 ) ( y x 4 ) missä y on uusi muuttuja. Edelleen CNF(x 5 x 6 ) = x 5 x 6 joten ottamalla käyttöön taas uusi muuttuja z saadaan CNF(φ) = ψ missä ψ(x 1, x 2, x 3, x 4, x 5, x 6, y, z) = (z y x 1 ) (z y x 2 ) (z y x 3 ) (z y x 4 ) ( z x 5 ) ( z x 6 ). Nyt esim. φ(0, 0, 1, 1, 0, 0) = 1, mitä vastaten ψ(0, 0, 1, 1, 0, 0, y, z) = 1 kun valitaan y = 1 ja z = 0. 214
Lause: Olkoon φ(x 1,..., x n ) kaava jossa negaatiot kohdistuvat suoraan muuttujiin, ja CNF(φ(x 1,..., x n )) = ψ(x 1,..., x n, y 1,..., y m ). Nyt ψ on CNF-kaava, ja φ(v 1,..., v n ) = 1 jos ja vain jos ψ(x 1,..., x n, v 1,..., v m ) = 1 joillain v i. Todistus: Induktio kaavan φ sisältämien disjunktioiden ja konjunktioiden lukumäärän suhteen. Perustapaus: ei konjunktioita eikä disjunktioita. Siis φ on literaali x i tai x j jotka sellaisenaan ovat CNF-kaavoja. Väite selvästi pätee. Induktioaskel: Oletetaan, että väite pätee kun konjunktioita ja disjunktioita on kork. n; olkoon niitä nyt n + 1. On ilmeistä että palautettavat kaavat ovat CNF-kaavoja; mielenkiintoinen puoli on niiden toteutuvuus. 215
Tapaus 1: φ(x 1,..., x n ) = φ 1 (x 1,..., x n ) φ 2 (x 1,..., x n ). Merk. CNF(φ 1 (x 1,..., x n )) = ψ 1 (x 1,..., x n, y 1,..., y r ) ja CNF(φ 2 (x 1,..., x n )) = ψ 2 (x 1,..., x n, y 1,..., y s ). Siis CNF(φ) = ψ missä ψ(x 1,..., x n, y 1,..., y r, y 1,..., y s ) = ψ 1 (x 1,..., x n, y 1,..., y r ) ψ 2(x 1,..., x n, y 1,..., y s ). Konstruktiosta seuraa että muuttujajoukot { y 1,..., y r erilliset, joten } ja { y 1,..., y s } ovat φ(v 1,..., v n ) = 1 φ 1 (v 1,..., v n ) = 1 ja φ 2 (v 1,..., v n ) = 1 ψ 1 (v 1,..., v n, y 1,..., y r ) = 1 joillain y i ja ψ 2 (v 1,..., v n, y 1,..., y r ) = 1 joillain y i (ind.ol.) ψ(v 1,..., v n, y 1,..., y r, y 1,..., y s ) = 1 joillain y i, y i (koska muuttujajoukot erilliset). 216
Tapaus 2: φ = φ 1 φ 2 (jätetään nyt selvyyden vuoksi muuttujat merkitsemättä; ne voidaan käsitellä kuten tapauksessa 1). Merk. Siis CNF(φ) = ψ missä CNF(φ 1 ) = g 1 g 2... g p CNF(φ 2 ) = h 1 h 2... h q ψ(y) = (y g 1 )... (y g p ) ( y h 1 )... ( y h q ). Jos φ = 1 niin φ 1 = 1 tai φ 2 = 1. Jos φ 1 = 1, niin g i = 1 kaikilla i, joten ψ(0) = 1. Vastaavasti jos φ 2 = 1, niin ψ(1) = 1. Kummassakin tapauksessa ψ(y) on siis toteutuva. Kääntäen jos ψ(y) on toteutuva, niin ψ(0) = 1 tai ψ(1) = 1, jolloin φ 1 = 1 tai φ 2 = 1. 217
Olkoon f seuraava funktio, joka saa argumenttina mielivaltaisen kaavan φ ja palauttaa CNF-kaavan ψ: 1. Muunna de Morganin ja kaksinkertaisen negaation lakeja käyttäen φ yhtäpitäväksi kaavaksi φ jossa negaatiot kohdistuvat suoraan muuttujiin. 2. Palauta ψ = CNF( φ). Vaihe 1 toimii selvästi polynomisessa ajassa. Myös CNF( φ) voidaan laskea polynomisessa ajassa (ks. alla) joten f voidaan laskea polynomisessa ajassa. Olemme myös nähneet että φ on toteutuva jos ja vain jos ψ on, eli φ SAT joss f(φ) CSAT. Siis SAT p m CSAT. Koska SAT on NP-täydellinen ja CSAT NP, seuraa erityisesti Korollaari CSAT on NP-täydellinen. 218
Funktion CNF aikavaativuusanalyysi Olkoon T (n) kutsun CNF( φ) aikavaativuus kun kaavassa φ on n konjunktioja disjunktiosymbolia. Huomaa että kaavan kokonaispituus on Θ(n). Selvästi Tapauksessa n > 1 voidaan kirjoittaa T (n) a jollain vakiolla a. T (n) T (i) + T (n i 1) + bn missä T (i) ja T (n i 1) ovat rekursiivisten kutsujen CNF( φ 1 ) ja CNF( φ 2 ) suoritusajat ja bn kaikkeen muuhun kuluva aika (b vakio). (Huomaa että yhtä lukuunottamatta kaikki kaavan φ symbolit menevät joko kaavoihin φ 1 ja φ 2.) 219