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(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).
?- 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(0, sifir).
onluk_v2(X, a(Y)) :- onluk(X_, Y), X is X_ + 1.
?- 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(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, []).
-
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!)