Gprolog ve Prolog dili için Başlangıç Rehberi

Açık Kaynak, Programlama, tutorial, ytulinux

Yapay zeka sınavından yeni çıkmış halimle düşündüm ki, madem prolog öğreniyorum bir tutorial yazayım bu konuda :)
GProlog kullandığım için onu anlatmayı düşünüyorum.
Öncelikle Prolog denilen nesne nedir onu açıklayayım.
Prolog, genellikle kullandığımız programlama dillerinden farklı bir mantığa sahiptir. Geleneksel programlama dillerindeki gibi arka arkaya yapılan olaylar dizisi mantığı tam olarak yoktur. Bize ait bir bilgi tabanı olur, onu komutlarla başta belirtiriz. Sonra bu bilgi tabanındaki verilerle bir takım çıkarımlar yapmamızı sağlayan kuralları tanımlarız. Bunları derledikten sonra, tanımladığımız kurallar ile birtakım sorgular yaparız. Örnekli anlatıma geçilince bunlar “haaaaa” sesli ifadeleri eşliğinde anlaşılacaktır.
GProlog ise, adından anlaşılacağı gibi GNU Prologdur. Yani prolog kodlarının üzerinde çalışması ve derlenmesi için yazılmış GNU programıdır.

Bilgi tabanı derken neyi kastettik? Örneğin elimizde bir takım nesneler var ve biz bunları sınıflandırmak istiyoruz. Genelde verilen örneklerin tersine, olaya biraz psikopatça bakarak akılda kalıcı bir örnek vermek istiyorum. Odadaki eşyaları diyelim ki yakmayı düşünüyoruz. Sisteme her eşya için yakılır(cisim_adı) şeklinde fonksiyonu çalıştırıp yakılabilir olup olmadığını anlamak istiyoruz. Olaya öncelikle nesneler hakkındaki bilgileri vererek başlamalıyız.

tahta(kitaplik).
kagit(meyvesuyukutusu).
plastik(meyvesuyukutusu).
plastik(bardak).

Burada belirttiğimiz şeyler şunlar; kitaplık tahtadır. meyvesuyu kutusu kağıt ve plastikten oluşur. Dolayısıyla Hem kağıt hem plastiktir. bardak plastiktir (elimizdeki nesne öyle, genele yayma amaçlı değil bu :) ) Her komut, prologda nokta işareti ile biter.

sonra yakılır kuralımızı yazmaya başlayabiliriz.

yakilir(Nesne):-(tahta(Nesne);kagit(Nesne)),\+plastik(Nesne).

Açıklamak gerekirse, şu an ne yapıyoruz? Kural tanımlıyoruz. Tanımlama anlamına gelen operatör :- dir. ; işareti veya anlamına, virgül işareti ve anlamına gelir. Farkettiyseniz ve işlemini ayırmak için parantez kullandık ki önce veyi çalıştırmak yerine, veya çalıştırsın. \+ ise tersi anlamına gelir. SWIProlog‘da kullanabildiğimiz not işlemini GPROLOG’da \+ ile yapmanız gerekir yoksa hata alırsınız.

Yapılan şeyi açıklamak gerekirse, tahta veya kağıt olan, ama plastik olmayan bir nesne ise verilen parametre, o zaman “evet” döndür şeklinde bir kural tanımladığımızı söyleyebiliriz. Prolog dilinde tanımlanan kurallar her zaman yes ya da no döndürür. Dolayısıyla programları buna göre yazmak gerekir. Ve değişkenler büyük harfle başlar, büyük harfle başlamayanlar yazı (string) olarak algılanır.

Yazdıklarımızı bir dosyaya yazıp, konsoldan gprolog yazıp enter tuşuna basın. Sonra
consult(‘dosyaadi.pl’).
yazın, bu şekilde kural ve gerçeklerimizi derlemiş oluyoruz.
Ardından, örneğin
yakilir(kitaplik).
Yazarak yazdığımız kuralı deneyebilirsiniz. Şimdi dosyaadi.pl dosyamıza yeni bir kural ekleyelim.
Dosyanın sonuna
yirtilir(Nesne):-kagit(Nesne).
Ekleyin ve bu sefer de aynı adımları izleyerek bu fonksiyonu deneyin. Göreceğiniz gibi, kural tanımında yer alan kısımdan eğer yes dönerse, kuralımız da yes döndürüyor.

Şimdi de, birbirine belli bir bağlantısı olan nesnelerle ilgili bir program yazalım. Üç tane nesnemiz olsun. Bu nesneler bir çizgi üzerinde olsunlar. Birbirlerine göre ne tarafta olduklarını gerçek olarak belirtelim.

saginda(kedi,adam).
saginda(adam,kopek).
saginda(kedi,kopek).
solunda(kopek,adam).
solunda(adam,kedi).
solunda(kopek,kedi).

Bunlar bizim gerçeklerimiz. Şimdi de arasinda kuralı tanımlayalım.

arasinda(Nesne1,Nesne2,Nesne3):-
(saginda(Nesne2,Nesne1),solunda(Nesne3,Nesne1));
(
saginda(Nesne3,Nesne1),solunda(Nesne3,Nesne2)).
Kuralımız böylece, ilk parametre eğer ikinci parametrenin sağında ve üçüncü parametrenin solunda ise ya da ikinci parametrenin solunda üçüncü parametrenin sağındaysa o zaman yes döndürüyor. Burada parametre sırası kafa karıştırabilir, örneğin saginda(a,b) a b nin sağındadır anlamına gelir.

Prologun şimdi de farklı bir yanına el atalım. Prologu çoğu zaman bir arama motoru gibi kullanabilirsiniz. Mesela iki nesnenin arasında neler var demek için
arasinda(X,kedi,kopek).
dediğimiz zaman adam cevabını alırız. X yerine gelebilecek cevapları prolog verir. Aralarında iki nesne olsaydı ikisini arka arkaya yazacaktı.
Bu özelliği kural tanımlarken de kullanabiliriz. Örneğin, arasında en az bir kişi olacak şekilde sağdaki nesneleri yazdırmak için;
saginda2(X,Y):-saginda(Z,Y),saginda(X,Z).
Dersek, Y nin saginda olan herhangi bir Z kişisinin (ki Z burada tanımlanmış oluyor) sağındaki X kişisini yazdırmak için
saginda2(X,adam).
Dememiz yeterli. Prolog önce adama göre sağda olanları Z ye tek tek verecek, sonra da diğer fonksiyonu bunlara göre işletip olası X leri bulacaktır.

İşte prolog böyle bir şeydir diyoruz ve bugünkü yazımızı sonlandırıyoruz. Küçüklerimin ellerinden büyüklerimin gözlerinden öpüyorum.
opulur(el,kucuk).
no
?-

Bu yazı toplamda 3577, bugün ise 0 kez görüntülenmiş

4 Comments
  • http://yildirim.isadamlari.org Mehmet Salih YILDIRIM

    Ben bunu c, python, php, pascal, ruby gibi dillerde de yazardım, ne gerek var şimdi prolog’a

  • huseyinalb

    Bahsettiğin dillerde yazmak için önce arama fonksiyonları tanımlaman gerekirdi, ki prologa göre 4-5 kat uğraş anlamına geliyor (karmaşıklığın artışını düşünürsek daha da fazla) Bu örnekler kolay olduğu için çok da farkedilmiyor aslında, büyük yapay zeka projeleri yazmak istediğinde diğer programlama dilleriyle yazmak daha uzun bir proje sürecini beraberinde getirecektir.

  • http://taygunkekec.wordpress.com Taygun Kekeç

    İyi olmuş iyi.

  • http://www.gaffarovercomes.com Gaffar Durmaz

    #huseyin
    arasinda(salih, huseyin, taygun)
    yes
    ?

    güzel olmuş güzel