# Cook-Levin teoremi
SAT problemi bir NP-tam sınıfı problemidir.


## Giriş.
Teoremin ispatına geçmeden önce teoremin çıkış noktası üzerinde duralım. Polinom zamanda kararlaştırılan problem (P sınıfı problemleri) ile polinom zamanda doğrulanabilen problem (NP sınıfı problemleri) sınıflarının birbirine denk olup olmadığı güncel matematik ve teorik bilgisayar biliminin bir türlü çözemediği bir sorun olagelmiştir. Eğer bu sınıflar birbirine denk olduğu gösterilirse herhangi polinom zamanda doğrulanabilen bir problemin (NP sınıfı problemi) artık polinom zamanda kararlaştırılabiliyor olacağı kesin olarak söylenmiş olacaktır.
1970'lerde P ve NP sınıflarının arasındaki ilişkiye Stephen Cook ve Leonid Levin adındaki iki bilim adamı farklı bir açıdan yaklaşmışlardır; bazı NP sınıfı problemlerinin karmaşıklıklarının tek başlarına tüm NP sınıfının karmaşıklığına eşit olduğunu fark etmişler. Eğer bu tip problemlerin polinom zamanda bir çözümü bulunursa NP sınıfındaki tüm problemler polinom zamanda çözülebilir. Bu tip problemlere ileride değineceğiz ve bun tip problemlere NP-tam sınıfı problemleri diyeceğiz. Dolayısıyla Cook-Levin yaklaşımının bir sonucu olarak P sınıfıyla NP sınıfının eşitliğini iddia eden biri NP-tam bir problemi polinom zamanda çözmesi iddiasını ispatlamak için yeterli olacaktır.


## SAT Problemi.
SAT (Doğrulanabilirlik) probleminin ne olduğundan bahsedelim. SAT problemi verilen bir boolean ifadenin sonucunun doğru olup olmayacağıyla problemidir. Yani boolean ifadeyi doğru kılacak, boolean ifadenin değişkenlerinin bir “doğru, yanlış” kombinasyonunun oluşturup oluşturmayacağıyla ilgilenir. Dolayısıyla SAT problemi aşağıdaki gibi ifade edilebilir:
Örneğin ∅=(x̅y)(xz) gibi herhangi bir boolean ifadenin sonucunun doğru olmasını inceleyen probleme SAT problemi denir. Bu örnekte x = doğru, y = yanlış, z = doğru için problem doğrulanabilirdir.


## NP-Tam Sınıfı.
Bir B dili NP-tam ise şu iki şartı sağlamalıdır:
  - B dili NP sınıfındadır.
  - NP sınıfındaki her dil B diline polinom zamanda indirgenebilir.
Burada yeni bir kavramla karşılaşıyoruz; “polinom zamanda indirgemek”. Bunu fazla derine inmeden şöyle özetleyebiliriz; eğer bir problemin çözümünü bilmiyorsak ya da çözümü bulmakta çok zorlanıyorsak asıl problemimizi çözmeye yardımcı olacak yeni bir probleme indirgeriz ve çözüme yeni indirgenmiş problem aracılığıyla ulaşırız. Eğer bu indirgememiz polinom zamanda gerçekleştirilirse buna da “polinom zamanda indirgemek” adını veririz. Buna şöyle bir örnek verebiliriz: Bilmediğiniz bir yere gitmek istediğinizi farz edelim ve bu problemin sizin için zor bir problem olduğunu düşünelim. Bu durumda gideceğiniz yere ulaşmak için bir yardımcıya ihtiyacınız olacaktır. Bu yardımcılar taksiye binmek, harita elde etmek ya da bilen birine sormak bunlar arasında sayılabilir. Böylelikle bizim için zor olan problemimiz taksi ya da harita bulmak kadar basit bir probleme indirgenmiş oldu. Kısaca buna da değindikten sonra artık teoremimize dönelim.


## İspat.
SAT probleminin NP-tam sınıfına ait bir problem olduğunu göstermek için öncelikle SAT dilinin NP sınıfında olduğunu göstermemiz lazım.
SAT probleminin NP sınıfında olduğunu göstermenin iki farklı yolu vardır:
  - SAT problemini polinom zamanda doğrulayan bir Turing Makinesi(TM) tasarlamalıyız.
  - Ya da SAT problemini polinom zamanda kararlaştıran bir deterministik olmayan Turing Makinesi (NTM) tasarlamalıyız.
Biz burada 2. yolla bunu ispatlayalım: Deterministik olmayan N Turing Makinesi, SAT dilini polinom zamanda aşağıdaki gibi kararlaştırsın:
N: “ ∅ ’nin Boolean ifade, x1, x2, x3..., xk’nin de bu ifadenin bir değişkeni olsun ve makine girdi olarak < ∅, x1, x2, x3..., xk > katarını alsın.
  - Deterministik olmayacak şekilde boolean ifadedeki değişkenlere “doğru ve yanlış” değerlerini ata.
  - Elde edilen kombinasyonla boolean formülün doğru cevap üretip üretmediğini kontrol et. Eğer cevap doğruysa kabul ver. Eğer cevap yanlışsa ve tüm kombinasyonlar denenmişse ret ver, eğer cevap yanlış ve tüm kombinasyonlar denenememişse 1'e dön.
Şimdi sıra NP'deki her dilin SAT diline polinom zamanda indirgemekte. A dilini nk zamanda kararlaştıran determinist olmayan bir N Turing Makinesi düşünelim. Aşağıda anlatacağım yöntem aracılığıyla N makinesini SAT diline indirgeyeceğiz.
Bu tabloda her bir satır N makinesinin konfigürasyonunu ifade ediyor. Kolaylık olsun diye her konfigürasyonun "#" ile başlayıp "#" ile bittiğini farz edelim. Her konfigürasyondan bir sonrakine N makinesinin geçiş fonksiyonu aracılığıyla ulaşılmaktadır yani konfigürasyonlar arasındaki geçişlerde N makinesinin kurallarına uyulmak zorundadır. Tüm satırlar bu kurallara uygun olarak doldurulduktan sonra tablo N makinesi için herhangi bir kabul durumu içeriyorsa A tablosu kabul verir yoksa ret verir. Böylelikle A dili bu tablo aracılığıyla simüle edilebilir. Böylelikle N makinesinin w'yı kabul etmesi artık tablonun qkabul durumunu içerip içermemesine indirgenmiş oldu. Şimdi sıra elde ettiğimiz tablodan SAT problemine geçmek için bir boolean formül (∅) elde etmeye geldi. F formülüne geçmeden önce kullanacağımız birkaç önemli terimi ifade edelim:
Q: N makinesinin durumları kümesi
Γ: N makinesinin alfabesi
C = Q ∪ Γ ∪ {#}: Tablodaki değişkenler kümesixi, j,s: ∅ formülünün değişkeni olup tablonun [i, j] gözünde s değeri varsa doğru yoksa yanlış değerini alır.
[ ⋁_s∈Cx_i,j,s=x_i,j,s_1x_i,j,s_2…x_i,j,s_l; C={s_1,s_2,…,s_l} ]
Şimdi F ifadesinin ne gibi koşulları sağlaması gerektiğine bakalım.
  - Tablonun her hücresinde tek bir boolean değişken olmalıdır. Bunu göstermek için şu iki şart sağlanmalıdır.
a. Tablonun her hücresinde en az bir değişken olmalıdır.
b. Tablonun her hücresinde en fazla bir adet değişken olmalıdır.
Dolayısıyla ∅_hücre=⋀_1 ≤i, j ≤n^k [(⋁_s ∈C x_i,j,s) (⋀_s,t ∈C s t(x_i,j,s x_i,j,t))]
2. Tablonun başlangıç konfigürasyonu N makinesinin başlangıç konfigürasyonu olmalıdır.
∅_başlangıç=x_1,1,# x_1,2,q_0 x_1,3,w_1 x_1,4,w_2 …x_1,n^k,# doğrulanmalıdır.
3. Tabloda en az bir tane N makinesine ait kabul durumu (q ) bulunmalıdır.
Dolayısıyla ∅_kabul =⋁_1≤i,j≤n^kχ_i,j,q_kabul doğrulanmalıdır.
4. Tablodaki konfigürasyonlar arasındaki geçiş N makinesinin kurallarına uygun olmalıdır.
∅_hareket=⋀_1 lt; i ≤n^k, 1 lt; j lt; n^k ((i,j) penceresi geçerli penceredir) doğrulanmalıdır.
Bir pencerenin geçerli olması ne demek onu inceleyelim. Tablonun 3×2’lik parçasına pencere diyoruz ve bu pencere geçiş fonksiyonuna uygunsa buna geçerli pencere diyoruz.
Dolayısıyla problemimiz ∅ = ∅hücre ∧ ∅ başlangıç ∧ ∅ kabul ∧ ∅ hareket probleminin doğrulanmasına indirgendi. Diğer bir deyişle A dilini SAT diline indirgemiş olduk.
İndirgemeyi yaptık şimdi bunun polinom zamanda olduğunu ispatlamaya geldi sıra. İndirgemenin karmaşıklığını göstermek için ∅ formülünün boyutu göstermek yeterli olacaktır. Tablonun boyutu nk ×nk olup n2k hücreye sahiptir ve bu hücrelerde l farklı değişken bulunabilir. (l∈C ). l değeri N makinesine verilen w katarından bağımsız olduğu için ∅ formülündeki değişken sayısı O(n2k) olacaktır. Dolayısıyla bu indirimin polinom zamanda yapılmış olduğu anlamına geliyor. Böylelikle SAT probleminin NP-tam olduğunu göstermiş olduk.


## Sonuç.
Şimdi bunun bize ne katacağını ifade edelim:
Farz edelim ki SAT problemine polinom zaman da bir çözüm bulunmuş olsun ("SAT ∈ P"). Bu bize şunu ifade eder SAT problemi hem NP sınıfının içinde (Cook-Levin teoreminden) hem de P sınıfının (varsayımdan) içinde ve diğer yandan her NP dili SAT problemine polinom zamanda indirgenebiliyor (Cook-Levin teoreminden) dolayısıyla bu NP sınıfı ile P sınıfın denk olduğu anlamına geliyor. Aslında Cook-Levin ikilisinin bu teorem ile amaçladıkları şey de tam olarak buydu yani P ile NP sınıfının eşitliğini iddia eden biri NP-tam sınıfından bir probleme polinom zamanda çözüm bulması iddiasını kanıtlamak için yeterli olacaktır.