1- PROLOG’UN (PROGRAMMING IN LOGIC) TEMELLERİ
Bir Prolog programı, (Basic, Fortran, Pascal, C) olduğu gibi bir dizi komut satırından değil, doğruluğu önceden bilinen gerçeklerden ve bu gerçeklerden bilgi sağlamaya yarayan kurallardan oluşur.
Prolog, cümlecikler (Horn Clauses) üzerine bina edilmiştir. Cümlecikler, yüklem mantığı denilen formal sistemin bir alt kümesidir.
Prolog’da bir Karar Motoru (Inference Engine) vardır. Bu motor, verilen bilgiyi kullanarak cevabı aranan bir problem için, mantıksal bir şekilde karar veren bir işlemdir. Prolog, program satırları içinde sorulan bir soruyu veya hipotezi doğrulamak için, doğruluğu önceden bilinen ve veri olarak yüklenmiş olan bilgi kümesini sorgulayıp hipotezin doğruluğu hakkında karar vermeye çalışır.
Prolog’un önemli diğer bir özelliği de şudur: Sorulan sorulara mantıklı cevaplar bulmanın yanısıra, bulduğu tek bir çözümle yetinmez, başka alternatifleri de inceleyerek mümkün olan bütün çözümleri bulur.
Yüklem mantığı, mantığa dayalı fikirleri yazılı bir şekilde ifade etmeye yarayacak şekilde geliştirilmiştir ve Prolog’da bu mekanizma gayet iyi kullanılır. Yüklem mantığının yaptığı ilk iş, cümlelerdeki gereksiz kelimeleri ayıklamaktır.
Ahmet bir insandır. insan(Ahmet).
Gül kırmızıdır. kirmizi(gul).
Ahmet, gülü kırmızı ise sever. sever(Ahmet, gul) if kirmizi(gul).
Prolog ile program yazarken, ilk önce nesneler ve bu nesneler arasındaki ilişkiler tanımlanır. ‘Ahmet gülleri sever’ cümlesindeki Ahmet ve gül kelimeleri nesne, ‘sevmek’ ise bu iki nesne arasındaki ilişkidir. Bu ilişkinin ne zaman doğru olacağını belirleyen ifadeye ise Kural denir.
Gerçekler: Bilinen olgular
Prolog’da, nesneler arasındaki ilişkiye Yüklem denir. Tabii dilde bir ilişki bir cümle ile sembolize edilir. Prolog’un kullandığı yüklem mantığında ise bir ilişki, bu ilişkinin ismi ve bunu takiben parantez içinde yazılan nesne veya nesnelerden oluşan basit ifadelerle özetlenir.
Yasin Esra’yı sever.
Esra Cihat’ı sever.
Yasin kedileri sever.
Yukarıdaki ifadeleri olgu olarak kabul edip Prolog’daki karşılıklarını yazalım:
sever(yasin, esra).
sever(esra, cihat).
sever(yasin, kediler).
Görüldüğü gibi, gerçekler nesnelerin ve ilişkilerin değişik özelliklerini de ifade edebilirler.
Kurallar: Verilen Gerçeklerden Hüküm Çıkarma
Aşağıda ‘sevmek’ ilişkisinden elde edilen bazı kurallar verilmiştir:
Yasin, Esra’nın sevdiği her şeyi sever.
Hasan kırmızı olan her şeyi sever.
Bu kuralları Prolog dilinde yazmak gerekirse:
sever(yasin, hersey):-sever(esra, hersey).
sever(hasan, hersey):- kirmizi(hersey).
Buradaki :- sembolü, prosedürel dillerdeki if(eğer) anlamında olup, bir kuralın iki parçasını birleştirir.
Prolog, sever(yasin, hersey):-sever(esra, hersey) kuralını kullanarak, Yasin’in sevdiği nesneyi bulmak için önce kuralın ikinci kısmını, yani Esra’nın sevdiği nesneyi bulur. Bunun doğruluğu ispatlandıktan sonra Yasin’in sevdiği nesneyi belirler.
Sorgulamalar: (Querries)
Prolog’a bazı gerçekler tanıtıldıktan sonra, artık bu gerçeklerle ilgili sorular sormaya başlanabilir. Bunu Prolog Sistemini Sorgulama diyoruz. Günlük konuşmalarda Esra Yasin’i seviyor mu? şeklindeki bir soruyu Prolog’da şöyle ifade edilir.
sever(esra, yasin).
Bunun cevabı program akışı içerisinde verdiğimiz gerçeklere bağlıdır. Yasin neyi sever? şeklindeki bir soruyu Prolog’a sormamız mümkündür. Bunu sever(yasin, Neyi) şeklinde kodlarsak, Prolog’dan şu cevabı alırız:
Neyi=esra
Neyi=kediler
2 Solutions
Çünkü önceden verilen sever(yasin, esra) ve sever(yasin, kediler) ilişkileri, bunu ispatlamaktadır.
Burada Yasin ve Esra'ın küçük harfle, Neyi kelimesinin ise büyük harfle başlamaktadır. Çünkü, yüklemdeki Yasin sabit bir nesnedir, yani değeri sabittir. Oysa Neyi bir değişkendir. Yani farklı gerçeklerle beraber, sorgudan alınacak cevaplar da farklı olacaktır. Bu yüzden değişkenler daima büyük harf veya bir ‘_’ ile başlar.
Prolog’da, bir insana sorulabilecek başka soruları da sormak mümkündür. Fakat ‘Mehmet hangi kızı sever?’ şeklindeki bir soruya hiçbir cevap alınamaz. Çünkü yukarıdaki satırlar dikkate alındığında, bu konuyla ilgili bir bilginin mevcut olmadığı görülür. Yasin Esra’yı sevmektedir, fakat Esra’nın kız olduğuna dair bir bilgi mevcut olmadığından, Prologun bu gerçeklerden hareketle bir karara varması mümkün olamaz.
Gerçekler, Kurallar ve Sorgulamaların Bir Araya Yazılması
1. Aşağıdaki gerçekler ve kuralların var olduğunu kabul edilsin.
Büyük araba hızlıdır.
Büyük bir araba iyidir.
Küçük bir araba daha kullanışlıdır.
Kasım, eğer hızlı ise, büyük arabayı ister.
Yukarıdaki gerçeklerden anlaşılan şey, Kasım’ın hızlı ve büyük arabalardan hoşlandığıdır. Prolog da aynı sonuca varacaktır. Zaten hızlı arabalar hakkında bilgi verilmeseydi, hiçkimse Kasım’ın hızlı arabalardan hoşlandığı sonucuna varamazdı. Yapılabilecek tek şey, ne tür bir arabanın hızlı olacağını tahmin etmektir.
2. Aşağıdaki örneğe bakarak, Prolog’un kuralları kullanarak sorgulara nasıl cevap bulduğu açıklanmıştır.
hoslanir(cengiz, masa_tenisi).
hoslanir(mehmet, yuzme).
hoslanir(yavuz, futbol).
hoslanir(levent, Spor):-hoslanir(yavuz, Spor).
Son satırdaki hoslanir(levent, Spor):-hoslanir(yavuz, Spor) bir kural olup, konuşma dilindeki karşılığı şudur: Levent, bir spor türünden eğer Yavuz da hoşlanıyorsa hoşlanır.
Bu kuralın baş tarafı hoslanir(levent, Spor) ve gövde kısmı hoslanir(yavuz, Spor) olur. Burada Levent’in yüzmeyi sevip sevmediği hakkında hiçbir bilgi yoktur. Bunu öğrenmek için hoslanir(levent,yuzme) şeklinde bir sorgu kullanmak yeterlidir. Cevap bulmak için Prolog hoslanir(levent, Spor):-hoslanir(yavuz, Spor) kuralını kullanır. Yukarıda geçen gerçeklerle bunlar arasındaki ilişkiler, aşağıdaki şekilde bir program haline getirilir
PREDICATES
nondeterm hoslanir(symbol,symbol)
CLAUSES
hoslanir(cengiz, masa_tenisi).
hoslanir(mehmet, yuzme).
hoslanir(yavuz, futbol).
hoslanir(levent, Spor):- hoslanir(yavuz, Spor).
GOAL hoslanir(levent, futbol).
Bu program Prolog’da derlenirse, ‘yes’ cevabını alınır. Çünkü hoslanir(yavuz, futbol) gerçeği Yavuz’un futboldan hoşlandığını göstermektedir. hoslanir(levent, Spor):-hoslanir(yavuz, Spor) kuralı ise Levent’in, Yavuz’un yaptığı spor türlerinden hoşlandığını göstermektedir. İlgili olgu Yavuz’un futboldan hoşlandığını gösterdiği için, Levent’in de futboldan hoşlandığını söylemek mümkündür. Bu yüzden GOAL hoslanir(levent, futbol) sorgusunun cevabı ‘yes’ olur.
Fakat hoslanir(levent, tenis) sorgusunun cevabı ‘no’ olacaktır. Çünkü:
1. Bu sorgunun doğrulanabilmesi için gerçekler arasında öncelikle Yavuz’un tenisten hoşlandığını gösteren bir olgunun var olması gerekir.
2. hoslanir(levent,Spor):-hoslanir(yavuz, Spor) kuralı, üstteki gerçekleri kullanarak bu konuda bir karara varamaz. Çünkü kuralın gövdesini doğrulayacak bir bilgi olmadığından, kural başarısız olur.
Genel Örnekler:
Prolog gerçeklerinin konuşma diline çevrilmesi, aşağıda verilmiştir.
1. yapmaktan_hoslanir(oya, resim) = Oya, resim yapmaktan hoşlanır.
2. cocuk(arif).= Arif, bir çocuktur.
3. bulunur(“Çankaya Köşkü”, “Ankara”). = Çankaya Köşkü Ankara’dadır.
4. adres(abuzer, zonturlu, “ Fatih Cad. 6. Sokak.”, “Dışkapı”, “ANKARA”, 06412).= Abuzer Zonturlu’nun adresi Fatih Cad. 6. Sokak Dışkapı, ANKARA, 06412’dir.
Şimdi tam tersini yapalım, konuşma dilinden Prolog diline çevrilme ise, aşağıdaki gibi yapılır.
1. Vedat iyi kebap yapar = yapar(vedat, iyi_kebap).
2. Keban Barajı Elazığ’dadır = bulunur(“Keban Barajı”, “Elazığ”).
3. Kasım Kaya’nın telefon numarası 314 41 17’dir. telefon_no(“Kasım KAYA”, “314 41 17”).
4. Hüseyin Meryem’in babasıdır. = baba(huseyin, meryem).
Cümleler (Gerçekler ve Kurallar)
Prolog dilini oluşturan iki türlü ifade vardır. Bu ifadeler gerçekler veya kurallardan ibarettir. Prolog dilinin kalbini oluşturan bu ifadelere clause denilmektedir.
Günlük hayatımızda da doğruluğu bilinen gerçeklerden yola çıkarak bir şeyin doğru olup olmadığı araştırlır. İşte, mevcut gerçeklerden hareket ederek neyin doğru olabileceğini gösteren yapıya Prolog’da Kural denir. Şimdi Prolog’daki Kural yapısına bir örnekle yakından bakalım. Örnek:
1. Aşağıdaki cümlede, menü’de olan bir yemeğin Mehmet’e uygun olup olmadığı sorgulanmaktadır.
Mehmet ülser olduğu için sadece doktorunun izin verdiği yemekleri yer.
Menü ve yukarıdaki kurala bakarak, Mehmet’in hangi yemeği sipariş edebileceğine karar verilebilir. Bunu yapabilmek için, menüdeki yemeğin belirli şartları taşıyıp taşımadığına bakılmaladır.
a. Menudeki_yemek bir sebze mi?
b. Menudeki_yemek doktorun tavsiye ettiği listede var mı?
c. Sonuç: Eğer a ve b şıklarının ikisinin de cevabı ‘Evet’ ise, bu durumda Mehmet menüdeki bu yemeği yiyebilir.
Prolog’da bu tür ilişkilerin bir kuralla ifade edilmesi zorunludur, çünkü verilecek karar tamamen gerçeklere bağlıdır. Yukarıdaki ifadeler; Prolog gerçekleri olarak şöyle yazılabilir:
mehmet_yiyebilir(Menudeki_yemek):-
sebze(Menudeki_yemek), doktor_tavsiyeli(Menudeki_yemek).
sebze(Menudeki_yemek) ifadesinden sonra ‘,’ konulmuştur. Çünkü virgül, iki amaç arasındaki bağlantıyı gösterir ve ‘and’ anlamındadır. mehmet_yiyebilir(Menudeki_yemek) ilişkisinin doğrulanabilmesi için, sebze(Menudeki_yemek), doktor_tavsiyeli(Menudeki_yemek) ilişkilerinin her ikisinin de doğru olması gerekir.
Örnek:
Bir müşteri arabayı severse ve araba satılık ise bu arabayı satın alabilir.
Tabii dildeki bu ilişki, aşağıdaki kuralla Prolog’a aktarılabilir:
satin_alabilir(Musteri, Model):-
sahis(Musteri), araba(Model), hoslanir(Musteri, Model), satilik(Model).
Aynı kural, konuşma dilinde aşağıdaki şekilde ifade edilir.
Müşteri modeli satın alabilir :-
Müşteri bir şahıs ve
Model bir araba ve
Müşteri modelden hoşlanırsa ve
Model satılık ise.
Bu kuralın baş kısmı, gövde kısmındaki her dört şartın da doğrulanması halinde doğru olacaktır. Yukarıda yazılan gerçekler, aşağıdaki şekilde program haline getirilebilir.
PREDICATES
nondeterm satin_alabilir(symbol, symbol)
nondeterm sahis(symbol)
nondeterm araba(symbol)
hoslanir(symbol, symbol)
satilik(symbol)
CLAUSES
satin_alabilir(X,Y):-
sahis(X),
araba(Y),
hoslanir(X,Y),
satilik(Y).
sahis(ahmet).
sahis(paki).
sahis(cengiz).
sahis(levent).
araba(buick).
araba(bmw).
araba(passat).
araba(toyota).
hoslanir(paki,buick).
hoslanir(levent, toyota).
hoslanir(cengiz, passat).
hoslanir(ahmet, tenis).
satilik(pizza).
satilik(toyota).
satilik(buick).
satilik(passat).
Yukarıdaki programı yazdıktan sonra Levent ve Cengiz’in ne satın alabileceğini, kimin buick marka arabayı alabileceğini bulmak için aşağıdaki hedef cümleleri kullanılabilir:
satin_alabilir(Kim, Ne).
satin_alabilir(levent, Ne).
satin_alabilir(cengiz, Ne).
satin_alabilir(Kim, buick).
Olgular Arasındaki İlişkiler: Yüklemler (Predicates)
Bir ilişkinin sembolik ismine yüklem denir ve yükleme bağlı olan nesnelere argüman denir. Mesela sever(yasin, esra) gerçeğindeki sever ilişkisi yüklem, yasin ve esra ise bu yüklemin agrümanları olan nesnelerdir.
Argümanlı ve agrümansız yüklem örnekleri:
sahis(soyad, ad, cinsiyet). sahis yüklem; soyad, ad, cinsiyet ise bu yüklemin argümanlarıdır.
basla = argümanı olmayan yüklem
dogum_gunu(isim, soyisim, tarih). Dogum_gunu yüklem, isim, soyisim ve tarih nesneleri ise argümanlarıdır. Sınırlı olmakla beraber, bir yüklem argümansız olarak da kullanılabilir.
Değişkenler (Genel Cümleler)
Basit bir sorgulamada, sever(Kim, tenis) kuralını kullanarak kimin tenis oynamaktan hoşlandığı öğrenilebilir. Bu sorguda Kim, değişken olarak kullanılmıştır.
Prolog_ile_yazdigim_ilk_program 1.deneme
_14_10_1978_tarihinde_doganlar 14.program
_1_nolu_ogrenci “prolog”
Prolog’da Değişkenlerin Değer Alması
Diğer programlama dillerinde, değişkenlerin değer almalarına imkan tanıyan atama ifadeleri Prolog’da yoktur. Prolog’u diğer programlama dillerinden ayıran en önemli özelliklerden biri de budur. Prologdaki değişkenler almaları gereken değerleri atamayla değil, gerçekler veya kurallardaki sabitlere eşleştirilirken alırlar.
Bir değişken, değer almadığı müddetçe serbest değişken olarak kalır. Fakat herhangi değer aldığı andan itibaren sınırlı hale gelir. Bu sınırlılık bir sorguya cevap almak için gerekli olan süre kadar sınırlı kalır. Bu işlem bittikten sonra değişken yeniden sınırlı hale gelir, program başa döner ve alternatif çözümler arar. Dolayısıyla bir değişkene bir değer vererek bilgi depolanamaz. Değişkenler bilgi depolamak için değil, kalıp-eşleştirme ve işlemenin bir parçası olarak kullanılır.
PREDICATES
nondeterm sever(symbol, symbol)
CLAUSES
sever(oktay, okuma).
sever(yavuz, bilgisayar).
sever(orhan, tavla).
sever(vedat, uyuma).
sever(ismail, yuzme).
sever(ismail, okuma).
Hem okuma hem de yüzmeden kimin hoşlandığı sorusuna cevap aramak için şu sorguyu kullanılır.
GOAL sever(Sahis, okuma), sever(Sahis, yuzme).
Prolog bu kuralı çözmek ve önce sever(Sahis, okuma) kısmının doğru olup olmadığını bulmak için bütün gerçekleri baştan sonra kadar inceler. Çözüm bulunmadan önce Sahis değişkeninin değeri yoktur, yani serbesttir. Öte yandan okuma kısmı bilinmektedir. İlk sever(oktay, okuma) gerçeğindeki okuma kısmı sorguya uyduğu için Sahis ‘oktay’ değerini alır. Prolog aynı zamanda aşağıya doğru nereye kadar tarama yaptığını göstermek için kuralın başıyla eşleşen ilk noktaya bir ‘pointer’ koymaktadır.
Sorgunun ilk kısmı doğrulandıktan sonra ikinci kısmının da doğrulanması gerekir. Yani yüzmeden hoşlanan kişinin de bulunması gerekir. Sahis değişkeni ‘oktay’ değeri aldığı için artık sever(oktay, yuzme) gerçeğinin doğru olup olmadığı araştırılır. Gerçekler incelenirse, ‘oktay’ isimli şahsın yüzmeden hoşlanmadığı görülür. Bu durumda Prolog Sahis değişkenine atadığı ‘oktay’ değerini etkisiz hale getirir ve Sahis yeniden serbest hale gelir. Kuralın ilk kısmını doğrulayan gerçeği bulmak için Prolog bu kez kuralların başından değil, gerçekler listesine daha önce yerleştirmiş olduğu pointer’den aşağıya kadar doğru taramaya başlar. İlk gerçek gereken şartları sağlayamadığı için artık dikkate alınmaz. Bu işleme Geriye İz Sürme denir.
Yapılan taramada okumadan hoşlanan kişinin ismail olduğu görülünce Sahis değişkeni bu kez ‘ismail’ değerini alır. Kuralın ikinci kısmının doğrulanması için tarama yapılırsa, yüzme için gereken şartın yine ‘ismail’ ile sağlandığı görülür. Dolayısıyla Prolog’un vereceği cevap şu olur:
Sahis=ismail
1 Solution
Anonim Değişkenler
Anonim değişkenler, programların gereksiz bilgi ve satırlarla karmaşık hale gelmelerini engeller. Böylece bir sorgulamadan beklenilen bilgileri alabilir ve ihtiyaç olmayan değerler iptal edilmiş olur. Prolog’da anonim değişkenler ‘_’ ile gösterilir.
Aşağıdaki örnekte anonim değişkenin kullanımı verilmiştir:
PREDICATES
erkek(symbol)
bayan(symbol)
nondeterm ebeveyn(symbol, symbol)
CLAUSES
erkek(selahattin).
erkek(cihat).
bayan(sacide).
bayan(sezen).
ebeveyn(selehattin, cihat).
ebeveyn(sacide, cihat).
ebeveyn(selehattin, sezen).
GOAL ebeveyn(Ebeveyn,_).
Diğer değişkenlerin yerine kullanılabilen anonim değişkenlerin, normal değişkenlerden tek farkları şudur: anonim değişkenler hiçbir zaman bir değere eşitlenemezler.
Yukarıdaki örnek yazdıktan sonra GOAL ebeveyn(Ebeveyn,_) sorgusu çalıştırılarak, ebeveyn olan kişilerin isimleri öğrenilebilir. Çocukların isimleri istenmediği için isimlerinin yerine anonim değişken kullanılmıştır.
Programın sonucunda şu sonuç görüntülenir:
Ebeveyn=selehattin /*Cihat’ın ebeveyni */
Ebeveyn=sacide /* Cihat’ın ebeveyni*/
Ebeveyn=selehattin /* Sezen’in ebeveyni*/
2 solutions
Tanımlanan değişken anonim olduğu için, alınacak cevabın ikinci argümanla bağlantısı olmayacaktır. Anonim değişkenler, gerçeklerin tanımlanmasında da kullanılabilir.
vardir(_,televizyon).
yemek_yer(_).
İfadeleri konuşma dilinde “Herkesin televizyonu var” ve “Herkes yemek yer” olarak çevrilebilir.
Birleşik bir hedefin çözümünü bulmak için her iki alt hedefin doğru olması gerekir. Bu durumda, iki alt hedef arasında (ve) anlamına gelen ‘,’ kullanılır. Fakat istenilen durumlarda alt hedeflerden sadece birinin doğru olması şartı da aranabilir. Bu durumda alt hedefler arasında (veya) anlamına gelen ‘;’ kullanılması gerekir. Bu duruma Ayırma işlemi denilmektedir.
Şimdi bu durumu gösteren bir örnek inceleyelim:
PREDICATES
nondeterm araba(symbol,long,integer,symbol,long)
nondeterm kamyon(symbol,long,integer,symbol,long)
nondeterm arac(symbol,long,integer,symbol,long)
CLAUSES
araba(chrysler,130000,3,kirmizi,12000).
araba(ford,90000,4,gri,25000).
araba(datsun,8000,1,kirmizi,30000).
kamyon(ford,80000,6,mavi,8000).
kamyon(datsun,50000,5,sari,20000).
kamyon(toyota,25000,2,siyah,25000).
arac(Marka,Kilometresi,Yas,Renk,Fiyat):-
araba(Marka,Kilometresi,Yas,Renk,Fiyat);
kamyon(Marka,Kilometresi,Yas,Renk,Fiyat).
GOAL araba(Marka, Kilometresi, Kullanim_Suresi, Renk, 25000).
Bu örnekteki hedef, cümleciklerde tarif edilen 25000 dolarlık arabayı bulur. Benzer şekilde; fiyatı 25.000 dolardan daha az olan bir araba var mı? şeklindeki bir soruya cevap bulmak da mümkündür. Bunun için araba(Marka, Kilometresi, Kullanim_Suresi, Renk, Fiyat), Fiyat< 25000 şeklindeki bir sorguyla bu sorunun cevabını bulmak mümkündür. Bu kuralı sorgulandığında, alınacak cevap chrysler olacaktır.
Şimdi ‘fiyatı 25.000 dolardan az olan bir araba veya fiyatı 20.000 dolardan daha az olan bir kamyon var mıdır?’ şeklindeki bir soruya uygun bir hedef yazalım:
araba(Marka, Kilometresi, Kullanim_Suresi, Renk, Fiyat), Fiyat< 25000; kamyon (Marka, Kilometresi, Kullanim_Suresi, Renk, Fiyat), Fiyat< 20000.
Prolog ilk önce fiyatı 25.000 dolardan daha az olan bir araba olup olmadığını araştırır. Sonuç doğru olsun veya olmasın, ikinci alt hedef de araştırılır. Her ikisinden birinin doğru olması durumunda alınacak cevap olumlu olacaktır. Hedefin doğrulanması için birden fazla alt hedefin aynı anda doğru olması gerekmez. Bu tür hedeflere ayrıştırma denilmektedir ve bunun için alt hedefler arasında ‘;’ ayracı kullanılmaktadır.
Eşleştirme
Prolog’da eşleştirme yapılırken eşlenik yapılar birbiriyle eşleşebilir. ebeveyn(selehattin, X), ebeveyn(sacide, cihat) kuralındaki X değişkeni ‘cihat’ değerini alır ve serbest olan bu değişken artık bağlı hale gelir. Bağlı hale gelen başka bir değişkene atanırsa, diğer değişken de aynı değeri alır.
Bölüm özeti
1. Prolog’da bir program gerçekler ve kurallardan oluşan cümleciklerden oluşur.
· Gerçekler, doğru oldukları kabul edilen ilişkiler ve özelliklerdir.
· Kurallar bağımlı ilişkiler olup, gerçekler ve ilişkileri kullanarak bilgi elde etmeye yararlar.
2. Gerçeklerin genel yazılış biçimi şöyledir:
ozellik(nesne1, nesne2,..... nesneN)
veya
ilişki(nesne1, nesne2,..... nesneN)
Burada özellik nesnelerin herhangi bir özelliği, ilişki ise nesneler arasındaki herhangi bir ilişkidir. Özellik ve ilişki kelimelerinin her ikisi de Prolog’da aynı anlamda kullanılır.
3. Bir programda verilen bir ilişki bir veya daha fazla nesne arasındaki ilişkiden ibarettir. sevmek(ahmet, futbol) gerçeğindeki ‘sevmek’ bir ilişkiyi, ahmet ve futbol ise bu ilişkinin nesnelerini temsil eder. solak(hasan) gerçeğinde ‘solak’ bir özelik, hasan ise bir nesnedir.
4. Kuralların genel yazılma şekli:
Baş:-Gövde
olup, daha açık hali aşağıdaki gibidir.
ilişki(nesne, nesne, ....., nesne) :-
ilişki(nesne, nesne, ..., nesne),
.
.
ilişki(nesne, nesne, ...., nesne).
5. İlişki ve nesne isimlerinin yazılması bazı kurallara bağlıdır. Nesne ve ilişki isimleri daima küçük harfle başlar. Bunu takiben istenilen sayıda büyük-küçük harf, rakam, ‘_’ kullanılabilir.
6. Değişken isimleri daima büyük bir harf veya ‘_’ ile başlar. Bunu takiben istenildiği kadar küçük_büyük harf, rakam vs. kullanılabilir. Değişkenler bir değer almadan önce serbest, değer aldıktan sonra ise bağlı hale gelirler. Bir değişkene değer atayıp bilgi depolamak mümkün değildir. Çünkü bir değişken sadece bir cümlecikte bağımlıdır.
7. Bir sorgudan sadece belirli bir bilgi alınmak isteniyorsa, anonim değişken (_) kullanılabilir. Anonim değişkene hiçbir zaman değer atanması yapılamaz.
8. Prolog’a programda verilen gerçeklere göre bir soru sormak Prolog Sistemini Sorgulama olarak adlandırılır ve bu sorguya Hedef denir.
Bileşik bir hedef iki veya daha fazla hedeften oluşur. Bu parçaların her birine alt hedef adı verilir. Bileşik hedefler Bağlaç veya Ayraç şeklinde olabilir.
10. Eşleştirme birbirine denk yapılar arasında gerçekleştirilir. Serbest bir değişken bir sabite veya önceden değer alıp bağımlı hale gelmiş başka bir değişkene atanabilir. Serbest olan iki değişken birbirine atanırsa, birinin alacağı değer otomatik olarak diğerine atanmış olur.
VISUAL PROLOG PROGRAMLARININ TEMEL BÖLÜMLERİ
Bir VIP Programı genelde şu dört bölümden oluşur: Clauses (Gerçekler ve Kurallar), Predicates (Yüklemler), Domains (Değişken Tipleri) ve Goals(Hedefler).
Clauses(Olgular veya Kurallar)
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 clauselar kümesine Procedure denir.
Predicates (Yüklemler)
Yüklemlerin ve yüklemlerdeki argümanların tiplerinin tanımlandığı yer bu bölümdür. Visual Prolog’da mevcut olan hazır yüklemlerin tanımlanması gerekmez.
Domains (Değişken Tipleri)
Burada, Visual Prolog’da olmayan tiplerin tanımlanması yapılır.
Goal (Hedef)
Programdaki sorgular buraya yazılır.
Yüklem Tanımı
Bir yüklemin genel yazılış biçimi şöyledir:
yuklem_adi(argüman_tip1, argüman_tip2, argüman_tip3,...., argüman_tipN)
Yüklemlerin bitiş parantezinin clauses bölümündeki gibi ‘.’ ile sonlanmadığına dikkat edilmelidir. Yüklem isimleri en fazla 250 karakterten oluşabilir ve herhangi bir harfle başlayabilir.
Geçerli Yüklem İsimleri Geçersiz Yüklem İsimleri
Olgu [olgu]
Oynar *gider*
sahip_olunan_servet Sahiptir/araba
tahakkuk_fisi bu-ayin-bordrosu
10_kisilik_sinif <10-kisiden_biri
Örnekler:
domains
isim=symbol
numara=integer
predicates
ilk_yuklem(isim, numara)
domains
sahis, eylem=symbol
araba, marka, renk=symbol
kilometresi, kullanim_yili, fiyat=integer
predicates
sever(sahis, eylem)
ebeveyn(sahis, sahis)
satin_alabilir(sahis, araba)
araba(marka, kilometresi, kullanim_suresi, renk, fiyat)
yesil(symbol)
derece(symbol, integer)
Yukarıdaki program parçasında yüklem ve argümanların anlamları aşağıda verilmiştir.
· sever yüklemi iki argüman alır: sahis ve eylem. Bu argümanların her ikisi de değer olarak symbol, yani alfabetik karakterler alabilir.
· ebeveyn yükleminin iki argümanı da sahis olup, domainde tanımladığı şekliyle symbol tipindedir.
· satin_alabilir yüklemi tipi symbol olan sahis ve araba argümanlarını almıştır.
· araba yüklemi 5 adet argüman almıştır. İlk ikisinin tipi symbol, son üçünün ise integer’dır (tamsayı).
· yesil yüklemi, tipi symbol olan tek bir argüman almıştır. Symbol tipi zaten Visal Prolog’un standart tipleri arasında yer aldığından, ayrıca tanımlamaya gerek yoktur.
· derece yükleminin argümanları da standart domain’de yer almaktadır.
Domains (Tip tanımları) Bölümü
Domain kısmında argümanların tipleri tanımlanır. Bir argüman alfabetik, nümerik veya her ikisinden oluşan karakterleri değer olarak alabilir. Domain kısmı, birbirinin aynısı gibi görünebilecek verilere farklı isimler vermemize imkan tanır. VIP programlarında ilişki veya gerçeklerde tanımlanmış olan nesneler (yüklemdeki argümanlar) domainlere aittir. Bu tipler standart olarak tanımlı olabileceği gibi, kullanıcı tarafından sonradan da tanımlanabilir.
Domain kısmı son derece faydalı iki görev icra eder. Birincisi, yüklemlerde tanımlanan argümanların tipleri VIP’de standart olarak tanımlamış olan symbol, tamsayı vs. domainleri olsalar bile, argümanlara farklı anlamlı isimler vermemize imkan tanır. İkincisi, standart domainler tarafından tanımlanmamış veri yapılarını tanımlanmasına imkan sağlar.
Ayrıca, yüklemdeki argümanların net olarak anlatılabilmesi için farklı domainler olarak tanımlanması da faydalıdır.
Örnekler:
1. Aşağıdaki tabii dil cümlesinin VIP’de 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 VIP’deki 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.
Özel domainler, argümanların anlamını çok daha iyi ifade ettikleri halde, bütün argümanlar için özel domain kullanmak gerekmez. Bir argüman için belli bir tip tanımlanması yapıldıktan sonra, bu argüman, tipi aynı olan bir başka argümanla hiçbir şekilde karıştırılmaz. Örneğin isim ve cinsiyet argümanlarının her ikisinin de tipi symbol olmasına rağmen birbiriyle karıştırılmazlar. Fakat kullanıcının tanımladığı argümanların hepsi önceden tanımlanmış argümanlarla karıştırılabilir.
Aşağıdaki örnek, çalıştırıldığı zaman bir tip hatası verir.
DOMAINS
carpma, toplam = integer
PREDICATES
toplama_yap(toplam, toplam, toplam)
carpma_yap(carpma, carpma, carpma)
CLAUSES
toplama_yap(X, Y, Toplam):-
Toplam=X+Y.
carpma_yap(X, Y, Carpma):-
Carpma=X*Y.
GOAL toplama_yap(32, 54, Toplam).
Buradaki GOAL toplama_yap(32, 54, Toplam) doğru çalışır ve
Toplam=86
1 Solution
cevabı alınır. Carpma_yap fonksiyonu için 35 ve 25 değerlerleri kullanılırsa,
Carpma=875
1 Solution
sonucu alnır.
31 ve 17 sayılarının çarpımını bulup, elde edilen sayıyı kendisiyle toplayıp Cevap argümanının değeri aşağıdaki şekilde bulunur.
carpma_yap(31, 17, Toplam), toplama_yap(Toplam, Toplam, Cevap) şeklinde bir hedef yazılabilir. Bu hedefe göre, bulunacak sonucun
Toplam=527 (31*17), Cevap=1054 (527+527)
olması gerekirken, VIP derleyici bir hata mesajı verir. Çünkü carpma_yap fonksiyonundaki Toplam argümanı 527 değerini aldıktan sonra bu değeri ikinci yüklem olan toplama_yap’taki ilk iki argümana taşımaya çalışır. Her iki argüman da tamsayı tipinde olmasına rağmen farklı isimlerde olduklarından, birbirleriyle eşleştirilemezler ve neticede hata mesajı görüntülenir. Bu yüzden bir cümledeki fonksiyonda tanımlanan değişken birden fazla fonksiyonda kullanılacaksa, her fonksiyonda aynı şekilde tanımlanmalıdır.
Örnek:
DOMAINS
marka, renk = symbol
yas=byte
fiyat, yol=ulong
PREDICATES
nondeterm araba(marka, yol, yas, renk, fiyat)
CLAUSES
araba(chrysler,130000,3,kirmizi,12000).
araba(ford,90000,4,gri,25000).
araba(datsun,8000,1,siyah,30000).
GOAL araba(renault, 13, 40000, kirmizi,12000).
GOAL araba(ford, 90000, gri, 4, 25000).
GOAL araba(1, kirmizi, 30000, 80000, datsun).
Burada araba yükleminin 5 argümanı mevcuttur. Yas argümanı byte tipinde olduğu için alabileceği değer 8 bitlik ve 0-255 arasında değişen pozitif bir sayıdır. Aynı şekilde yol ve fiyat tipleri ulong (uzun tamsayı) olup 32-bit pozitif tamsayı değerleri alır. Son olarak marka ve renk tipleri symbol tipindedir. Yukarıdaki sorguları tek tek deneyince her birinin ayrı bir tip hatasına neden olduğu görülecektir. GOAL araba(renault, 13, 40000, kirmizi, 12000) sorgusunda byte tipinde olması gereken yas argümanı 40000 değerini almıştır. Bunun 0-255 arasında olması gerekir. İkinci sorguda yas ve renk argümanlarının değerleri yer değiştirmiştir. Bu nedenle yine hataya neden olur.
2. PROLOG PROGRAMLARININ TEMEL BOLUMLERİ
Bir prolog programı genel olarak 4 bölümden oluşur.
1- Clauses
2- Predicates
3- Domains
4- Goal
1-Clauses(Olgular veya Kurallar): Bu bölüm programın kalbi durumundadır.Tanımlı hedefler doğrulanmaya çalışılırken 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 clause lar kümesine procedure denir.
2-Predicates(Yüklemler): Yüklemlerin ve argümanların tiplerinin tanımlandığı bölümdür. Prologda hazır yüklemlerin tanımlanması gerekmez.
3-Domains(Değişken Tipleri): Burada Prolog da olmayan değişken tiplerinin tanımlanması yapılır.
4-Goal(Hedef): Programdaki sorgular buraya yazılır.
Yüklemlerin Tanımlanması:
Yüklemler en fazla 250 karakterden oluşur ve herhangi bir harfle başlayabilir. Küçük harf kullanılması tercih edilir çünkü derleyicilerin çoğu küçük harfle başlayan yüklem isimlerini kabul etmektedir. Bir yüklemin genel yazılışı şöyledir.
yüklem_adi:(argüman_tip1,argüman_tip2,......,argüman_tipN)
Bitiş parantezleri clauses daki gibi ‘.’ Nokta ile sonlanmaz.
Kullanılabilecek karakterler:
Büyük harfler: A..Z
Küçük harfler: a..z
Rakamlar: 0..9
Alt çizgi: ‘_’
Örnek:
Domains
isim=symbol
numara=integer
ilk_yuklem(isim_numara)
İlk_yuklem yüklemi tipleri symbol ve integer olan iki arguman almıştır.
Domains(Tip Tanımları) Bölümü:
Bu kısımda argümanların tipleri tanımlanır. Bir argüman alfabetik, nümerik veya her ikisinden de oluşan karakterleri değer alabilir. Bu kısım birbirinin aynı gibi görülen verilere farklı isim vermemize imkan tanır. Prolog programlarında yüklemlerdeki argümanlar domainlere aittir. Bunlar standart olarak tanımlanabileceği gibi sonradan da kullanıcı tarafından tanımlanabilir.
Domain kısmı son derece faydalı iki görev icra eder. Birincisi yüklemlerde tanımlanan tipleri standart olarak tanımlanmış olan symbol, integer gibi domainler olsa bile bunlara bunlara farklı anlamlı isimler verebiliriz.
İkincisi ise standart domainlerden oluşan veri yapılaını tanımlayabilmemizi sağlar.
Ayrıca yüklemlerdeki net olarak anltılabilmesi için farklı domainler olarak tanımlanması faydalıdır.
Örnek: Hasan 28 yaşında bir erkektir cümlesi prologda yazılmak istenirse
Sahis(symbol,symbol,integer)
Şeklinde argüman yollamak argümanların ne iş yaptığını anlamamızı zorlaştırır.Ancak:
domains
isim,cinsiyet=symbol
yas =integer
predicates
sahis(isim,cinsiyet,yas)
şeklinde tanımlanan argümanalr karışıklığı önler ve tip hatalarının oluşmasına engel olur.
Bir argüman için belli bir tip tanımlanması yapıldıktan sonra bu argüman tipi aynı olan başka bir argümanla kesinlikle karşılaştırılamaz.
Örnek:
domains
carpma,toplam=integer
predicates
toplama_yap(toplam,toplam,toplam)
carpma_yap(carpma,carpma,carpma)
clauses
toplama_yap(toplam,toplam,toplam):-
toplam=X+Y.
carpma_yap(X,Y,carpma):-
carpma=X*Y.
Bu tanımlamalara göre31 ve 17 sayılarını çarpıp sonucu kendisiyle toplamak istersek
carpma_yap(31,17,toplam),toplama_yap(toplam,toplam,cevap)
şeklinde bir hedef yapılabilir. Bu hedefe göre:31*17=527 ve 527+527=1054 bulunması gerekir.Ancak derleme yapmak istersek hata oluşacaktır.Çünkü toplam argümanı527 değerini aldıktan sonra bu değeri toplama_yap taki ilk iki argümana atmaya çalışır. Ancak her iki argümanda tam sayı olmasına ragmen farklı isimlerde olduklarından dolayı birbirleriyle eşleştirilemezler ve hata oluşur. Bu yüzden bir cümledeki fonksiyonda tanımlanan değişken birden fazla fonksiyonda kullanılacaksa her fonksiyonda aynı şekilde tanımlanmalıdır.
Goal Bölümü:
Bu bölümün bir kuralın yapısından sedece iki farkı vardır.
1- Goal kelimesinden sonra if anlamındaki :- operatörü kullanılamaz.
2- Program çalışırken ilk bu satır çalışır.
Deklerasyon ve Kurallara Ayrıntılı Bakış:
Bir yüklemdeki argümanların tipleri tanımlanırken Prolog da ki hazır tipler kullanılabilir. Bu tiplerin domains kısmında tanımlanması gerekmez. Aşağıda hazır olarak bulunan tipler verilmiştir.
Tip Kulanıldığı Yer Boyut Değer Aralığı
Short Bütün platformlar 16 Bit -32768..+32767
Ushort Bütün platformlar 16 Bit 0..65535
Long Bütün platformlar 32 Bit -2147483648..+2147483648
Ulong Bütün platformlar 32 Bit 0..+4294967295
İnteger 16 ve 32 Bit platformlar 16 Bit -32768..+23767 ve
32 Bit -2147483648..+2147483648
unsigned 16 ve 32 Bit platformlar 16 Bit 0..65535 ve
32 Bit 0..+4294967295
byte Bütün platformlar 8 Bit 0..255
word Bütün platformlar 16 Bit 0..65535
dword Bütün platformlar 32 Bit 0..+4294967295
Integer ve unsigned tipler bilgisayar ve sisteme göre değişken arlıkta değer alabilirler.
Char: İşaretsiz 1 byte olarak kullnılır ‘A’, ‘b’ gibi.
Real: +/- DDDD.DDDD şeklinde 8 bitlik bir değişken
String: 255 karakter uzunluğundadır iki formatı vardır.
a) İlki küçük harf olmak üzere harf, sayı ve alt çizgiden oluşur.
Örnek: adı_soyadı
b) Çift tırnak arasına alınmış karakterlerden oluşur.
Örnek: “Müşterinin Adı”
Symbol: Formatı stringler ile aynıdır. Ancak stringlerden farklı depolanır. Symbol tipleri bir tabloda saklanır. Adresleri ise nesneleri temsil edecek şekilde saklanır. Bu nedenle eşleştirme işleminde hızlı kullanılırlar. Stringler ise karakter baznda eşleştirilir.
Yüklemlerdeki Argümanların yazılması:
Hasan 28 yaşında olan bir erkektir=sahis(hasan,erkek,28)
Sahisi bu argümanlarla bilikte kullanılan bir yüklem olarak tanımlamak için aşağıdaki satırın predicates kısmında tanımlanması gerekir.
Sahis(symbol,symbol,unsigned)
Bu yüklem 2 symbol ve 1 unsigned olmak üzere 3 tip argümanla kullanılabilir.
Örnek:
DOMAINS
adi_soyadi,tel_no=symbol
PREDICATES
nondeterm telefon_numarasi(adi_soyadi,tel_no)
CLAUSES
telefon_numarasi(“Orhan AYDIN”,”255 45 47”).
telefon_numarasi(“Arif GÜREL”,”3134578”).
.
.
.
.
GOAL telefon_numarasi(Kimin_telefonu,”313 45 78”).
Bu program yeni telefonlar eklenerek çalıştırılabilir.
Kuralların Yazım Biçimi:
Prolog da kurallar baş ve gövde olmak üzere iki kısımdan oluşur.
Genel biçim:
Baş:-<alt_hedef1>,<alt_hedef2>,.......,<alt_hedefN>
Alt hedeflerin her biri ayrı bir yüklem çağırır. Sonuçlar kontrol edilir. Sonuca bakılmaksızın bütün hedeflere uygulanır. Hedeflerin tamamı olumlu netice verirse sonuç doğrulamış olur. Eğer bir hedef bile yanlış olursa bütün kural yanlış olur.
Prolog ve Diğer Dillerdeki ‘if’ Komutunun Karşılaştırılması:
Genelde programlarda if komutundan sonraki şartın doğruluğunu kontrol eder ve doğruysa then den sonraki kısmı uygular yanlışsa bu kısmı atlar. Prolog da ise gövdedeki alt hedeflerin doğruluğuna bakılır. Olumlu sonuç verirse kuralın gövde kısmının doğruluğu ispatlanmış olur. Bu Prolog da then/if şartının geçerli olduğunu gösterir.
Otomatik Tip Dönüştürmeler:
Prolog da değişkenler değişik tipteki sabit değişkenlere atanabilir. Çünkü Prolog aşağıdaki tiple arasında otomatik olarak tip dönüştürmesi yapar.
*String ve symbol
*Bütün integral ve reel tipler. Bir karakter sayısal değere dönüştürülürken ASCII karşılığı alınır.
Bener şekilde integer bir tip real, char, word etc. İle uyumludur. Bu uyumluluk şu kolaylıklar sağlar.
*String tipinde tanımlı bir yüklem symbol tipinde bir argümanla çağrılabilir.
*Real tipinde tanımlı bir yüklem integer tipinde bir argümanla çağrılabilir.
*Char tipinde tanımlı bir yüklem integer tipinde bir argümanla çağrılabilir.
*Alfabetik karakterler ASCII değerleri bilinmeden de kullanılabilir.
Bir Prolog programında bu bölümlerin haricinde database, constants ve global bölümleri bulunabilir.
Database Bölümü:
Bir programda gerçekler ve kurallar değiştirilmek istenirse dinamik, dahili bir veritabanı oluşturulur. Program çalışırken değiştirilebilecek gerçeklerin tanımlı olduğu böüm database bölümüdür.
Constants Bölümü:
Diğer dillerde olduğu gibi Prologda da sabit değişkenler kullanılabilir. Bu değişkenler Bu değişkenler constants bölümünde tanımlanır ancak her satıra sadece tek bir sabit yazılabilir.
Örnek:
Constants
yuz=(10*(10-1)+10)
pi=3.141592654
Program çalışırken yuz sabiti yerine 100 değil (10*(10-1)+10) değeri atanır.
Sembolik sabitlerin yazımında şu kurallar geçerlidir.
*Sabit bir değişken kendini çağıramaz. Yani sayi=2*sayi/2 yanlıştır.
*Büyük harfle tanımlanan değişkenler farklı işlem görmezler.Bu değişkenler clause veya goal bölümünde yine küçük harfle yazılmalıdır.
*Bir program da birden fazla constans bölümü olabilir.
*Constants bölümünde tanımlanan sabitler program sonuna kadar değişmezler.
Global Bölümü:
Şu ana kadar gördüğümüz bütün bölümler local idi.Bunları global olarak kullanmak için global domains, global predicates bölümler oluşturulabilir.
Derleyici direktifleri :
Prolog, bir program parçasının derleme sırasında belirtilen şekilde işlem görmesi için bazı direktiflerin kullanılmasına izin verir.
İnclude Direktifi:
Bu direktif daha önce yazılan bir program parçasının veya procedure ün her çağrıldığında aynı program içerisinde tekrar tekrar kullanılmasını sağlar. Herhangi bir programda çağrılan bir direktif derlenerek o programa ilave edilir. Bir programda bir dosya sadece bir kez kullanılabilir.
BÖLÜM ÖZETİ
1- Bir prolog programının genel yapısı şöyledir:
domains
argüman1....argümanN=tip
predicates
yüklem_ismi(argüman1,....,argümanN)
clauses
kurallar ve gerçekler
GOAL
alt_hedef1,alt_hedef2,.....,alt_hedefN
2- Domains bölümünde değişken tipleri tanımlanır.
3- Yazılmış gerçek ve kuralları inceleyerek doğruluğunun sağlanması istenilen GOAL(sorgu), programının içine yazılması gerekir.
4- Aynı isimde farklı argüman taşıyan yüklemler farklı yüklemler gibi işlem görür.
5- Kurallar:
Baş:-alt_hedef1......alt_hedefN
Şekliyle yazılır.
6- Prologda ki ‘if’ komutu diğer dillerdekinden farklıdır.if/then yerine then/if şeklinde tanımlanır.
Hiç yorum yok:
Yorum Gönder