15 Kasım 2019 Cuma

Mantık sorularını çözmek için C

Aşağıdaki mantık sorusunu ve çözümlerini StackExchange'de gördüm. Soruyu cevaplayanlardan DanielV müstearlı kullanıcı çözümünde C++ programlama dilinde yazılmış bir kod ve o kodun çıktısını paylaşmış. Soruyu ve çözümünü buraya taşıyorum. Okunaklığı daha kolay olsun ve benim tarzıma uysun diye kodu biraz uzattım.

Aşağıda listelenen cevaplardan hangisi bu sorunun cevabıdır?
   $p.$ Aşağıdakilerin hepsi.
   $q.$ Aşağıdakilerin hiçbiri.
   $r.$ Yukarıdakilerin hepsi.
   $s.$ Yukarıdakilerden bir tanesi.
   $t.$ Yukarıdakilerin hiçbiri.
   $u.$ Yukarıdakilerin hiçbiri.

Seçenekleri yanlış okumadınız; $t$ ve $u$ seçeneklerinin lafızları aynı. Ancak bu aynılık sadece lafızlarda. Zira gerek sorudan gerekse seçeneklerden kolayca görüleceği üzere, her bir seçeneğin listedeki konumu doğruluğunu etkiliyor.

Problemi çözmek için bilgisayar programı yazmak istiyoruz. O zaman bu önermeleri bilgisayarın anlayacağı bir dilde ifade edelim. Örneğin $p$ önermesi kendinden sonra gelen tüm önermelerin doğru olduğunu söylüyor. Bunu mantıkta $p \iff q \land r \land s \land t \land u$ ile ifade edebiliriz. Benzer şekilde $r$ önermesi ise kendinden önce gelen tüm önermelerin doğru olmasını gerektiriyor: $r \iff p \land q$. Öte yandan $q,t$ ve $u$ önermeleri yadsımayla ilgili; kendilerinden önce veya sonra gelen tüm önermelerin yadsımalarının doğru olması gerekiyor. Örneğin $q \iff \neg r \land \neg s \land \neg t \land \neg u$. Muhtemelen mantık diline aktarması en zor olan önerme $s$ zira üç ayrı durumdan sadece birinin doğru olması yeterli ve bu üç ayrı durumu da tek tek yazmalıyız: $s \iff (p \land \neg q \land \neg r) \lor (\neg p \land q \land \neg r) \lor (\neg p \land \neg q \land r)$.

Bir doğruluk tablosu hazırladığımızda toplam $2^{6}=64$ farklı durum olduğu görülür. Bunun için aşağıdaki C programını yazıp tüm olası kombinasyonları deniyoruz. Program çıktısı bize sadece $t$ önermesinin doğru olabileceğini söylüyor.

#include <stdio.h>

int main(){
   int p, q, r, s, t, u, Tp, Tq, Tr, Ts, Tt, Tu;
   printf("p q r s t u\n");
   for(p=0;p<=1;p++){
      for(q=0;q<=1;q++){
         for(r=0;r<=1;r++){
            for(s=0;s<=1;s++){
               for(t=0;t<=1;t++){
                  for(u=0;u<=1;u++){
                     Tp = Tq = Tr = Ts = Tt = Tu = 0;
                     if(p == (q && r && s && t && u))
                        Tp++;
                     if(q == (!r && !s && !t && !u))
                        Tq++;
                     if(r == (p && q))
                        Tr++;
                     if(s == ((p && !q && !r) || (!p && q && !r) || (!p && !q && r)))
                        Ts++;
                     if(t == (!p && !q && !r && !s))
                        Tt++;
                     if(u == (!p && !q && !r && !s && !t))
                        Tu++;
                     if(Tp && Tq && Tr && Ts && Tt && Tu)
                        printf("%d %d %d %d %d %d\n",p,q,r,s,t,u);
                  }
               }
            }
         }
      }
   }
   return(0);
}

Program çalıştığında çıktısı aşağıdaki gibi oluyor:

p q r s t u
0 0 0 0 1 0