Prolog Programlama Dili Hafta_7 Prolog Programlama Dili
Prolog Programlama Dili Prolog = “PROgramming in LOGic” Prolog mantıksal ve dekleratif (bildirgesel) bir programlama dilidir. Prosedürel programlamada adım adım ne yapılması gerektiği kodlanır. (Ör: C, Pascal, Java vs.) Dekleratif programlamada bir durum tanımlanır. Bu tanıma göre yorumlayıcı ya da derleyici bir çözüm üretir. Prolog kodları bir yorumlayıcı tarafından yorumlanarak sonuç elde edilir; Tamamen mantık tabanlıdır bir dildir. Problem çözümü için mantıklı bir çözüm bulunur ve problem çözülür.
Prolog Programlama Dili Problemlerin çözümünü tanımlama yerine çıkarım yapılır. Doğal dille düşünülen şeylerin kodlanması kolaydır. Gerçekler ve kurallardan oluşur. Büyük - küçük harfe duyarlıdır. Sabitler için Küçük harfler, Değişkenler için Büyük harfler kullanılır. (değişkenler daima büyük harf veya bir ‘_’ ile başlar.) Program çıktıları çok sadedir.
Prolog Programlama Dili PROLOG Programlama Dilinde Olmayan Özellikler: Aşağıdaki maddeler Prosedürel Programlama Dillerinde bu yapılar vardır aksine PROLOG' da yoktur ve bu yapıların olmaması işleri zorlaştırmaz. For döngüleri Repeat While döngüleri IF..THEN yapısı Go to komutu Diziler öz yinelemeli fonksiyonlarla yukarıdakiler sağlanabilir
Prolog Programlama Dili 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 Gerçekler (Facts), Kurallar (Rules) ve Sorgular (Queries) olmak üzere 3 yapıdan oluşur. Gerçekler, koşulsuz olarak doğru olan "şeyleri" tanımlar. Kurallar, koşullara bağlı olarak doğru olan "şeyleri" tanımlar. Sorgular, kullanıcının veri tabanını sorgulamak için kurduğu cümlelerdir.
Prolog Programlama Dili Prolog ile program yazarken, ilk önce nesneler ve bu nesneler arasındaki ilişkiler tanımlanır. Prolog mantığında bir ilişki, bu ilişkinin ismi ve bunu takiben parantez içinde yazılan nesne veya nesnelerden oluşan basit ifadelerle özetlenir. ‘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. Konuşma Dili Prolog’daki Karşılığı 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 Programlama Dili Yaşar Emel’i sever. Emel Cemal’i sever. Yaşar kedileri sever. Prolog’daki karşılıkları: sever(yasar, emel). sever(emel, cemal). sever(yasar, kediler). sever : ilişkinin ismi yasar ve emel : ilişkinin nesneleri (atomlar) . : sonlandırıcı
Prolog Programlama Dili Aile Ağacı parent(pam, bob). parent(tom, bob). parent(tom, liz). parent(bob, ann). parent(bob, pat). parent(pat,jim).
Prolog Programlama Dili Yaşar, Emel’in sevdiği her şeyi sever. Haluk kırmızı olan her şeyi sever. Prolog’daki karşılıkları: sever(yasar, hersey):-sever(emel, hersey). sever(haluk, hersey):- kirmizi(hersey). :- sembolü, prosedürel dillerdeki if(eğer) anlamında olup, bir kuralın iki parçasını birleştirir.
Prolog Programlama Dili Prolog Sorguları: Prolog’a bazı gerçekler tanıtıldıktan sonra, artık bu gerçeklerle ilgili sorular sormaya başlanabilir. ?- iliski(a,b). a ve b arasında iliski isminde bir ilişki var mı? cevap YES yada NO ?- iliski(A,b). b ile iliski adlı ilişkiyi doğrulayan A lar nelerdir? cevap varsa A lar yoksa NO A: değişken a, b: atom (sabit) (değişkenler daima büyük harf veya bir ‘_’ ile başlar.)
Prolog Programlama Dili İlişkileri sorgulamak Bob, Pat’in ebeveyni mi? ?- parent(bob, pat). yes Tom, Ben’in ebeveyni mi? : ?- parent(tom, ben). no
Prolog Programlama Dili İlişkileri sorgulamak Liz’in ebeveyni kimdir? ?- ebeveyn(Kim, liz). Prolog’un cevabı : Kim = tom Bob’un çocukları kimlerdir? ?- ebeveyn(bob, Cocuk). Cocuk = ann ; Cocuk = pat ; no
Prolog Programlama Dili İlişkileri sorgulamak Kimler kimlerin çocuğudur? ?- ebeveyn (Ebeveyn, Cocuk). Ebeveyn = pam Cocuk = bob; Ebeveyn = tom Cocuk = liz; … Çözümler listesini yarıda kesmek için enter Devam ettirmek için ;
Prolog Programlama Dili İlişkileri sorgulamak Jim’in büyük ebeveyni (grandparent) kimdir? Bilgi tabanında büyük ebeveyn diye bir ilişki tanımlı değil. Büyük ebeveyn ilişkisi iki ebeveyn ilişkisinin «ve» lenmesiyle elde edilebilir. ?- parent(Y, jim), parent(X, Y). X=bob Y=pat
Prolog Programlama Dili İlişkileri sorgulamak Torun ilişkisi de benzer biçimde tanımlanabilir. tom, X’in ebeveyni, X, Y’nin ebeveyni ise Y, tom’un torunudur. ?- parent(tom,X), parent(X, Y). X=bob Y=ann; Y=pat; no
Prolog Programlama Dili Çocuk ilişkisi parent(pam, bob). parent(tom, bob). parent(tom, liz). parent(bob, ann). parent(bob, pat). parent(pat, jim). offspring(bob, pam). offspring(bob, tom). offspring(liz, tom). offspring(ann, bob). offspring(pat, bob). offspring(jim, pat).
Prolog Programlama Dili Kurallar Kurallar iki parçadan oluşur: head : böyledir (sonuç, çıkarım) body : eğer
Prolog Programlama Dili Kuralların Çalışması Veritabanı: parent(pam, bob). parent(tom, bob). parent(tom, liz). parent(bob, ann). offspring(Y, X) :- parent(X, Y). Sorgu: offspring(liz, tom). Çalışma Mekanizması: offsprings ilişkisi için gerçek ara Yok => offsprings ilişkisi için kural varsa uygula Kuralda X tom’la , Y liz’le eşleştirilerek kuralın bir gerçeklemesi bulunur: offspring(liz,tom) :- parent(tom,liz). parents(tom,liz). gerçeği aranır. Bulunduğunda kuralın eğer kısmı doğrulandığından böyledir kısmı da doğrulanmış olur ve prolog “yes” cevabını verir
Prolog Programlama Dili Örnek: Anne ilişkisi Tüm X ve Y ler için, X, Y’nin annesidir Eğer X, Y’nin ebeveyni ise ve X kadınsa. İlişkinin Prolog’da ifadesi : mother(X, Y) :- parent(X, Y), female(X).
Prolog Programlama Dili Örnek: Kız kardeş ilişkisi Tüm X ve Y ler için, X, Y’nin kız kardeşidir Eğer X ve Y aynı ebeveyne sahip ise ve X bayansa İlişkinin Prolog’da ifadesi : sister(X, Y) :- parent(Z, X), parent(Z, Y), female(X). Sorgu: sister(X,pat).
Prolog Programlama Dili Örnek: Hala ilişkisi Tüm X ve Y ler için, X, Y’nin halasıdır Eğer Z, Y’nin ebeveyni ise ve Z, erkek ise ve X, Z’in kız kardeşi ise İlişkinin Prolog’da ifadesi : sister(X, Y) :- parent(Z, X), parent(Z, Y), female(X). hala(X,Y) :- parent(Z,Y), male(Z), sister(X,Z).
Prolog Programlama Dili Direkt Ata İlişkisi Tüm X ve Z ler için, X, Z’nin atasıdır eğer X, Z’nin ebeveyni ise Prolog ifadesi: predecessor(X, Z) :- parent(X, Z).
Dolaylı (Endirekt) Ata İlişkisi Prolog Programlama Dili Dolaylı (Endirekt) Ata İlişkisi
Prolog Programlama Dili Dolaylı Ata Programı predecessor(X,Z) :- parent(X,Z). predecessor(X,Z) :- parent(X,Y), parent(Y,Z). predecessor(X,Z) :- parent(X,Y1), parent(Y1,Y2), parent(Y2,Z). parent(Y2,Y3), parent(Y3, Z). … Problemleri: Uzun … Büyük büyük büyük … Ataları bulamaz.
Prolog Programlama Dili Yeni Ata Programı Çözüm: öz yineleme kullanmak Tüm X ve Z ler için, X, Z’nin Ata’sıdır Eğer Y diye bir kişi varsa ve (1) X, Y’nin ebeveyni ise ve (2) Y, Z’nin Ata’sı ise Prolog ifadesi: predecessor(X, Z) :- parent(X, Y), predecessor(Y, Z). 25
Prolog Programlama Dili Sonuç Ata İlişkisi parent(pam, bob). parent(tom, bob). parent(tom, liz). parent(bob, ann). parent(bob, pat). parent(pat,jim). predecessor(X, Z) :- parent(X, Z). predecessor(X, Z) :- parent(X, Y),predecessor(Y, Z). HEDEF / SORGU ?-predecessor(tom, pat). PR1 PR2 26
Prolog Programlama Dili Doğal Dil vs. Prolog Bütün çocuklar kısadır. kisa(X):-cocuk(X). Bütün erkek çocuklar arabaları sever. sever(X,araba):-erkek(X),cocuk(X). Bütün çocukların annesi vardır. var(X,anne):-cocuk(X). Sebzeyi hiçbir çocuk sevmez. sevmez(X,Y):-sebze(Y), cocuk(X). Çocuğunu döven öğretmeni hiçbir anne sevmez. sevmez(X,Y):-anne(X,Z),ogretmen(Y,Z),dover(Y,Z).
Prolog Programlama Dili Doğal Dil vs. Prolog Bütün insanlar canlıdır. Ahmet insandır. Dolayısıyla Ahmet canlıdır. canli(X):-insan(X). insan(ahmet). ?-canli(ahmet). Ahmet 20 metre zıplayabilir. Birisi X metreye zıplayabilirse daha azlarına da zıplayabilir. ziplar(ahmet,20). ziplar(X,Y):-ziplar(X,Z),Z>Y. ?-ziplar(ahmet,15). Kendi kalesine gol atan futbolcuyu kendi takımının taraftarları sevmez, karşı takımınkiler sever. sevmez(Y,X):- futbolcu(X), taraftar(Y), aynitakim(X,Y), kendikalesinegolatar(X). sever(Y,X):- futbolcu(X), taraftar(Y), karsitakim(X,Y), kendikalesinegolatar(X).
Prolog Programlama Dili SWI Prolog’la çalışmak SWI prolog kurulur. http://www.swi-prolog.org Gerçekler ve kurallar .pl uzantılı bir dosyaya kaydedilir.
Prolog Programlama Dili SWI Prolog’la çalışmak .pl uzantılı dosyanın üzerine çift tıklanarak
Prolog Programlama Dili Yada SWI prolog açıldıktan sonra file menüsünden dosya ‘consult’ edilerek
Prolog Programlama Dili Gerçek ve kurallar Prolog’a yüklenir. Artık sorgular komut satırından girilerek çalıştırılabilir.
Prolog Programlama Dili Prolog’da Veri Türleri Prolog bir veri türünü onun şeklinden tanır. Atom Sayı Değişken Prolog herhangi bir veri tanımına ihtiyaç duymaz. Sabitler gibi düşünülebilir
Prolog Programlama Dili Atomlar Atom’lar aşağıdakilerden oluşan string’lerdir. Büyük harf A, B, …, Z Küçük harf a, b, …, z Rakam 0, 1, …, 9 Özel karakterler + - * / < > = : . & _ ~
Prolog Programlama Dili Atomlar Atom’lar 3 farklı şekilde oluşturulabilir: Harf, rakam ve altçizgi (‘_’) den oluşan küçük harfle başlayan string’ler ile: anna nil x25 x_25AB x_ x___y alpha_beta_procedure sarah_jones
Prolog Programlama Dili Atomlar Özel karakterlerden oluşan string’ler ile: <---> ======> … .:. ::= Özel anlamı olan string’ler kullanılmamalı: :-
Prolog Programlama Dili Atomlar Tek tırnak (’) arasına alınan karakterler ile: ‘Tom’ ‘South_America’ ‘Sarah Jones’ Büyük harfle başlayan Atom’lar oluşturmak için kullanılabilir. Değişkenlerden bu şekilde ayrılabilirler.
Prolog Programlama Dili Sayılar Prolog’da iki tür sayı kullanılabilir Tamsayılar (integer) 1 0 -97 1313 En büyük ve en küçük sayı prolog derleyicisine bağlıdır. Ondalıklı sayılar (real) 3.14 100.2 -0.0035 Genelde tamsayılar kullanılır. Ondalıklı sayılar pek fazla kullanılmaz => Çünkü: topla(X,Y,Z):-Z is X+Y. ?- topla(2,0.3,C). C = 2.3 ; No ?- topla(200,0.0003,C). C = 200.0 ;
Prolog Programlama Dili Değişkenler Harf, rakam ve altçizgi (‘_’) den oluşan büyük harfle ya da altçizgi ile başlayan string’lerdir: X Result Object2 Participant_list ShoppingList _x23 _23
Prolog Programlama Dili Değişkenler Anonim değişken: isimlendirilmemiş değişkenlerdir. Sadece altçizgi ile ifade edilirler: hasachild(X) :- parent(X, Y). hasachild(X) :- parent(X, _). Her altçizgi karakteri yeni bir anonim değişkeni ifade eder. somebody_has_a_child :- parent(_, _). %r1 X Y Anonim değişkenlerin değerleri çıkış olarak verilmez. ?- parent(ali,Y). : ali’in çocuğu var mı? Ve varsa çocuklarının isimleri nedir? ?- parent(ali,_). : sadece ali’in çocuğu var mı?
Prolog Programlama Dili Değişken ve Atom’ların Faaliyet Alanları (Scope) Bir değişkenin değeri bir cümlecik içinde sabittir Bir atomun değeri tüm program boyunca sabittir
Prolog Programlama Dili Aşırı Yükleme Aynı isimde farklı ilişkiler olabilir: point(1, 1), point(1, 1, 1), point(1, 1, 1, 1), … +(X,Y,Z):-Z is X+Y. +(X,Y,Z,F):-F is X+Y+Z. ?- +(200,0.03,7.2,G). G = 207.23 ; No ?- +(200,0.03,G). G = 200.03 ;
Prolog Programlama Dili Ve , veya ; P :- Q; R. P doğrudur Eğer Q doğruysa veya R doğruysa Aynı ifadeyi aşağıdaki şekilde de yazabiliriz: P :- Q. P :- R.
Prolog Programlama Dili Ve , veya ; Ve, veya’dan daha yüksek önceliklidir. Aşağıdaki iki ifade aynı sonucu verir: P :- Q, R; S, T, U. P :- (Q, R); (S, T, U). Aynı ifadeyi aşağıdaki şekilde de yazabiliriz: P :- Q, R. P :- S, T, U.
Prolog Programlama Dili Hedefleri Birleştirme araba(chrysler,130000,3,kirmizi,12000). araba(ford,90000,4,gri,25000). araba(ferrari,30000,5,siyah,30000). kamyon(mercedes,10000,2,mavi,20000). kamyon(ford,50000,8,sari,28000). kamyon(volvo,35000,2,siyah,35000). arac(Marka,Kilometresi,Yas,Renk,Fiyat):- araba(Marka,Kilometresi,Yas,Renk,Fiyat); kamyon(Marka,Kilometresi,Yas,Renk,Fiyat). 45
Prolog Programlama Dili Fiyatı 25000’den az olan araçlar: ?- arac(Marka,KiloMetre,Yasi,Renk,Fiyat), Fiyat<25000. Marka = chrysler KiloMetre = 130000 Yasi = 3 Renk = kirmizi Fiyat = 12000 ; Marka = mercedes KiloMetre = 10000 Yasi = 2 Renk = mavi Fiyat = 20000 ; No 46
Prolog Programlama Dili Hedef Birleştirme Hasta mı? tahlil(ahmet,tahlil1,90). tahlil(ahmet,tahlil2,25). tahlil(ahmet,tahlil3,10). yuksektansiyon(X) :- (tahlil(X,tahlil1,Y),Y>100); (tahlil(X,tahlil2,Z),Z<30). kalphastasi(X) :- yuksektansiyon(X), tahlil(X,tahlil3,Q), Q<20. ?-kalphastasi(ahmet).
Turnuva oyuncu(ahmet,10). oyuncu(mehmet,12). oyuncu(ali,10). ?- oyuncu(B,10),oyuncu(B2,10),B\==B2. B = ahmet B2 = ali ; B2 = huseyin ; B = ali B2 = ahmet ; B = huseyin No oyuncu(ahmet,10). oyuncu(mehmet,12). oyuncu(ali,10). oyuncu(huseyin,10). 10 yaşındaki çocuklar arasında oynanabilecek maçlar nelerdir? Sayı ve string’ler arası Karşılaştırma : == eşit \== eşit değil
Prolog Programlama Dili Cümleciklerin ve Kuralların Sıralaması Kurallar ve cümleciklerin sırası değiştirilebilir Örneğin, Ata ilişkisi iki kuraldan oluşmakta ve ilişkilerden biri iki cümlecikten oluşmaktadır: predecessor(X, Y) :- parent(X, Y). predecessor(X, Z) :- parent(X, Y), predecessor(Y, Z). Olası versiyonlar: Cümleciklerin yerini değiştirerek, Kuralların yerini değiştirerek.
Prolog Programlama Dili Cümleciklerin ve Kuralların Sıralaması Orijinal Versiyon pred1(X, Z) :- parent(X, Z). pred1(X, Z) :- parent(X, Y), pred1( Y, Z). Versiyon a: Kuralların yerini değiştir pred2(X, Z) :- parent(X, Y), pred2( Y, Z). pred2(X, Z) :- parent(X, Z).
Prolog Programlama Dili Cümleciklerin ve Kuralların Sıralaması Versiyon b: İkinci kuraldaki cümleciklerin yerini değiştir pred3(X, Z) :- parent(X, Z). pred3(X, Z) :- pred3( X, Y), parent(Y, Z). Versiyon c: Hem kuralların hem cümleciklerin yerini değiştir pred4(X, Z) :- pred4( X, Y), parent(Y, Z). pred4(X, Z) :- parent(X, Z).
Prolog Programlama Dili 4 versiyonun verdiği cevaplar ?- pred1(tom, pat). yes ?- pred2(tom, pat). Yes ?- pred3(tom, pat). ?- pred4(tom, pat). Stack overflow!!!
Prolog Programlama Dili Aritmetik & Karşılaştırma +, -, *, /, mod is: hesaplamaya zorlamak (force) için: X = 1 + 2. X=1+2 X is 1 + 2. X=3 Karşılaştırma operatörleri X > Y büyük X < Y küçük X >= Y büyük veya eşit X =< Y küçük veya eşit X =:= Y eşit mi? X =\= Y farklı mı? 53
Prolog Programlama Dili X’den 1’e yaz yazdir(M):- not(M=0), write(M), write(' '), K is M-1, yazdir(K). yazdir(8). 8 7 6 5 4 3 2 1 No 54
Prolog Programlama Dili X kere h yaz hyaz(X):- not(X=0), Y is X-1, put(104), hyaz(Y). ?- hyaz(3). hhh No 55
Prolog Programlama Dili guc(X,Y,Z) XY=Z guc(X,1,X). guc(X,Y,Z):- Y>1, G is Y-1, guc(X,G,T), Z is X*T. ?- guc(3,4,G). G = 81 ; No
Prolog Programlama Dili fact(N,F) N!=F fact(0,1). fact(N,F) :- N>0, G is N-1, fact(G,T), F is N * T. ?- fact(5,E). E = 120 ; No
Prolog Programlama Dili topla(X,Y) Y = 1+2+...+X topla(1,1). topla(N,F) :- N>1, G is N-1, topla(G,T), F is N + T.