Declarative Programlamaya Giriş - 4 / Son

July 2023 · 2 minute read

En son (prolog-3) yazısında kendi sayı sistemimizden 10’luk sayı sistemine geçiş yapacağımızı söylemiştim.

10’dan küçük olan sayılar kolay:

onluk(0, sifir).
onluk(1, a(sifir)).
onluk(2, a(a(sifir))).
onluk(3, a(a(a(sifir)))).
onluk(4, a(a(a(a(sifir))))).
onluk(5, a(a(a(a(a(sifir)))))).
onluk(6, a(a(a(a(a(a(sifir))))))).
onluk(7, a(a(a(a(a(a(a(sifir)))))))).
onluk(8, a(a(a(a(a(a(a(a(sifir))))))))).
onluk(9, a(a(a(a(a(a(a(a(a(sifir)))))))))).

10’dan büyük sayıları yazarken sağdan sola basamak basamak ilerleyeceğiz.

132 = 13×10 + 2
 13 =  1×10 + 3
  1 =  0×10 + 1
              ┊
      1,3,2 ──┘

Dikkat ettiyseniz değerleri bulduğumuz sırada yazınca 2,3,1 ediyor, yani istediğimiz cevabın tersten okunuşu. Buna takmadan ilerleyelim. Gerekirse bir listeyi tersine çevirmek kolay.

Ama cevabı liste halinde alacağımız da belli oldu. 2,3,1 listesini 2(3(1)) diye yazacağız (Prolog-2 yazisindaki meyveler listesinde yaptığımız gibi).

onluk
onluk(0, sifir).
onluk(1, a(sifir)).
onluk(2, a(a(sifir))).
onluk(3, a(a(a(sifir)))).
onluk(4, a(a(a(a(sifir))))).
onluk(5, a(a(a(a(a(sifir)))))).
onluk(6, a(a(a(a(a(a(sifir))))))).
onluk(7, a(a(a(a(a(a(a(sifir)))))))).
onluk(8, a(a(a(a(a(a(a(a(sifir))))))))).
onluk(9, a(a(a(a(a(a(a(a(a(sifir)))))))))).
%                         X>10                                      ∧ X=K+(10×Z)
onluk(liste(K_,Z_), X) :- buyuk(X, a(a(a(a(a(a(a(a(a(sifir)))))))))), bolum(Z, K, X, a(a(a(a(a(a(a(a(a(a(sifir))))))))))), onluk(Z_, Z), onluk(K_, K).
sorgular
?- onluk(X, a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(sifir))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))).

X = liste(2, liste(3, 1))

Zaten bolum fonksiyonunu yazdığımız için işimiz kolay oldu.

Church Encoding

Bu arada 3 sayısına a(a(a(sifir))) demeyi bizden önce Alonzo Church isminde birisi bulmuş ve bu biçime Church-Encoding (https://en.wikipedia.org/wiki/Church_encoding) adı verilmiş. Bizimki kadar güzel mi bilmiyorum ama onlar da bu sayı-gösterme biçimini kullanan cebir fonksiyonları yazmışlar.

Cebir demişken…​.

Biz her şeyi sıfırdan inşaa ettik diye prolog’da bunların karşılığı yok değil. onluk fonksiyonunu prolog’un + işlemini kullanarak yazalım. Bu sefer liste değil sayı kullanacağız cevap olarak:

onluk_v2
onluk_v2(0, sifir).
onluk_v2(X, a(Y)) :- onluk(X_, Y), X is X_ + 1.
sorgular
?- onluk_v2(X, a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(sifir))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))).

X = 132

Linked List

list(a, list(b, list(c, d))) diyerek liste oluşturduk. Bu tip bir veri yapısına da Linked-List deniyor. Bizim listemiz boş olamayan bir liste (çünkü sıfır adet değer göstermek için bir tanım yok).

Prolog’da list(a, list(b, c)) denen listeyi [a, b, c] diyerek oluşturabiliyoruz. Bu listenin boyunu bulalım:

boy
boy(N, list(A, B)) :- boy(N_, list(B)), N is N_ + 1.
boy(1, A). (1)

boy_(N, [A|B]) :- boy(N_, B), N is N_ + 1.
boy_(0, []).
  1. bizim liste yapısıyla ancak boş olmayan listeleri temsil edebiliyoruz demiştim. Bakın, listenin boyu en az 1 olabiliyor.

Sonuc ve devam

Malesef tasindigimdan beri hayatim biraz alt-ust ve boyle olunca ozen gostermeyi biraktigim seylerden ilki blog’um oldu.

Kesinlikle prolog yazilarima devam etmeyi dusunuyorum. Prolog ile problemin bilgisayar tarafindan nasil cozuleceginden ziyade problemin herhangi bir anindaki halini kodda resmederek cozumler uretiyoruz. Bu farkliligin bize nasil bir dusunme yetisi kattigini ve ne gibi yaklasimlar sundugunu birlikte gorecegiz.

Ama ben hayatimi duzene koymaya calisirken sizlerden de biraz sabir ve anlayis rica ediyorum.

(Bir sonraki blog yazimi yazdigimda Hugo yerine kendi statik web sunucuma gecmis olacagim!)