Zadání: Je zadaná množina barev B, čtvercová síť S (po obvodu obarvená barvami z B) a množina typů kachlíků K (každý typ je definován svojí horní, dolní, pravou a levou barvou).
Problém: Lze síť S vyplnit celou kachlíky z K (každý typ lze použít libovolně krát, nelze "otáčet") tak, aby A) barvy kachlíků přilehlé k obvodu sítě odpovídaly zadaným barvám na obvodu a B) aby každé dva sousední kachlíky měly v místě dotyku stejnou barvu?
Z definice NP víme, že problém R je v NP, když existuje polynomiální NTS
Barvy
Množinu možných barev položme
Síť a barvy po obvodu
Stěna, kterou budeme kachličkovat bude dostatečně dlouhá i vysoká (max. počet kroků algoritmu). Na jejím horním okraji bude zleva napsáno slovo x (pro každou hlavičku sloupce kachlíků jeden symbol x<sub>i</sub> ∈ x) a zbytek doplníme prázdnými znaky pásky (λ). Přesněji: hlavička prvního sloupce nebude x<sub>1</sub>, ale dvojice (q<sub>0</sub>, x<sub>1</sub>). Takže, na horním okraji stěny je zakódováno vstupní slovo x, které je zapsáno na pásce, a hlava NTS stojí na nejlevějším konci pásky, na symbolu x<sub>1</sub> a je v počátečním stavu q<sub>0</sub>.
Image:sit.png
Typy kachlíků
Nyní budeme dlaždičkovat koupelnu shora dolů, řádek po řádku. Každý řádek bude odpovídat jedné konfiguraci turingova stroje. V každém řádku tedy uvidíme aktuální vzhled pásky, dále uvidíme, nad kterým symbolem na pásce je hlava TS a v jakém stavu se nachází. Budeme tedy potřebovat několik druhů kachlíků. Jedna skupina kachlíků bude reprezentovat pozici na pásce, na které je aktuálně hlava ve stavu q, druhá skupina kachlíků bude reprezentovat pozice pásky, nad kterými hlava není. Je jasné, že když nad danou pozicí pásky není hlava, páska se v tom místě nemění a dvě po sobě jdoucí konfigurace stroje budou tedy mít v tomto místě pásky stejný symbol. Druhá skupina kachlíků tedy bude "kopírovací" - bude kopírovat symbol z předchozí konfigurace (z řádku nad ní) a nebude nic měnit:
Image:copys.png pro všechna s ∈ Σ (abeceda pásky)
První skupina kachlíků tedy bude reprezentovat pozici pásky se symbolem s, nad kterou je hlava ve stavu q a která přechází přechodovou funkcí δ do stavu q', zapíše na pozici symbol s' a posune se doprava, doleva, nebo zůstane. Vzhledem k tomu, že se jedná o NTS program, není přechodová funkce funkcí, ale zobrazením, kde
Image:qs0.png pro všechna q,s,q',s' taková, že
Image:qsr.png pro všechna q,s,q',s' taková, že
Image:qsl.png pro všechna q,s,q',s' taková, že
Kromě toho budeme potřebovat ještě další dva "kopírovací" kachlíky, které budou kompatibilní s dvěma předchozími a budou kopírovat symbol s shora a stav q zleva nebo zprava:
Image:sqr.png pro všechna q a všechna s
Image:sql.png pro všechna q a všechna s
Vše máme připraveno, můžeme kachličkovat. Čistě hypoteticky, pokud by problém zněl "Lze nahradit vstupní slovo x ∈ {0,1}* na pásce stejně dlouhou posloupností jedniček?", vystačili bychom si s jednoduchoučkým DETERMINISTICKÝM programem (zatím neřešíme úklid a koncový stav):
Image:TSab.png
Vzhledem k tomu, že program je deterministický, má pro stejný vstup jen jeden přímočarý výpočet a proto bude i vykachličkování přímočaré, protože se nebudeme muset nikde rozhodovat, kterou z možných cest jít. Na následujícím obrázku vidíme konfiguraci stroje po prvním kroku (spodní okraj prvního řádku kachliček):
Image:TSab1.png
Dále budeme pokračovat stejným způsobem:
Image:TSabb.png
Tím jsme původní slovo 00010 nahradili slovem 11111. Stroj by po sobě měl uklidit, a skončit v konfiguraci (q<sub>Y</sub>,λ),λ,λ,... To ovšem vyžaduje doplnění uvedeného programu o uklízecí část a nový koncový stav q<sub>Y</sub> (samozřejmě v návaznosti na změnu δ i nové kachličky). Máme-li koupelnu příliš vysokou, budeme potřebovat ještě poslední druh kachlíků:
Image:qyl.png
Kdybychom měli nedeterministický program, bude i vykachličkování nedeterministické a museli bychom správné vykachličkování nějakým způsobem uhodnout, nebo pomocí "brutal force" zkusit všechny možné kombinace a u každé testovat, zda jsou podmínky barevnosti sousedních stran splněné ( O(k<sup>2n</sup>n<sup>2</sup>) ). Tím jsme ukázali, že pomocí vykachličkování umíme najít přijímací výpočet libovolného NTS programu, a tudíž vyřešit libovolný NP problém, a tudíž