Processing math: 100%

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 pqrstu ile ifade edebiliriz. Benzer şekilde r önermesi ise kendinden önce gelen tüm önermelerin doğru olmasını gerektiriyor: rpq. Ö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¬r¬s¬t¬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(p¬q¬r)(¬pq¬r)(¬p¬qr).

Bir doğruluk tablosu hazırladığımızda toplam 26=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