Yazan : Şadi Evren ŞEKER

Bu yazının amacı, prolog, programlama dilini kullanarak basit fonksiyon tanımlarını ve listelerin yönetimini açıklamaktır.

Fonksiyon ve Haber Kavramları

Prolog dilinde, yazılan her satır bir haber (predicate) olarak düşünülebilir.

Örneğin haftanın birinci günü Pazartesidir bilgisi, prolog açısından bir haberdir. Bunu aşağıdaki şekilde prologda kodlayabiliriz:

gun(1,’Pazartesi’).

Ardından sorgulamak için, bağlanmamış bir değişken (unbounded variable) kullanılabilir. Prolog dilinde büyük harfle başlayan kelimeler, değişken ifade eder.

gun(1,X).

Sorgusunun sonucu aşağıdaki şekildedir:

?- gun(1,X).

X = ‘Pazartesi’.

Burada bağlı olmayan değişkene, gun haberi için bütün sonuçlar döndürülür.

Haberlerin koşullara bağlanması da mümkündür.

Örneğin maaş bilgisini bir haber olarak Prolog dilinde girelim:

maas(ali,100).

Bu girdiye göre ali’nin maaşı 100 liradır. Ve sorguladığımızda:

?- maas(ali,X).

X = 100.

Sonucunu alırız. Benzer şekilde aynı maaşı alan Veli isimli bir kişi daha olsun :

maas(‘ali’,100).

maas(‘veli’,100).

Şimdi sorgulamayı tersine çevirelim ve 100 lira maaş alanları soralım:

Yukarıdaki örnekte, 100 lira maaş alan iki kişi bulunmuştur. Özellikle, ilk X=ali sonucundan sonra ekranda görülen ; (noktalı virgül) işaretine dikkat ediniz. Aslında prolog tek sonuç gösterir (bu sonuçta ilk bilgisi girilen ali’dir) ancak kullanıcı ; işaretine basarak sonraki sonuçları da görebilir.

Şimdi kayıtlı kişilerin maaşlarına zam yapan bir fonksiyonu yazmaya çalışalım ve kişilerin maaşlarını örneğin %10 oranında arttıralım.

maas(‘ali’,100).

maas(‘veli’,100).

zam(X,Z):-

maas(X,Y),

Z is Y * 1.1.

Yukarıdaki yeni kodumuzda, zam isimli bir fonksiyon tanımlanmış ve X değişkeniyle aldığı kişinin, zamlı maaşını Z değişkenine döndürmesi tasarlanmıştır.

Kodumuz, basitçe X kişisinin maaşını sorgulayıp Y değişkenine atıyor ve ardından Y değişkeninin değerini 1.1 ile çarparak Z değişkenine döndürüyor.

Şayet herkesin zamlı maaşını görmek istersek, aşağıdaki şekilde fonksiyonun iki parametresini de bağlanmadan bırakabiliriz:

Döngüler

Prolog dilinde her ne kadar döngü bulunsa da, yapısal olarak özyineli bir dil (recursive) özelliği bulunduğundan dolayı, döngülerin kullanılması çok uygun değildir.

Prolog dilinde, sürekli işler basitçe aşağıdaki örnekte anlatıldığı üzere bir fonksiyonun kendi kendisini çağırması şeklinde olur:

fac(A,B) :-

A > 0,

C is A – 1,

fac(C,D),

B is A * D.

Yukarıdaki kodda, faktöriyel hesaplanması için A>0 koşulu ile başlanarak her seferinde A*fac(A,B-1) değeri hesaplanmaktadır.

Listeler

Listeler veri yapısı olarak dizilere benzer şekilde, ardışık olarak verileri tutmaktadır. Dizilerden farklı olarak, listelere erişim ardışık (sequential) olabilmektedir. Yani bir dizinin ilk elemanına erişmek mümkündür ama örneğin 5. Elemanına doğrudan erişmek mümkün değildir. Listeleri, veri yapılarında bulunan bağlı listeler (linked list) şeklinde düşünmek daha doğrudur.

Prolog dilinde listeler üzerine yapılan iki temel işlem vardır:

  • Listeleri parçalamak
  • Listeleri veya elamanları birleştirerek liste oluşturmak

Bu işlemleri sırasıyla anlatmaya çalışalım:

Yukarıdaki çalışma örneğinde, alfabenin ilk 5 elemanından oluşan bir liste, | sembolü ile bölünmüş bir listenin içerisine atanıyor. Bunun anlamı, X değeri, listenin ilk elemanını (Buradaki eleman ibaresi önemlidir, listenin ilk elemanı bir elemandır, liste değildir) ve listenin geri kalan elemanlarını ise Y değerinin aldığıdır.

Yukarıdaki bu işlem, Prolog dilindeki en temel parçalama işlemidir.

Listelerin birleştirilmesinde kullanılan en temel fonksiyon ise append’dir:

Yukarıdaki örnekte görüldüğü üzere iki liste birleştirilerek X değişkeni içerisinde gösterilmiştir.

Bir cevap yazın

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