C# ve Matematik 1 – Önermeler

Yeni iş kurmanın heyacanı nedeniyle blogu çok ama çok boşladım. Arayı kapatmak için bir yazı dizisi hazırlamaya karar verdim. Bu seride Matematik konularına bir C# programcısı olarak tekrar bakacağız.

İlk konumuz "önermeler". Önerme (proposition) bir yargı bildiren cümlelere denir. Belirtiği yargının doğru ya da yanlış olması onu önerme olmaktan çıkartmaz ama hem doğru hem de yanlış olamaz (o durumlarda bulanık mantık konusuna bakmak gerekiyor).

Örneğin aşağıdaki ifadelerin hepsi birer önermedir.

Benim adım Cihan'dır.
Kediler yeşildir.
4 + 4 = 9

Aşağıdakiler ise önerme değildir.

Kedi
3
Halıya basma!
Yemek çok lezzetli.

Bunlar önerme değildir çünkü x in y olduğuna dair bir hükümleri yoktur. Son cümle önerme gibi dursa da öznel olduğu için önerme olarak kabul edemeyiz.

Bir şey önerme olduktan sonra amacımız bu önermeler bir biriyle etkileşime geçtiğinde yeni önermenin doğru mu yanlış mı olacağıdır. "Cihan 35 yaşındadır ve kediler uçar" önermesi bileşiktir. Bu önermenin sonucu kendisini oluşturan önermelerin doğruluğuna bağlıdır. "ve" bağlacı kullanıldığı için her iki önerme de doğruysa bu önerme de doğru olacaktır.

Değil

Bir ifadeyi ters çeviren operatöre "değil" diyoruz. Matematik gösterimi \lnot{p} olurken C# da ! ve not operatörlerini kullanıyoruz.

int a = 5;
bool sonuc = !(a > 10);

burada parantezin içerisi yanlış iken değilini aldığımız için sonuç doğru olacaktır.

Aynı ifade şu şekilde de yazılabilir.

int a = 5;
bool sonuc = a is not > 10;

İse

İki önermeden biri doğru olduğunda diğerinin doğru olması bekleniyorsa "ise" bağlacı kullanılır.Bu yalnızca tek yönlü bir gereklilik katacaktır, yani gerekli olan önerme yanlış ise bileşik ifade doğru olacaktır. Konuşma diline çevirmek gerekirse, Canım her sıkıldığında oyun oynarım. Cümlesini ele alalım, bu kişinin canı sıkkın ise ve oyun oynuyor ise bu cümle doğrudur. Canı sıkkın olduğu halde oynamıyorsa demek ki ifade yanlıştır. Ama canı sıkkın olmadığı zaman şahıs ister oynar ister oynamaz, önerme ile çelişmez ve doğrudur.
Matematikte p ve q önerme olduklarında ise bağlacı p \implies q Bunu p ise q diye okuyoruz. Yani bileşik önermenin sonucu p nin doğru, q nun yanlış olduğu durumda yanlış diğer tüm durumlarda doğrudur.

Örneğin,
x ve y sayıları olsun,
x çift ise y çiftir demiş olalım.

X = 2 ve Y = 1 olmuş olsun, bu durumda x çift olduğu halde y tek olmuştur, önerme yanlıştır.
X = 2 ve Y = 2 olmuş olsun, bu durumda x çift olduğu halde y çifr olmuştur, önerme doğrudur.

X = 1 ve Y = 1 olsun, bu durumda x çift olmadığı için y nin çift olma zorunluluğu yoktur. Önerme doğrudur.
X = 1 ve Y = 2 olsun, bu durumda x çift olmadığı için y nin çift olma zorunluluğu yoktur. Önerme doğrudur.

Bunu C# ile yazmaya çalışırsak.

bool p = true;
bool q = false;
bool sonuc = true;
if (p)
{
    sonuc = q;
}

Ya da bunu kısaltıp aşağıdaki gibi yazabiliriz.

bool p = false;
bool q = false;
var sonuc = !p || q;

Ancak ve Ancak

Diğer bir bağlaç ise ancak ve ancak bağlacı, bir çok dilde bu "iff" (if only if) olarak geçiyor. p ve q eş değerli olduklarında doğru, diğer durumlarda yanlıştır. Bunun için matematikte genellikle p \iff q kullanılıyorken C# da p == q sembolünü kullanıyoruz.

Örneğin,
x ve y sayıları olsun,
y ancak ve ancak x çift olduğunda çift olur demiş olalım.

X = 2 ve Y = 1 olmuş olsun, bu durumda x çift olduğu halde y tek olmuştur, önerme yanlıştır.
X = 2 ve Y = 2 olmuş olsun, bu durumda x çift olduğu halde y çift olmuştur, önerme doğrudur.

X = 1 ve Y = 1 olsun, bu durumda x çift olmadığı için y ancak tek olabilir. Önerme doğrudur.
X = 1 ve Y = 2 olsun, bu durumda x çift olmadığı için y ancak tek olabilir, çift olamaz. Önerme yanlıştır.

bool p = true;
bool q = false;
bool sonuc = false;
if (p == q)
{
    sonuc = true;
}
else
{
   sonuc = false;
}
bool p = true;
bool q = false;
bool sonuc = p == q;

Ve bağlacı

Kedilerin 4 bacağı vardır ve köpeklerin 6 kuyruğu vardır.

Bu önerme iki önermenin birleşmesinden oluşmuştur ve geçerlidir. Bu tip ifadelere "bileşik önerme" denilmektedir. Fakat, doğruluk değeri "false" olacaktır. Çünkü önermelerden ilkinin doğruluğu "true" ikincisinin ise "false" dur. Burada "ve" bağlacı kullanıldığı için ikisinin aynı anda doğru olması beklenmektedir.

int a = 5;
int b = 6;

if (a == 5 && b < 4)
{
    Console.WriteLine("önerme doğru");
}

"Ve" bağlacının C# dilindeki karşılıkları "&, && ve and" sözcükleridir. Her birinin özelleşmiş kullanımları vardır.

Tek başına & operatörünün işi iki değerin ikilik sistemdeki sayısal karşılığının her bir bitinin "ve" işlemine tabii tutulmasıdır. Önermeler ile kullanıldığında her iki önermenin de doğru olup olmadığını hesaplayacaktır.

void Main()
{
    if (A() == 8 & B() < 4)
    {
        Console.WriteLine("önerme doğru");
    }
    else
    {
        Console.WriteLine("önerme yanlış");
    }
}

int A()
{
    Console.WriteLine("A çalıştı");
    return 5;
}
int B()
{
    Console.WriteLine("B çalıştı");
    return 6;
}

Yukarıdaki kod bloğunda önermelerimiz olan koşulumuza dikkatli bakın if (A() == 8 & B() < 4) burada soldaki önerme yanlış olduğu için sağ tarafın aslında hiç çalıştırılmasına gerek yoktur. Fakat tek başına & kullandığımız için B metodu çalıştırılır.

Aynı kodu if (A() == 8 && B() < 4) olarak güncellediğinizde B metodunun işletilmediğini göreceksiniz. Bu hem daha hızlı çalışan uygulamalar yazmamızı hem de daha kısa kod yazmamızı sağlayan bir özelliktir.

Bazılarınız için C# da "and" kelimesi olması yabancı gelebilir. Bu C# 9 ile gelen bir özellik. Şayet önermelerimizin özneleri aynı ise bu durumda önermeleri "is" kelimesi ile kurabilir hale geliyoruz.

void Main()
{
    var a = 6;
    if (a is > 4 and < 7)
    {
        Console.WriteLine("önerme doğru");
    }
    else
    {
        Console.WriteLine("önerme yanlış");
    }
}

Yukarıdaki önerme "a'nın değeri 4 den büyük ve 7 den küçüktür" anlamına gelmektedir. Tekrar hatırlatayım bu özellik C# 9.0 ve üzeri için mevcut.

Ve dışındaki diğer bağlaçları bu kadar uzun uzun tekrar yazmayacağım bir tablo yeterli olacaktır.

Bağlaç Matematik Sembolü C# dengi Doğruluk şartı
ve \land &, &&, and iki önerme de doğru olmalı
veya \lor |, ||, or iki önermeden herhangi biri doğru olmalı
özel veya \veebar ^ iki önerme bir birinden farklı olmalı (denk olmamalı)

Bir önermenin doğrulunu ters çevirmek için değil (not) operatörünü kullanabiliriz.

Önermenin değilini almak için matematikde \lnot{a} veya a' kullanabiliriz. (~ ve ! kullanımlarını da görebilirsiniz). C# da ise "! ve not" operatörlerini kullanabiliriz.

Eş güçlülük özelliği

if(a == 5 && a == 5)

ifadesi
if(a == 5)

ile aynı doğruluğa sahiptir. Veya işlemi de bu özelliği sağlar. Bunlara eşit değil "eş değerli","denk" önermeler diyoruz p \equiv q.

Yer değişim özelliği

if(a == 5 && b == 6)

ifadesi
if(b == 6 && a == 5)

ile çoğu zaman aynı doğruluğa sahiptir. Veya işlemi de bu özelliği sağlar.

Burada çoğu zaman dememin sebebi matematiksel değil tamamen C#'a özel bir durumdan geliyor, yukarıda da bahsettiğim && ile & operatörleri arasındaki farktan kaynaklanıyor. Sebebi için şu örneğe bakın:

string str = null;
if (str != null && str.Length > 2)
{
    //...
}

Buradaki koşul için yer değişim yaparsak kod aşağıdaki hale gelecektir,

string str = null;
if (str.Length > 2 && str != null )
{
    //...
}

ve bu kod işini doğru yapmayacaktır. Çünkü ilk örnekte && operatörü ilk koşul sağlanmadığı için ikincisini çalıştırmayacak dolasıyla null olan bir objenin özelliğine erişim hatası gerçekleşmeyecektir. Dolasıyla yer değişim özelliğini C# açısından her zaman kullanmamız mümkün değildir.

Birleşme özelliği

if((a == 5 && b == 6) && c == 9)
ifadesi

if(a == 5 && (b == 6 && c == 9))
ile aynı doğruluğa sahiptir. Veya işlemi de bu özelliği sağlar.

Dağılma özelliği

Şu iki ifade denktir.
if(a == 5 && (b == 6 || c == 4))
if((a == 5 && b == 6) || (a == 5 && c == 4))

a,b,c birer boolean değişken gibi düşünürseniz şu şekilde daha basit yazabiliriz:
if(a && (b || c))
if((a && b) || (a && c))

benzer şekilde
if(a || (b && c))
if((a || b) && (a || c))

De Morgan Kuralları

if(!(a || b)) ifadesi if(!a && !b) olarak yazılabilir. Aynı şekilde ve operatörü de veya ya dönüşecektir.

Hepdoğru ve Hepyanlış

Önermeler birleştiğinde sonuç her zaman doğru (hepdoğru,eşsöz, totoloji) veya her zaman yanlış (hepyanlış, çelişki) olabilir.

p \lor \lnot{p} i ele alalım burada veya bağlacı iki önermeden herhangi birisi doğru olduğunda "doğru" sonucunu verecektir. Bu durumda p nin değeri doğru da olsa yanlış da olsa sonuç doğru çıkacaktır. Burada ve bağlacını kullandığımızda da sonuç hep yanlış olacaktır.

Bunlar başta hemen görülmeyebilir ama ((p && q) && !p) gibi bir kod açıkça bir hepyanlış'tır. Zira p yanlış ise iç sol parantezin doğru çıkma olasılığı yoktur. P doğru olduğunda ise !p yanlış olacağı için sonuç hep yanlış çıkacaktır.

Sadeleştirme

Bir ifadeyi sade hale getirmenin yolu doğruluk tablosundan geçer.
Önermemiz şöyle olsun (p && q) || (p || q) buna göre tablomuzu oluşturalım:

p q (p && q) || (p || q)
1 1 1
1 0 1
0 0 0
0 1 1

Yukarıdaki tablo p || q tablosunun aynısıdır. Dolayısıyla bu önermeyi p || q şeklinde yazabiliriz.

Sıradaki konu kümeler olacak 🙂 Teşekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir