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