Prolog’da Aritmetik: is Operatörüyle Sembolleri Sonuca Dönüştürmek

Programlamada aritmetik deyince çoğu dilde x = 2 + 3 yazıp sonucu bekleriz. Prolog ise biraz daha felsefi davranır: Önce sembolleri, terimleri ve ilişkileri düşünür; hesaplama ise özel olarak istendiğinde yapılır. İşte is operatörü tam bu noktada sahneye çıkar: Matematiksel formülü sadece sembolik bir yapı olarak tutmak yerine, gerçekten hesaplar ve kesin sonucu yeni bir değişkene bağlar. `` Prolog’da 2 + 3 ifadesi ilk bakışta basit görünür. Fakat Prolog için bu ifade, otomatik olarak 5’e dönüşen bir işlem değil; +(2, 3) şeklinde okunabilecek bir terimdir. Yani sembolik bir ağaç gibi düşünebiliriz. Eğer hesaplama yapılmasını istiyorsak is kullanırız:

X is 2 + 3.
% X = 5

Burada sağ taraf, yani 2 + 3, önce değerlendirilir. Sonra elde edilen sonuç sol taraftaki değişkene bağlanır. Matematiksel olarak söylemek gerekirse:

$X = 2 + 3 \Rightarrow X = 5$

Ama Prolog’daki = operatörü ile bu aynı şey değildir. = birleştirme, yani unification yapar. Hesaplama yapmaz. Bu ayrım Prolog öğrenirken küçük ama çok kritik bir virajdır.

İfade Prolog’un Davranışı Sonuç
X = 2 + 3 Sembolik terimi bağlar X = 2+3
X is 2 + 3 Sağ tarafı hesaplar X = 5
5 is 2 + 3 Sağ tarafı hesaplayıp karşılaştırır gibi birleştirir doğru
2 + 3 is 5 Sol taraf hesaplanabilir değişken/ sayı gibi uygun değildir genellikle hata

Bunu bir mutfak benzetmesiyle düşünelim. 2 + 3 bir yemek tarifi olsun. = operatörü tarifi deftere yapıştırır. is ise mutfağa girer, malzemeleri toplar ve tabağa gerçek yemeği koyar. Tarif başka, yemek başka!

Aşağıdaki örnek, sembolik bağlama ile gerçek hesaplama arasındaki farkı gösterir:

sembolik_ornek(X) :-
    X = 10 * 4 + 2.

hesapli_ornek(X) :-
    X is 10 * 4 + 2.

İlk kural çağrıldığında X, 10*4+2 terimine bağlanır. İkinci kuralda ise işlem önceliği uygulanır ve sonuç 42 olur. Yani:

$10 \times 4 + 2 = 42$

is operatörünün önemli bir şartı vardır: Sağ taraftaki ifade hesaplanabilir olmalıdır. Yani içinde değeri bilinmeyen bir değişken varsa Prolog hesaplama yapamaz.

?- X is Y + 1.
% Hata: Y henüz bir sayıya bağlı değil

Doğru kullanımda önce Y bağlanmalıdır:

?- Y = 4, X is Y + 1.
% Y = 4,
% X = 5

Bu davranış, Prolog’un soldan sağa hedef çözme mantığıyla ilgilidir. Prolog önce Y = 4 hedefini çözer, sonra X is Y + 1 ifadesinde artık Y değerini bildiği için hesaplama yapabilir.

Karşılaştırma işlemlerinde de dikkatli olmak gerekir. is, sonuç üretmek içindir; iki aritmetik ifadenin değerini karşılaştırmak için =:= kullanılır.

Amaç Kullanım Örnek
Sonuç hesapla ve bağla is X is 7 * 6
Sembolik birleştirme yap = X = 7 * 6
Aritmetik eşitlik kontrol et =:= 2 + 3 =:= 5
Aritmetik eşitsizlik kontrol et =\= 2 + 3 =\= 6

Küçük bir alan hesabı örneği yazalım:

alan_dikdortgen(Genislik, Yukseklik, Alan) :-
    Alan is Genislik * Yukseklik.

cevre_dikdortgen(Genislik, Yukseklik, Cevre) :-
    Cevre is 2 * (Genislik + Yukseklik).

Bu kurallar şu şekilde çalışır:

?- alan_dikdortgen(5, 8, A).
% A = 40

?- cevre_dikdortgen(5, 8, C).
% C = 26

Teorik olarak burada yaptığımız şey, bir bağıntının içinde deterministik bir hesaplama adımı tanımlamaktır. alan_dikdortgen(5, 8, A) ilişkisi, $A = 5 \times 8$ formülünü kullanır ve A değişkenini kesin sonuç olan 40’a bağlar.

Özetle: Prolog’da matematiksel formül yazmak, onun otomatik hesaplanacağı anlamına gelmez. = sembolik dünyada kalır; is ise hesaplama motorunu çalıştırır. Eğer formülün gerçekten değerlendirilmesini ve sonucun yeni bir değişkene atanmasını istiyorsanız, doğru araç is operatörüdür. Prolog’un büyüsü de burada başlar: Sembollerle düşünür, gerektiğinde sayılarla hesaplar.

Yorumlar