Image:Npc.jpg
:: Literál je buď proměnná nebo její negace. :: Pozitivní literál je každá proměnná . :: Negativní literál je každá negace proměnnej . :: Klauzule je disjunkcí literálů, která neobsahuje dva literály s touž proměnnou . :: Formule je v konjunktivně normální formě (KNF), pokud je konjunkcí klauzulí . :: Je-li formulí na n proměnných a , pak značí hodnotu v ohodnocení .
Splnitelnost formule v KNF (SAT)
Instance: Formule na proměnných v KNF
Otázka: ∃ ohodnocení, pro které je splněná?
Důkaz transformací KACHL ∝ SAT: pomocí proměnných , kde , pokud na pozici
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 1: \̲[̲i,j]
se nachází kachlík typu . Jednotlivé klauzule se vytvoří tak, aby zaručovaly, že na každé pozici je právě jeden kachlík, že kachlíky navazují horizontálně, vertikálně i na kraje stěny.{{theorem
| SAT je NP-úplný problém | NP-úplnost SAT
}}
Dk (KACHL → SAT - myšlenka) ::
:: pomocí proměnných , kde , pokud na pozici
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 1: \̲[̲i,j]
se nachází kachlík typu . Jednotlivé klauzule se vytvoří tak, aby zaručovaly, že na každé pozici je právě jeden kachlík, že kachlíky navazují horizontálně, vertikálně i na kraje stěny.Dk (KACHL → SAT) ::
To, že patří do NP, plyne z toho, že pokud dostaneme vektor , můžeme spočítat hodnotu φ(t) v polynomiálním čase. Certifikátem kladné odpovědi je tedy splňující ohodnocení. Toto ohodnocení je ve skutečnosti řešením úlohy splnitelnosti, v níž chceme splňující ohodnocení nalézt a ne jen zjistit, zda existuje, tato úloha tedy patří do NPF. -těžkost splnitelnosti ukážeme převodem z problému Kachlíkování. Uvažme instanci Kachlíkování danou množinou barev , přirozeným číslem , čtvercovou sítí velikosti , jejíž okraje jsou obarveny barvami z , a množinou typů kachlíků . Popíšeme, jak zkonstruovat formuli v KNF, která bude splnitelná právě tehdy, když tato instance má přípustné vykachlíkování. Formule bude využívat proměnných pro a . Konstrukcí formule zabezpečíme, že ve splňujícím ohodnocení bude hodnota odpovídat tomu, že na políčko
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j]
umístíme kachlík Tk. V konstrukci použijeme následující dvě množiny určující nekompatibilní dvojice kachlíků: :: = {(p, q) | spodní barva Tp se neshoduje s horní barvou Tq},:: = {(p, q) | pravá barva Tp se neshoduje s levou barvou Tq}. Množina V obsahuje dvojice typů, jež nemohou být umístěny nad sebe, tedy vertikálně. Množina H obsahuje dvojice typů, jež nemohou být umístěny vedle sebe, tedy horizontálně.
Podobné množiny si definujeme i pro barvy na okrajích, pro i = 1, . . . , s definujeme Ui, Bi, Li, Ri. :: = {k | horní barva Tk se shoduje s barvou horního okraje S v j-tém sloupci}
:: = {k | spodní barva Tk se shoduje s barvou spodního okraje S v j-tém sloupci} :: = {k | levá barva Tk se shoduje s barvou levého okraje S na j-tém řádku}
:: = {k | pravá barva Tk se shoduje s barvou pravého okraje S na j-tém řádku} Množina tedy obsahuje typy kachlíků, jež mohou být umístěny na políčko
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲1, i]
, množinaobsahuje typy kachlíků, jež mohou být umístěny na políčko
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲s, i]
, množina obsahuje typy kachlíků, jež mohou být umístěny na políčkoParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, 1]
, a konečně obsahuje typy kachlíků, ježmohou být umístěny na políčko
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, s]
. Konstrukci formule popíšeme po částech. Formule KNF je definovaná množinou svých klauzulí (jejich konjunkcí získáme danou formuli). Konjunkce několika KNF je KNF.Pro definujeme: . Tyto klauzule v budoucí CNF vynucují, že na každém políčku je aspoň 1 typ kachlíku.
Pro definujeme: . Tyto klauzule vynucují, že každému políčku
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j]
je přiřazen nejvýš jeden typ kachlíku.Pro definujeme: . Formule je tedy splněna, pokud políčku
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j]
přiřadíme právě jeden typ kachlíku.Pro definujeme: . Formule je splněna, pokud nad sebou umístěným políčkům
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j], S\[(i + …
nejsou přiřazeny nekompatibilní typy kachlíků.Pro definujeme: . Formule je splněna, pokud vedle sebe umístěným políčkům
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j], S\[i, (j…
nejsou přiřazeny nekompatibilní typy kachlíků.Definujeme:
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 30: …wedge_{j=1..s} \̲[̲ \vee_{k\in U_j…
. Formule je splněna, pokud je na každém políčku v prvním řádku kachlík s barvou shodnou s příslušným horním okrajem.Definujeme:
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 30: …wedge_{j=1..s} \̲[̲ \vee_{k\in B_j…
. Formule je splněna, pokud je na každém políčku v nejspodnějším řádku kachlík s barvou shodnou s příslušným spodním okrajem.Definujeme:
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 30: …wedge_{i=1..s} \̲[̲ \vee_{k\in L_i…
. Formule je splněna, pokud je na každém políčku v nejlevějším sloupci kachlík s barvou shodnou s příslušným levým okrajem.Definujeme:
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 30: …wedge_{i=1..s} \̲[̲ \vee_{k\in R_i…
. Formule je splněna, pokud je na každém políčku v nejlevějším sloupci kachlík s barvou shodnou s příslušným levým okrajem.
Formuli dostaneme jako konjunkci všech formulí výše: ::$φ = [\wedge_{i = 1..s; j = 1..s} \beta_{i, j}] \wedge [\wedge_{i = 1..(s - 1); j = 1..s} (\gamma_{i, j} \wedge \delta_{j,i})]
\wedge \epsilon_u \wedge \epsilon_b \wedge \epsilon_r \wedge \epsilon_lφφ|K|φφφSφ$.
Předpokládejme nejprve, že existuje přípustné vykachlíčkování S kachlíky z . Označme pomocí
ParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j]
index typu kachlíku, který je na i-tém řádku a j-tém sloupci. Definujme právě když je na políčkuParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j]
umístňen kachlík . Není těžké ověřit, že každá z podformulí je tímto ohodnocením splněna, a tedy že i celá formule je splněna. Předpokládejme na druhou stranu, že existuje splňující ohodnocení formule a pomocíParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: v\̲[̲i, j, k]
označme hodnotu přiřazenou proměnné ve splňujícím ohodnocení. Díky tomu, že ohodnocení splňuje i formuli , existuje pro každé právě jedno , pro kterou jeParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: v\̲[̲i, j, k] = 1
. Na poziciParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: S\̲[̲i, j]
tedy dáme kachlík toho typu , pro který jeParseError: KaTeX parse error: Undefined control sequence: \[ at position 2: v\̲[̲i, j, k] = 1
. Lze snadno ověřit, že podmínky zakódované do formulí zaručují, že tímto způsobem obdržíme přípustné vykachlíkování .