Arkadaşlar geçen hafta prolog programlama dili ile ilgili genel bilgiler vermiştim ve bunlara yönelik bazı örnekler yapmıştık. Bu hafta prologda bir program yazmanın genel yapısı, değişkenler, operatörler ve bunlarla ilgili örnekler çözeceğiz.

Prolog Programlarının Temel Bölümleri

Bir Prolog Programı genelde dört bölümden oluşur bunlar;

  • Clauses (Gerçekler ve Kurallar),
  • Predicates (Yüklemler),
  • Domains (Değişken Tipleri),
  • Goals (Hedefler).

1.Clauses(Olgular veya Kurallar)

Bu bölüm bir programın kalbi durumundadır. Çünkü programda tanımlı hedefler doğrulanmaya çalışılırken, doğruluğu daha önceden bilinen gerçeklerden yola çıkılır. Gerçek ve gerçekler arasındaki ilişkileri tanımlayan kuralların tanımlandığı yer bu bölümdür. Bir yüklem için tanımlanması gereken bütün clauses’lar kümesine Procedure denir.

Kural oluşturmak

Ahmet’in annesi kimdir.

Bilgi tabanımızda anne yada baba diye bir ilişki tanımlı değil. Anne ilişkisi için bir kural yazılabilir;

anne(X,Y):- ebeveyn(X,Y), kadin(X). // bu satır şunu bize diyor : x bir kadındır ve x, y ‘nin ebeveyni ise x, y nin annesidir (aradaki “:-” işaret daha önceki dersimizde “ise” anlamına geldiğini söylemiştik “,” virgül işareti ise, ve anlamındadır detaylı bilgi mantıksal operatöler kısmına verilecektir)

baba(X,Y):- ebeveyn(X,Y), erkek(X).

                ?- anne(Y,ahmet).

                Y=ayse. // ahmedin annesi kimdir sorgulaması yaptığımızda, daha önceden not defterine yazdığımız “ayse” değerini bize verecektir

2.Predicates (Yüklemler)

Yüklemlerin ve yüklemlerdeki argümanların tiplerinin tanımlandığı yer bu bölümdür. Prologda mevcut olan hazır yüklemlerin tanımlanması gerekmez. Yüklemlerin bitiş parantezinin Clauses bölümündeki gibi  ‘.’  ile sonlanmadığına dikkat edilmelidir. Yüklem isimleri en fazla 250 karakterden oluşabilir ve herhangi bir harfle başlayabilir

Bir yüklemin genel yazılış biçimi şöyledir:

yuklem_adi(argüman_tip1, argüman_tip2, argüman_tip3,….,argüman_tipN)

Yüklemler için isim seçilirken küçük veya büyük harfle başlamak önemli değildir. Fakat küçük bir harfle başlayan bir isim seçilmesi önerilir. Çünkü Prolog derleyicilerin çoğu ancak küçük harfle başlayan yüklem isimlerini kabul etmektedir. Nedeni değişkenlerin de buyuk harfle başlıyor olmasındandır

3.Domains (Değişken Tipleri)

Değişkenler büyük harf veya alt çizgiyle başlar. Devamında harf, rakam veya simgeler olabilir.

Örneğin;

( X, Object2, _47, Programlama_Dilleri, …)

Bir değişkenin değeri bir cümlecik içinde sabittir.

Bir atomun değeri ise tüm program boyunca sabittir.

Aşağıdaki tabii dil cümlesinin Prologda karşılığını yazıp, özel domain tanımı aşağıdaki şekilde yapılır.

Hasan, 28 yaşında bir erkektir.

Eğer özel olarak domain tanımlanmazsa, yani Prologda standart tipler kullanılırsa yukarıdaki cümle şöyle yazılabilir:

sahis (symbol, symbol, integer)

Bu yüklem ve argümanlar doğru biçimde tanımlandığı için çalışır. Fakat sahis yüklemi içinde tanımlanan üç argümanın neye işaret ettiğini hatırlamak zor olabilir.

Bunun yerine:

domains

isim, cinsiyet = symbol

yas = integer

predicates

sahis(isim, cinsiyet, yas)

Şeklinde üç ayrı domain tanımlanırsa sahis argümanındaki isim, cinsiyet ve yas argümanlarının anlamı her zaman için barizdir. Bu tanımlamanın bir faydası da argüman tipleri arasında olabilecek tip eşleştirme hatalarını önlemektir.

4.Goals (Hedefler)

Goal bölümünün bir kuralın yapısından sadece iki farkı vardır.

  1. Goal kelimesinden sonra ‘if’ anlamındaki ‘:-’ operatörü kullanılamaz.
  2. Program çalışırken Prolog ilk önce GOAL satırını çalıştırır.

telefon_numarasi(Kimin_Telefonu, “3145869”).

telefon_numarasi(“Suleyman AKAN”, Telefon_Numarasi).

telefon_numarasi(Telefon_Sahibinin_Adi, Telefon_Numarasi).

Değişkenler

Prologda değişken isimlerinin daima büyük harfle veya ‘_’ ile başladığı, daha önceden söylenmişti. İlk karakteri büyük bir harf veya ‘_’ olmak şartıyla, değişkenler istenilen kadar rakam, büyük veya küçük harf alabilirler.

Basit bir sorgulamada,

sever(Kim, futbol).

Kuralını kullanarak kimin futbol oynamaktan hoşlandığı öğrenilebilir.

Bu sorguda Kim, değişken olarak kullanılmıştır

Anonim Değişkenler:

İsimlendirilmiş değişkenlerdir. Sadece alt çizgiyle(_) ifade edilir.

Örnek:

sever(X,Y).

sever(X,_).

Her alt çizgi karakteri yeni bir anonim değişken ifade eder.

Not: Anonim değişkenlerin değeri çıkış olarak verilmez. Anonim değişkenler True yada False değeri döndürür.

Örneğin;

?-parent(Ali,_).

Sadece Alinin çocuğu var mı ?

True yada False

Operatörler

1.Aritmetiksel İşlem Operatörleri

  • (+) addition (Toplama operatörü)
  • (-) subtraction (Çıkarma operatörü)
  • (*) multiplication (Çarpma operatörü)
  • (/) real division (Reel Bölme operatörü)
  • (//) İnteger division (Tamsayı bölme operatörü)
  • (**) Power (Üs alma operatörü)
  • (Mod) modulus (Mod alma operatörü)

toplama(A,B,C):- C is A+B. // işlem arasında görülen is ifadesi sağdaki işlemi sol tarafa eşitliyor bir bakıma “=”görevi goruyor. ama bir atama deyimi değildir

çıkarma(A,B,C):- C is A-B.

çarpma(M,N,S):- S is M*N.

bölme(A,B,C):- B>0, C is A/B.

eşit(A,B):- A==B.

eşitdegil(A,B):- not(A==B).

modAlma(A,B,C):- C is A mod B.

üssAlma(A,B,C):- C is A^B.

mutlakDeger(S,A):- A is abs(S).

karışıkİşlem(S,Ü,L,E,Y,M,A,N):- N is S^Ü-L*E+Y/(M+A).

üssAlma2(A,B,C):- C is A**B.

2.Mantıksal İşlem Operatörleri

“ :- “ ->ise ,   “ , ”-> ve   “;”->veya   anlamları taşımaktadırlar ayrıca “not” operatörüde vardır. Örnek verecek olursak;

ebeveyn(ahmet,volkan);ebeveyn(ahmet,nur).

ebeveyn(ali,X),not(ebeveyn(X,nur)),not(X=fatma).

Bir sonraki yazımızda görüşmek üzere…