PROLOG ve LOJİK PROGRAMLAMA

Son yıllara kadar bilgisayar programlama bir problemin çözümü için yapılması gerekenlerin adım adım  yazılması  şeklindeydi. Yani bilgisayara işlemlerin NASIL YAPILACAĞI (procedural) söylenmekteydi.  Fortan, C, Pascal gibi diller bu yaklaşımı kullanmaktadır.

Programlamada bir diğer yaklaşım ise doğru cevabın özelliklerinin verilerek yapılacak işlemlerin belirtilmesidir. Yani bilgisayara işlemlerin nasıl yapılacağı değil NE YAPACAĞI (declarative) söylenmektedir.  Bu tip programlama LOJİK PROGRAMLAMA olarak isimlendirilir.  Bu amaçla Lisp ve PROLOG gibi programlama dilleri geliştirilmiştir. 

Deklaratif  dillerin üç önemli üstünlüğü vardır.

  • Lojik programlama   işlemlerin mekanizmaları yerine mantığına odaklandığından doğal olarak yüksek seviyelidir.  İşlemlerin nasıl yapılacağı makinaya bırakıldığı için karmaşık fikirler kolay bir şekilde ifade edilebilir.
  • Lojik,  verilerin gerçek (fact) ve kural (rule) olarak belirtilmesine olanak sağlar.  Örneğin A noktası B noktasına bağlıdır, B noktası C noktasına bağlıdır şeklinde gerçekler belirtilebilir. X Y’ye ve Y Z’ye bağlı ise X Z’ye bağlıdır şeklinde genel kurallar belirtilebilir.
  • Lojik programlama dilleri kullanılarak bilgisayar programları daha hızlı ve kolay bir şekilde geliştirilebilir. Programcının karmaşık fikirleri ifade edebilmesi ve veri yapılarını hızlı bir şekilde oluşturmasına olanak tanır.

1.1    PROLOG’A GİRİŞ

Prolog dünyayı ifade etmek için nesneleri (object) ve aralarındaki ilişkiyi (relation) kullanır.  Aşağıdaki bildirime bakalım:

  • Ali ders verir.

Bu cümle iki nesne (Ali ve ders) arasındaki ilişkiyi belirtmektedir. İlişki nesnelerden daha soyut bir kavramdır.  Bu nedenle aynı ilişkiyi diğer nesneler için de kullanabiliriz:

  • Oya ders verir.
  • Ali seminer verir.
  • Hasan ders verir.

Yukarıda verilen gerçekler kullanılarak bu dünya için sorular sorabiliriz.  Yalnız  belirtilen gerçek ve kurallar doğru kabul edilmektedir.  Bunların dışındakiler yanlış kabul edilir.

Örneğin;  Ali’nin ders verdiği doğru mu ? şeklinde bir soru sorarsak cevap Evet olmalıdır. Oya’nın seminer verdiği doğru mu? Sorusunun cevabı Hayır olmalıdır. Kimler ders vermektedir? Şeklindeki bir sorunun  cevabı : Ali, Oya, Hasan olmalıdır.  Çünkü bu kişiler ders ilişkisini gerçeklemektedirler.

Gerçeklerin yanında nesneler arasında daha soyut ve daha genel ilişkileri belirten kurallar vardır.  Örneğin ders veren herkesin hoca olduğunu kabul edersek aşağıdaki kuralı yazabiliriz:

  • eğer KİŞİ ders veriyor

      ise  KİŞİ hocadır.  (if/then)

Burada KİŞİ bir değişkendir.  Kuralın eğerli kısmı dünya hakkındaki koşulu vermektedir. Verme ilişkisini kullanarak ders nesnesi ile bilinmeyen KİŞİ nesneler kümesini belirtir. KİŞİ yerine kim uyarsa onun hoca nesnesi ile ilişkisi olduğunuu söyleyebiliriz.

Yukarıdaki kural ve gerçekleri kullanarak yeni ilişkileri çıkarabiliriz:

  • Ali hocadır.
  • Oya hocadır.
  • Hasan hocadır.

Çünkü Ali, Oya ve Hasan kuralın koşulun gerçeklemektedir : KİŞİ ders veriyor.

Benzer şekilde, gerçekler kümesi ve kuralı kullanarak sorgulama yapabiliriz. Örneğin; Oya hoca mı? Şeklinde bir sorunun cevabı Evet olmalıdır.

Kim hocadır şeklinde daha karmaşık bir sorunun cevabı: Ali, Oya ve Hasan olmalıdır.

Bu Prolog’un temel olarak çalışma şeklidir.  Gerçekler kümesi bildirilir, nesneler kümesini belirten kurallar bildirilir ve soruları cevaplamak içiin kurallar kümesi ile gerçekler kümesi birleştirilir.

1.2    PROLOG SÖZDİZİMİ (syntax)

İlişkiler yüklem (predicate) olarak aşağıdaki formda belirtilir:

            * verir(ali, ders).         % Ali ders verir.

Burada “verir” yüklemi iki nesne arasındaki ilişkiyi belirtmektedir.  Nesne sayısı 0 veya herhangi bir sayıda olabilir. Bu sayı “arity” olarak isimlendirilir.

Kuralların yazımında bazı sınırlamalar vardır:

  • Nesne ve yüklem isimleri küçük harf ile başlar.
  • Önce yüklem yazılır.  Eğer nesneler var ise parantez içinde virgülle ayrılmış şekilde yazılır.
  • Her gerçek nokta karakteri ile sonlandırılır.

Bu sınırlamalara bağlı olarak yukarıda verilen gerçekleri aşağıdaki şekilde yazabiliriz:

  • verir(ali,ders).
  • verir(oya,ders).
  • verir(ali,seminer).
  • verir(hasan,ders).

Gerçekleri Sorgulama:

Gerçekler kümesi verildikten sonra onların hakkında sorular sorulabilir. Prolog’da sorgulama programı başlatma şeklidir.  Yazım olarak sorgulama  gerçeğe (fact) benzer ama yüklemde değişken kullanılabilir. Değişkenler büyük harf ile başlar.

Sorgulama sonucu Evet/Hayır veya nesneler kümesi şeklinde olabilir.  En basit şekli Evet/Hayır şeklinde olanıdır:

  • verir(oya,ders).      sorusunun cevabı Evet,
  • verir(oya,seminer)  sorusunun cevabı Hayır olmalıdır.

Daha genel sorgulama nesneler kümesini içerir. Örenğin Kimler ders verir? Şeklinde bir soru prologda:

  • verir(X,ders).

Şeklinde yazılır.  X ders ile arasındaki ilişkiyi gerçekleyen herhangi bir nesneyi temsil eden değişkendir.  Yukarıdaki sorunun cevabı aşağıdaki şekilde olmalıdır:

  • X = ali
  • X = oya
  • X = hasan

Diğer yandan, Ali ne verir? Şeklindeki bir soru aşağıdaki şekilde yazılabilir:

  • verir(ali,X).

Bu sorunun cevabı

  • X = ders
  • X = seminer

olmalıdır.

Kim ne verir şeklinde bir soru aşağıdaki şekilde sorulabilir:

  • verir(X,Y).

Bu sorunun cevabı aşağıdaki şekildedir.

  • X = ali ,      Y = ders
  • X =oya,      Y = ders
  • X =ali,        Y = seminer
  • X =hasan,   Y = ders