You are on page 1of 162

i

NDEKLER

1. GR........................................................................................................................1

2. PROLOGUN (PROGRAMMING IN LOGIC) TEMELLER................................3

2.1. Gerekler: Bilinen olgular..................................................................................4

2.2. Kurallar: Verilen Gereklerden Hkm karma..............................................4

2.3. Sorgulamalar: (Querries)...................................................................................5

2.4. Gerekler, Kurallar ve Sorgulamalarn Bir Araya Yazlmas.............................6

2.5. Deikenler: Genel Cmleler.............................................................................7

2.6. Blm zeti......................................................................................................7

2.7. Konuma Dilindeki Cmlelerin Prolog Programlarna Aktarlmas...................9

2.8. Cmleler (Gerekler ve Kurallar)......................................................................9

2.9. Olgular Arasndaki likiler: Yklemler (Predicates).......................................12

2.10. Deikenler (Genel Cmleler).......................................................................12

2.10.1. Prologda Deikenlerin Deer Almas..............................................12

2.11. Anonim Deikenler......................................................................................14

ii

2.12. Hedefler (Sorgular).......................................................................................15

2.13. Aklama Satrlar..........................................................................................16

2.14. Eletirme......................................................................................................17

2.15. Blm zeti...................................................................................................17

3. VISUAL PROLOG PROGRAMLARININ TEMEL BLMLER.....................19

3.1. Clauses(Olgular veya Kurallar)............................................................................19

3.2. Predicates (Yklemler).........................................................................................19

3.3. Domains (Deiken Tipleri).................................................................................19

3.4. Goal (Hedef)........................................................................................................19

3.5. Yklem Tanm.....................................................................................................19

3.6. Domains (Tip tanmlar) Blm.........................................................................21

3.7. Goal Blm........................................................................................................24

3.8. Deklarasyon ve Kurallara Ayrntl Bak.............................................................24

3.8.1. Char..............................................................................................................25

3.8.2. Real .............................................................................................................25

iii

3.8.3. String............................................................................................................25

3.8.4. Symbol..........................................................................................................25

3.9. Yklemlerdeki Argmanlarn Yazlmas...............................................................25

3.10. Kurallarn Yazm Biimi.....................................................................................28

3.11. Prolog ve Dier Dillerdeki if Komutunun Karlatrlmas ............................28

3.12. Otomatik Tip Dntrmeler.............................................................................28

3.13. Bir Programn Dier Blmleri..........................................................................29

3.13.1. Database Blm.......................................................................................29

3.13.2. Constants Blm......................................................................................30

3.13.3. Global Blm...........................................................................................31

3.14. Derleyici Direktifleri...........................................................................................31

3.14.1. Include Direktifi..........................................................................................31

3.15. Blm zeti ......................................................................................................31

4. ELETRME VE GERYE Z SRME..............................................................33

4.1. Geriye z Srme...................................................................................................34

iv

4.2. Geriye z Srme Mekanizmasnn Ayrntlar.......................................................38

4.2.1. Geriye z Srmenin 4 Temel Prensibi...........................................................39

4.3. Tarama leminin Kontrol Edilmesi......................................................................43

4.4. fail Ykleminin Kullanlmas................................................................................43

4.5. Geriye z Srmeyi Engelleme...............................................................................44

4.5.1. Cut Komutunun Kullanm............................................................................45

4.5.2. Geriye z Srmeyi Engelleme.......................................................................46

4.6. Determinism ve Cut.............................................................................................47

4.7. Not Yklemi.........................................................................................................48

4.8. Prosedrel Adan Prolog....................................................................................52

4.8.1. Kurallar ve Olgularn Prosedrlere Benzerlii..............................................52

4.8.2. Bir Kuraln Case ifadesi Gibi Kullanlmas....................................................53

4.8.3. Bir Kural inde Test Yapmak......................................................................54

4.8.4. Cut Komutunun Goto Gibi Kullanlmas......................................................54

4.9. Hesaplanm Deerleri Grntleme...................................................................55

5. BAST VE BLEK NESNELER.........................................................................57

5.1. Basit veri nesneleri...............................................................................................57

5.1.1 Veri Nesneleri Olan Deikenler...................................................................57

5.1.2. Veri Nesneleri Olan Sabitler.........................................................................57

5.1.3. Karakterler....................................................................................................57

5.1.4. Saylar...........................................................................................................58

5.1.5. Atomlar........................................................................................................58

5.2. Bileik Veri Nesneleri ve Fonksiyon Operatrleri................................................58

5.3. Bileik Nesnelerin Eletirilmesi...........................................................................59

5.4. Bileik Nesneleri Eletirmek in = Sembolnn Kullanlmas.........................59

5.5. Birden Fazla Nesneyi Tek Nesne Olarak Kullanmak...........................................60

5.6. Bileik Nesnelerin Tiplerini Tanmlamak..............................................................64

5.7. Tip Tanmlamalar zerine Ksa Bir zet............................................................65

5.8. oklu-Dzey Bileik Nesneler.............................................................................66

5.9. oklu-Tipli Argmanlar.......................................................................................66

vi

5.10. Listeler...............................................................................................................67

6. TEKRARLAMA VE REKRSYON....................................................................69

6.1. Tekrarl lemler...................................................................................................69

6.2. Geriye z Srme...................................................................................................69

6.3. nceki ve Sonraki Eylemler.................................................................................70

6.4. Dngl Geriye Dnn Uygulanmas...............................................................72

6.5. Rekursif Prosedrler............................................................................................73

6.5.1. Rekursiyonun Avantajlar.............................................................................74

6.5.2. Sondan Rekursiyon Optimizasyonu..............................................................74

6.5.3. Sondan Rekursiyonun Kullanm..................................................................75

6.5.3. Sondan Rekursiyonu Engelleme...................................................................76

6.6. Rekursiyonda Cut Kullanm................................................................................78

6.7. Argmanlarn Dng Deikeni Olarak Kullanm...............................................80

6.8. Rekursiv Veri Yaplar.........................................................................................83

6.9. Aa Biimindeki Veri Trleri.............................................................................84

vii

6.9.1. Bir Aa Yapsnda Tarama Yapma.............................................................84

6.10. Bir Aa Oluturmak.........................................................................................86

6.11. Binary Arama Aac...........................................................................................88

6.12. Aaca Bal Sralama.........................................................................................90

7. LSTELER VE REKRSYON.............................................................................93

7.1. Listeler.................................................................................................................93

7.2.1. Liste Tanmlanmas.......................................................................................93

7.2.2. Bir Listenin Paralar: Ba ve Kuyruk..........................................................94

7.2.3. Listelerin lenmesi.......................................................................................95

7.2.4. Listelerin Kullanlmas..................................................................................95

7.2.5. Liste Elemanlarnn Saylmas.......................................................................96

7.2. Sondan Rekursiyona Yeniden Bak....................................................................98

7.3. Liste Elemanl..................................................................................................100

7.4. Listeleri Birletirme............................................................................................101

7.5. Rekursiyona Prosedrel Bir Bak.....................................................................101

viii

7.6. Btn zmleri Bir Defada Bulma .................................................................102

7.7. Bileik Listeler...................................................................................................103

8. AKI DENETM.................................................................................................105

8.1. Bileik Ak........................................................................................................106

8.2. Yklemlerin Ak Biimlerini Tanmlama...........................................................107

8.3. Ak Analizini Kontrol Etmek............................................................................107

8.4. Referans Deikenler.........................................................................................109

8.4.1. Referans Tip Tanm...................................................................................109

8.4.2. Referens Tip ve zleme Dizileri(array).......................................................110

8.5. Referans Tip Kullanm.......................................................................................110

8.6. Ak Biimine Yeni Bir Bak.............................................................................112

8.7. kili (Binary) Aa Yapsnn Referans Tip le Kullanm...................................112

8.8. Referans Tip Kullanarak Sralama......................................................................113

8.9. Binary (kili) Tip................................................................................................114

8.9.1. Binary Terimlerin Kullanlmas...................................................................115

ix

8.9.2. Binary Terimlerin Yazm Biimi.................................................................115

8.9.3. Binary Terimlerin Oluturulmas................................................................116

8.9.3.1. makebinary(1)...................................................................................116

8.9.3.3. composebinary(2).............................................................................116

8.9.3.4. getbinarysize(1).................................................................................116

8.9.4. Binary Terimlere Eriim.............................................................................116

8.9.4.1. getentry(2).........................................................................................117

8.9.4.2. setentry(3).........................................................................................117

8.9.5. Binary Terimleri Eletirme........................................................................117

8.9.6. Binary Terimleri Karlatrma....................................................................117

8.9.7. Terimleri Binary Terimlere Dntrme....................................................118

8.9.7.1. term_bin(3).......................................................................................119

8.10. Hatalar ve stisnalarla Urama...................................................................119

8.10.1. exit(0), exit(1)..........................................................................................119

8.10.2. trap(3).......................................................................................................120

8.10.3. errormsg(4)..............................................................................................121

8.10.4. Hatalarn Bildirilmesi................................................................................121

8.11. Hata Dzeyi.....................................................................................................122

8.11.1. lasterror(4)................................................................................................122

8.11.2. Terim Okuyucudan Gelen Hatalar Grme...............................................123

8.11.3. consulterror(3)..........................................................................................123

8.11.4. readtermerror(2).......................................................................................124

8.12. Break Kontrol (Sadece Metin Modunda).......................................................124

8.12.1. break(1)....................................................................................................125

8.12.2. breakpressed(1)........................................................................................125

8.13. DOS Metin Modunda Kritik Hata Kontrol....................................................125

8.13.1. criticalerror(4)..........................................................................................125

8.13.2. fileerror(2)................................................................................................127

8.14. Dinamik Cut.....................................................................................................127

8.15. Programlama Stilleri.........................................................................................129

xi

8.15. Cut Yklemini Yerletirmek............................................................................130

9. ZEL GELTRLM PROLOG RNEKLER..............................................132

9.1. Kk bir Uzman Sistem rnei........................................................................132

9.2. Basit bir yn problemi........................................................................................136

9.3. Hazine Avcs.....................................................................................................137

TARTIMA VE SONU.........................................................................................140

xii

ZET

Yksek Lisans Tezi PROLOG PROGRAMLAMA DL LE MAKNE MHENDSL ALANINDA UZMAN SSTEMLERN HAZIRLANMASI TEKNKLER Yavuz Selim AYDIN Harran niversitesi Fen Bilimleri Enstits Makina Anabilim Dal 1998, Sayfa: 164 Gnmzde bilgisayar alannda gzlenen hzl deiim, yeni teknolojik imkanlarn ortaya kmasna neden olmaktadr. nsanolu daha bundan birka yl ncesinde hayal edemedii gelimelerin gnmzde gerekletiini grdke hayretler ierisinde kalmaktadr. Bilgi teknolojiyle yakndan ilgilenenler dahi, bu hzl deiime ayak uydurmada zorlanabilmektedir. Bilgisayarlarn insanlar gibi dnmesine salamak iin youn almalar srdrlmededir. Mmkn olduunca insan beyni fonksiyonlarna yakn ilevleri yerine getirebilecek mikroilemcilerin tasarm zerinde almalar srdrlmektedir. Bu almalar beinci kuak bilgisayar dnemine rastlad ve bu kuak ierisinde Yapay Zeka (Artificial Intelligece) alanlarnda nemli gelimelerin yer ald grlr. Bilgi teknolojisinin amac, uzman kiilerin bilgilerini bilgisayarda kullanarak yeni sonular elde etmektir. Uzman sistemler, yapay zekann bir dal olup, bir probleme uzman insan dzeyinde bir zm bulmak iin uzman bilgisini kullanrlar. Yapay zekada sk kullanlan programlama dillerinden biri de Prolog dilidir. Son versiyonu Visual Prolog olarak piyasaya kartlmtr. Visual Prolog, ifadeler mantnn kullanarak, bilgisayara zm aranan problem hakknda bilinen gerekleri ve kurallar vererek, uygun bir zm elde edilmesine salar. Konvansiyonel programlama dillerinde, bir programc herhangi bir problemin nasl zleceini bilgisayara adm adm tantmak zorundadr. Oysa bir Visual Prolog programcsnn yapmas gereken ey, zm aranan problem hakknda bilinen

xiii

gerekler ve kurallar, bunlar arasndaki ilikileri tanmlamak, daha sonra mmkn olana btn zmleri bulmak grevini Prologa vermektir. Visual Prolog, aritmetik ilemlerin yaplmasna da imkan tanr. Visual Prolog, C++ ve dier bilinen programlama dilleri kadar hzl alr. Hzl bir derleyici, bilgisayar dnyasnda daima aranan bir avantaj olmutur. Visual Prolog, MS DOS, Windows 3.1, Windows 95, Windows NT, Unix ve OS/2 iletim sistemleri altnda programlamaya imkan tanyan bir oklu ortam programlama dilidir. Uzman sistemlerin, btn kullanclara dk maliyetli uzmanlk, insanlar iin tehlikeli olan ortamlarda riski azaltma, emekli olabilen veya vefat edebilen insan uzmanlar yerine, her zaman kalc olan uzmanlar ve verilen kararlarn net aklanabilmesi gibi gzel zellikleri vardr. Bu alma, yapay zeka alannda alma yapan, uzman sistem tasarlamak isteyen fakat Trke kaynak bulamayan, kaynak kullanarak Prolog dilini renmek isteyen aratrmaclara faydal olmak amacyla gerekletirilmitir. Prologun temel mant, elemanlarn ayrntl anlatm, Prologun en nemli zelliklerinden biri olan Geriye z Srme ve bu konularn ak biimde kullanld rnekler doyurucu bilgi sunmaktadr. Anahtar Kelimeler: Uzman Sistemler, Yapay Zeka, Visual Prolog, Programlama Dilleri

xiv

ABSTRACT

Master Thesis

TECHNQUES ON THE DESIGN OF EXPERT SYSTEMS IN MECHANICAL ENGINEERING BY USING THE VISUAL PROLOG PROGRAMMING LANGUAGE Yavuz Selim AYDIN Harran University Graduate School of Natural and Applied Sciences Department of Mechanical Engneering 1998, Page: 164 Rapid advancement in the computer technology has brought new technological facilities. People are surprised to see that the technological innovations which could not even be dreamt of just a few years ago have been achieved. Even those closely involved in the Information Technology may sometimes face some difficulties in coping up with the rapid changes. Intensive studies have been performed by scientists to enable a computer to imitate human beings in the way he thinks. Studies to design microprocessors capable of performing similar functions of human brain still continue. It is observed that such studies coincided with the evolution period of the fifth generation computers and that important improvements have been recorded in the field of Artificial Intelligence. Information technology aims at making use of an experts knowledge from which new results may be retrieved. Being a subbranch of Artificial Intelligence, expert systems use the knowledge of a human expert to find a solution for a given problem at expert level. One of the programming languages frequently used in artificial intelligence is Prolog, of which the latest version has been released as the Visual Prolog. It uses logical expressions which tell the computer the facts and rules about a problem so that

xv

a solution based on the given facts and rules could be obtained by using a deductive procedure. In conventional programming languages, a programmer must describe the solution to a problem step by step. In the Visual Prolog, on the other hand, a programmer must only describe the facts and rules about a problem not steps necessary for the solution- in the form of some relations and then, let the Visual Prolog find all possible solutions for that problem. Visual Prolog is capable of performing arithmetic operations as well. Visual Prolog runs as fast as C++ and other popular programming languages. A fast compiler has always been an advantage in the computing world. The Visual Prolog is a multiplatform programming language that allows programming under MS DOS, Windows 3.1-95 and NT, Unix and OS/2 operating systems. Experts systems have some interesting characteristics such as low cost of expertise for all users, low risks in situations dangerous for humans, ever continuing expertise despite to human experts who may retire or pass away, and clear explanation of what has been concluded. This study has been performed for researchers who wish to carry out studies in the field of Artificial Intelligence, design expert systems in Mechanical Engineering but lack to find a source about the Visual Prolog in Turkish and like to learn this language. Many superior features of the Visual Prolog, including backtracking and recursion, have been clearly explained in this study by providing many sample programs. Keywords: Expert Systems, Artificial Intelligence, Visual Prolog, Programming Languages

1. GR

ngilizce Expert System kelimelerinden tretilerek Trkeye kazandrlm olan Uzman Sistem yazlmlar alannda, lkemizde youn almalarn yapld gzlenmektedir. Bir Uzman Sistem, Bilgisayar Destekli Eitim amal da kullanlabileceine gre, eitim ve retim iin gerekli olabilecek her trl formasyonu tamaldr. renme, dorudan bilgisayardan yaplaca iin, klasik retmen merkezli eitime nazaran, ieriin daha doyurucu ve cazip zellikler tamas gerekir. Cazip unsurlar, bilgisayar tarafndan ynetilmeli ve uygun ortamlarda ekranda veya bilgisayarn evre birimlerinde ortaya kabilmelidir. retilmek istenen bir konuda ilem basamaklarnn sras ok nemlidir. renciye yneltilecek sorular ok iyi belirlenmeli ve soru sorarken retme mekanizmas devreye alnmaldr. Sorularn sralannda yeterli hassasiyet gsterilmedii takdirde, hem renme eksik olabilir, hem de renci yanl bilgilendirmeye sevk edilebilir. Uzman sistem zerinde alan renci, bilgisayar ile yalnz bana kalacaktr. Srekli monoton bir ekran grnts yznden, rencinin renme arzusu krlabilir, bilgisayar nnde can sklabilir. O halde retme esnasnda, rencinin dikkatinin konuya sevk edilebilmesi iin, program arasnda grsel ve iitsel yntemlerle uygun uyarlar yaplabilmelidir. Bilgisayar destekli eitimin kullanlabilecei her yere ilave olarak, problemlere zm getirilmek istenen her sahada Uzman Sistem kullanlabilir. Bir Uzman Sistem hazrlanrken asgari olarak aadaki hususlarn gz nnde bulundurulmas gerekir. Hazrlanacak proje konusu hem gncel olmal hem de o konuda yeterli kaynak bulunabilmelidir. Konunun bol miktarda resim ve ekil iermesi, kullancnn renme hzn artracak bir faktrdr. Proje balangcnda, gzel bir sunu yazlmyla (rnein Power Point gibi) proje hakknda zet bilgiler verilmeli, proje tasarmcs ve denetleyen kiilerin isimleri, resimleri ve faydalanlan kaynaklar hakknda bilgi verilmelidir.

Konu anlatmna gemeden nce, gzel bir mzik eliinde bilgisayar,

kullancnn ismini girmesini istenmelidir. nk ilerleyen konular ierisinde baz yerlerde esprili cmlelerle bilgisayarn kullancya ismi ile hitap etmesi, kullancnn aniden dikkatini ekmeye neden olabilmekte ve kullanc bu durumdan fazlasyla memnun kalabilmektedir.

2. PROLOGUN (PROGRAMMING IN LOGIC) TEMELLER Bir Prolog program, (Basic, Fortran, Pascal, C) olduu gibi bir dizi komut satrndan deil, doruluu nceden bilinen gereklerden ve bu gereklerden bilgi salamaya yarayan kurallardan oluur. Prolog, cmlecikler (Horn Clauses) zerine bina edilmitir. Cmlecikler, yklem mant denilen formal sistemin bir alt kmesidir. Prologda bir Karar Motoru (Inference Engine) vardr. Bu motor, verilen bilgiyi kullanarak cevab aranan bir problem iin, mantksal bir ekilde karar veren bir ilemdir. Karar motorundaki Kalp Eletirici (Pattern Matcher) sorulara uygun olan cevaplar eletirerek nceden bilinen ve program iine kaydedilen bilgiyi geri arr. Prolog, program satrlar iinde sorulan bir soruyu veya hipotezi dorulamak iin, doruluu nceden bilinen ve veri olarak yklenmi olan bilgi kmesini sorgulayp hipotezin doruluu hakknda karar vermeye alr. Ksaca sylemek gerekirse, bir Prolog programnn temelini, program ak iinde nceden verilen gerekler ve kurallar oluturur. Prologun nemli dier bir zellii de udur: Sorulan sorulara mantkl cevaplar bulmann yansra, bulduu tek bir zmle yetinmez, baka alternatifleri de inceleyerek mmkn olan btn zmleri bulur. Prolog, bir programn birinci satrndan balayp sonuncu satrna kadar ilerleyip sadece bir zm bulmak yerine, zaman zaman geriye dn yaparak problemin her bir blmnn zm iin alternatif yollar da arar. Yklem mant, manta dayal fikirleri yazl bir ekilde ifade etmeye yarayacak ekilde gelitirilmitir ve Prologda bu mekanizma gayet iyi kullanlr. Yklem mantnn yapt ilk i, cmlelerdeki gereksiz kelimeleri ayklamaktr. Daha sonra cmleler-kelimeler arasndaki ilikiler ilk sraya, nesneler ise ilikilerden sonra sralanr. Bu nesneler ise ilikilerin etkili olduu argmanlar olarak yazlr. Konuma Dili Ahmet bir insandr. Gl krmzdr. Ahmet, gl krmz ise sever. Prologdaki Karl insan(Ahmet). kirmizi(gul). sever(Ahmet, gul) if kirmizi(gul).

Prolog ile program yazarken, ilk nce nesneler ve bu nesneler arasndaki ilikiler tanmlanr. Ahmet glleri sever cmlesindeki Ahmet ve gl kelimeleri nesne,

sevmek ise bu iki nesne arasndaki ilikidir. Bu ilikinin ne zaman doru olacan belirleyen ifadeye ise Kural denir. Ahmet, gl krmz ise sever cmlesindeki sevmek hangi durumda Ahmetin gl seveceini belirttii iin bu durumda Kural olur. 2.1. Gerekler: Bilinen olgular Prologda, nesneler arasndaki ilikiye Yklem denir. Tabii dilde bir iliki bir cmle ile sembolize edilir. Prologun kulland yklem mantnda ise bir iliki, bu ilikinin ismi ve bunu takiben parantez iinde yazlan nesne veya nesnelerden oluan basit ifadelerle zetlenir. Gerekler, tpk cmlelerdeki gibi . ile biter. Aadaki rneklerde sevmek fiilinin tabii dilde ifade edilmesi gsterilmitir. Yasin Esray sever. Esra Cihat sever. Yasin kedileri sever. Yukardaki ifadeleri olgu olarak kabul edip Prologdaki karlklarn yazalm: sever(yasin, esra). sever(esra, cihat). sever(yasin, kediler). Grld gibi, gerekler nesnelerin ve ilikilerin deiik zelliklerini de ifade edebilirler. 2.2. Kurallar: Verilen Gereklerden Hkm karma Kurallar, gerek olgular kullanarak bir sonuca varmak iin kullanlr. Aada sevmek ilikisinden elde edilen baz kurallar verilmitir: Yasin, Esrann sevdii her eyi sever. Hasan krmz olan her eyi sever. Bu kurallar Prolog dilinde yazmak gerekirse: sever(yasin, hersey):-sever(esra, hersey). sever(hasan, hersey):- kirmizi(hersey). Buradaki :- sembol, prosedrel dillerdeki if(eer) anlamnda olup, bir kuraln iki parasn birletirir.

Prolog, sever(yasin, hersey):-sever(esra, hersey) kuraln kullanarak, Yasinin sevdii nesneyi bulmak iin nce kuraln ikinci ksmn, yani Esrann sevdii nesneyi bulur. Bunun doruluu ispatlandktan sonra Yasinin sevdii nesneyi belirler. 2.3. Sorgulamalar: (Querries) Prologa baz gerekler tantldktan sonra, artk bu gereklerle ilgili sorular sormaya balanabilir. Bunu Prolog Sistemini Sorgulama diyoruz. Veri olarak saklanan gerekler ve gerekler arasndaki ilikiler bilindikten sonra, bu ilikiler hakknda soru sorup cevap almak kolaydr. Gnlk konumalarda Esra Yasini seviyor mu? eklindeki bir soruyu Prologda yle ifade edilir. sever(esra, yasin). Bunun cevab program ak ierisinde verdiimiz gereklere baldr. Yasin neyi sever? eklindeki bir soruyu Prologa sormamz mmkndr. Bunu sever(yasin, Neyi) eklinde kodlarsak, Prologdan u cevab alrz: Neyi=esra Neyi=kediler 2 Solutions nk nceden verilen sever(yasin, esra) ve sever(yasin, kediler) ilikileri, bunu ispatlamaktadr. Burada Yasin ve Esra'n kk harfle, Neyi kelimesinin ise byk harfle balamaktadr. nk, yklemdeki Yasin sabit bir nesnedir, yani deeri sabittir. Oysa Neyi bir deikendir. Yani farkl gereklerle beraber, sorgudan alnacak cevaplar da farkl olacaktr. Bu yzden deikenler daima byk harf veya bir _ ile balar. Bu durumda Neyi kelimesinin cevaplar deiebilir. Prolog bir sorguya cevap ararken daima nceden verilen gereklerin ilkinden balar ve hibirini ihmal etmeden en sondaki geree kadar ilerler. Prologda, bir insana sorulabilecek baka sorular da sormak mmkndr. Fakat Mehmet hangi kz sever? eklindeki bir soruya hibir cevap alnamaz. nk yukardaki satrlar dikkate alndnda, bu konuyla ilgili bir bilginin mevcut olmad grlr. Yasin Esray sevmektedir, fakat Esrann kz olduuna dair bir bilgi mevcut olmadndan, Prologun bu gereklerden hareketle bir karara varmas mmkn olamaz.

2.4. Gerekler, Kurallar ve Sorgulamalarn Bir Araya Yazlmas 1. Aadaki gerekler ve kurallarn var olduunu kabul edilsin. Byk araba hzldr. Byk bir araba iyidir. Kk bir araba daha kullanldr. Kasm, eer hzl ise, byk arabay ister. Yukardaki gereklerden anlalan ey, Kasmn hzl ve byk arabalardan holanddr. Prolog da ayn sonuca varacaktr. Zaten hzl arabalar hakknda bilgi verilmeseydi, hikimse Kasmn hzl arabalardan holand sonucuna varamazd. Yaplabilecek tek ey, ne tr bir arabann hzl olacan tahmin etmektir. 2. Aadaki rnee bakarak, Prologun kurallar kullanarak sorgulara nasl cevap bulduu aklanmtr. hoslanir(cengiz, masa_tenisi). hoslanir(mehmet, yuzme). hoslanir(yavuz, futbol). hoslanir(levent, Spor):-hoslanir(yavuz, Spor). Son satrdaki hoslanir(levent, Spor):-hoslanir(yavuz, Spor) bir kural olup, konuma dilindeki karl udur: Levent, bir spor trnden eer Yavuz da holanyorsa holanr. Bu kuraln ba taraf hoslanir(levent, Spor) ve gvde ksm hoslanir(yavuz, Spor) olur. Burada Leventin yzmeyi sevip sevmedii hakknda hibir bilgi yoktur. Bunu renmek iin hoslanir(levent,yuzme) eklinde bir sorgu kullanmak yeterlidir. Cevap bulmak iin Prolog hoslanir(levent, Spor):-hoslanir(yavuz, Spor) kuraln kullanr. Yukarda geen gereklerle bunlar arasndaki ilikiler, aadaki 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 Prologda derlenirse, yes cevabn alnr. nk hoslanir(yavuz, futbol) gerei Yavuzun futboldan holandn gstermektedir. hoslanir(levent, Spor):-hoslanir(yavuz, Spor ) kural ise Leventin, Yavuzun yapt spor trlerinden holandn gstermektedir. lgili olgu Yavuzun futboldan holandn gsterdii iin, Leventin de futboldan holandn sylemek mmkndr. Bu yzden GOAL hoslanir(levent, futbol) sorgusunun cevab yes olur. Fakat hoslanir(levent, tenis) sorgusunun cevab no olacaktr. nk: 1. Bu sorgunun dorulanabilmesi iin gerekler arasnda ncelikle Yavuzun tenisten holandn gsteren bir olgunun var olmas gerekir. 2. hoslanir(levent,Spor):-hoslanir(yavuz, bilgi olmadndan, kural baarsz olur. 2.5. Deikenler: Genel Cmleler Prologda deikenler kullanlarak genel gerekler, kurallar yazlabilir ve genel sorular sorulabilir. Deikenler tabii dilde de kullanlr. Tipik bir rnek vermek gerekirse: Kasm, Feritin sevdii eyi sever. Bu blmn banda da belirtildii gibi, Prologda deikenler daima byk harf veya bir _ ile balar. sever(kasim, Sey):-sever(ferit, Sey) eklinde ifade edilebilecek yukardaki cmlede, Sey deikendir. kasim ve ferit kelimeleri sabit semboller olduklar iin kk harfle balarlar. Bu sabitleri de ekrana byk harfle balayacak ekilde yazmak mmkndr. Bunun iin sadece (Kasim, Sey) veya (Ferit, Sey) eklinde yazmak yeterlidir. 2.6. Blm zeti 1. Bir Prolog program iki tr ifadelerden oluur: Gerekler ve Kurallar. Gerekler, programcnn doruluundan emin olduu bilgiyi ilikiler veya zellikler olarak anlatt satrlardr. Kurallar, baml ilikilerdir. Prolog bu kurallar kullanarak bir bilgiden hareketle bir konuda karar verir. Bir kural, verilen artlar yerine geliyorsa baarl olur, yani doru olur. Spor) kural, stteki gerekleri kullanarak bu konuda bir karara varamaz. nk kuraln gvdesini dorulayacak bir

Prologda btn kurallarn iki ksm vardr: Ba ve Gvde ksm. Bunlar birbirinden :- sembolleri ile ayrlrlar. Ba ksm verilen gerekler dorulanyorsa dorudur. Bu ksm ayn zamanda sonu veya baml iliki olarak da bilinir. Gvde ksm ise doru olmas gereken artlar tar. Bylece Prolog, programn ba ksmnn doru olduunu ispatlayabilir.

2. Gerekler ve kurallar birbirinin aynsdr. Gereklerin kurallardan tek fark, aklayc bilgi tayan gvdelerinin olmamasdr. 3. Prologa bir dizi gerek veya kural tanttktan sonra, bu gerekler veya kurallar hakknda soru sormak mmkndr. Buna Prolog Sistemini Sorgulama denir. Prolog, sorgulama esnasnda, verilen gerekler listesinin bandan sonuna kadar tarama yapar ve sorguya uyan cevaplar bulmaya alr. 4. Prologdaki Karar Motoru bir kuraln ba ve gvde ksmn incelerken, bilinen gerek ve kurallara bavurur. artlarn yerine gelip gelmediini kontrol eder. Bir kuraldaki btn artlar dorulandktan sonra, baml olan ksm, yani kuraln ba ksmnn doru olduuna karar verir. Btn artlar, bilinen gereklere gre karlanamazsa, sorguya olumlu cevap verilemez. rnekler: Prolog gereklerinin konuma diline evrilmesi, aada verilmitir. 1. yapmaktan_hoslanir(oya, resim) = Oya, resim yapmaktan holanr. 2. cocuk(arif).= Arif, bir ocuktur. 3. bulunur(ankaya Kk, Ankara). = ankaya Kk Ankaradadr. 4. adres(abuzer, zonturlu, Fatih Cad. 6. Sokak., Dkap, ANKARA, 06412).= Abuzer Zonturlunun adresi Fatih Cad. 6. Sokak Dkap, ANKARA, 06412dir. imdi tam tersini yapalm, konuma dilinden Prolog diline evrilme ise, aadaki gibi yaplr. 1. Vedat iyi kebap yapar = yapar(vedat, iyi_kebap). 2. Keban Baraj Elazdadr = bulunur(Keban Baraj, Elaz). 3. Kasm Kayann telefon numaras 314 41 17dir. telefon_no(Kasm KAYA, 314 41 17). 4. Hseyin Meryemin babasdr. = baba(huseyin, meryem).

2.7. Konuma Dilindeki Cmlelerin Prolog Programlarna Aktarlmas Bu blmn ilk ksmnda gerekler, kurallar, ilikiler, genel cmleler ve sorgulamalar konusunu incelenmitir. Ayn kelimeler zerinde almakla beraber, Prologla daha fazla ilgili kelimeler zerinde, yani cmlecikler, yklemler, deikenler ve hedefler zerinde durulacaktr. 2.8. Cmleler (Gerekler ve Kurallar) Prolog dilini oluturan iki trl ifade vardr. Bu ifadeler gerekler veya kurallardan ibarettir. Prolog dilinin kalbini oluturan bu ifadelere clause denilmektedir. Bir gerek, bir nesnenin veya nesneler arasndaki ilikinin bir zelliinin sadece tek bir ynn temsil eder. Bir gerein Prolog tarafndan tamamen doru kabul edildiini, bir sorgulamaya cevap ararken bu gereklerden yola kldn ve bu gereklerin doruluunun kontrol edilmedii unutulmamaldr. Gnlk hayatmzda da doruluu bilinen gereklerden yola karak bir eyin doru olup olmad aratrlr. te, mevcut gereklerden hareket ederek neyin doru olabileceini gsteren yapya Prologda Kural denir. imdi Prologdaki Kural yapsna bir rnekle yakndan bakalm. rnek: 1. Aadaki cmlede, mende olan bir yemein Mehmete uygun olup olmad sorgulanmaktadr. Mehmet lser olduu iin sadece doktorunun izin verdii yemekleri yer. Men ve yukardaki kurala bakarak, Mehmetin hangi yemei sipari edebileceine karar verilebilir. Bunu yapabilmek iin, mendeki yemein belirli artlar tayp tamadna baklmaladr. a. Menudeki_yemek bir sebze mi? b. Menudeki_yemek doktorun tavsiye ettii listede var m? c. Sonu: Eer a ve b klarnn ikisinin de cevab Evet ise, bu durumda Mehmet mendeki bu yemei yiyebilir. Prologda bu tr ilikilerin bir kuralla ifade edilmesi zorunludur, nk verilecek karar tamamen gereklere baldr. Yukardaki ifadeler; Prolog gerekleri olarak yle yazlabilir: mehmet_yiyebilir(Menudeki_yemek):sebze(Menudeki_yemek), doktor_tavsiyeli(Menudeki_yemek).

sebze(Menudeki_yemek) ifadesinden sonra , konulmutur. nk virgl, iki ama arasndaki balanty gsterir ilikisinin ve and anlamndadr. iin, mehmet_yiyebilir(Menudeki_yemek) de doru olmas gerekir. rnek: Ebeveyn ilikisini anlatan bir Prolog gerei aadaki gibi yazlr. ebeveyn(omer, nejla) = Omer, Nejlann ebeveynidir. Programn veritabannda babalk durumunu gsteren gereklerin zaten var olduunu, yani baba(omer, nejla) gereinin mevcut olduu ve ayn zamanda annelik ilikisini de gsteren anne(leyla, nejla) gereinin de var olduu kabul edilsin. Babalk veya annelik ba hakknda yeterince bilgi olduundan, ayrca baba ve anne bilgilerini anlatmak vakit kaybna neden olur. Bunu yerine genel bir kural yazmak daha mantkldr. Yani, ebeveyn(Sahis1, Sahis2):-baba(Sahis1, Sahis2). ebeveyn(Sahis1, Sahis2):-baba(Sahis1, Sahis2). rnek: Bir mteri arabay severse ve araba satlk ise bu arabay satn alabilir. Tabii dildeki bu iliki, aadaki kuralla Prologa aktarlabilir: satin_alabilir(Musteri, Model):sahis(Musteri), araba(Model), hoslanir(Musteri, Model), satilik(Model). Ayn kural, konuma dilinde aadaki ekilde ifade edilir. Mteri modeli satn alabilir :Mteri bir ahs ve Model bir araba ve Mteri modelden holanrsa ve Model satlk ise. Bu kuraln ba ksm, gvde ksmndaki her drt artn da dorulanmas halinde doru olacaktr. Yukarda yazlan gerekler, aadaki ekilde program haline getirilebilir. PREDICATES nondeterm satin_alabilir(symbol, symbol) nondeterm sahis(symbol) dorulanabilmesi

sebze(Menudeki_yemek), doktor_tavsiyeli(Menudeki_yemek) ilikilerinin her ikisinin

10

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). Yukardaki program yazdktan sonra Levent ve Cengizin ne satn alabileceini, kimin buick marka arabay alabileceini bulmak iin aadaki hedef cmleleri kullanlabilir: satin_alabilir(Kim, Ne). satin_alabilir(levent, Ne). satin_alabilir(cengiz, Ne). satin_alabilir(Kim, buick).

11

2.9. Olgular Arasndaki likiler: Yklemler (Predicates) Bir ilikinin sembolik ismine yklem denir ve ykleme bal olan nesnelere argman denir. Mesela sever(yasin, esra) gereindeki sever ilikisi yklem, yasin ve esra ise bu yklemin agrmanlar olan nesnelerdir. Argmanl ve agrmansz yklem rnekleri: sahis(soyad, ad, cinsiyet). sahis yklem; soyad, ad, cinsiyet ise bu yklemin argmanlardr. basla = argman olmayan yklem dogum_gunu(isim, soyisim, tarih). Dogum_gunu yklem, isim, soyisim ve tarih nesneleri ise argmanlardr. Snrl olmakla beraber, bir yklem argmansz olarak da kullanlabilir. 2.10. Deikenler (Genel Cmleler) Basit bir sorgulamada, sever(Kim, tenis) kuraln kullanarak kimin tenis oynamaktan holand renilebilir. Bu sorguda Kim, deiken olarak kullanlmtr. Visual Prologda deiken isimlerinin daima byk harfle veya _ ile balad, daha nceden sylenmiti. lk karakteri byk bir harf veya _ olmak artyla, deikenler istenilen kadar rakam, byk veya kk harf alabilirler. Konu ile ilgili birka rnek, aada verilmitir. Geerli Deikenler Prolog_ile_yazdigim_ilk_program _14_10_1978_tarihinde_doganlar _1_nolu_ogrenci Geersiz Deikenler 1.deneme 14.program prolog

Deiken ismi seimine dikkat etmek, programn bakalar tarafndan rahat bir ekilde okunmas ve anlalmas bakmndan nemlidir. sever(Kim, tenis) kural sever(X, tenis) kuralna tercih edilir. nk Sahis Xe gre daha fazla anlamldr. 2.10.1. Prologda Deikenlerin Deer Almas Dier programlama dillerinde, deikenlerin deer almalarna imkan tanyan atama ifadeleri Prologda yoktur. Prologu dier programlama dillerinden ayran en nemli zelliklerden biri de budur. Prologdaki deikenler almalar gereken deerleri atamayla deil, gerekler veya kurallardaki sabitlere eletirilirken alrlar.

12

Bir deiken, deer almad mddete serbest deiken olarak kalr. Fakat herhangi deer ald andan itibaren snrl hale gelir. Bu snrllk bir sorguya cevap almak iin gerekli olan sre kadar snrl kalr. Bu ilem bittikten sonra deiken yeniden snrl hale gelir, program baa dner ve alternatif zmler arar. Dolaysyla bir deikene bir deer vererek bilgi depolanamaz. Deikenler bilgi depolamak iin deil, kalp-eletirme ve ilemenin bir paras olarak kullanlr. 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 yzmeden kimin holand sorusuna cevap aramak iin u sorguyu kullanlr. GOAL sever(Sahis, okuma), sever(Sahis, yuzme). Prolog bu kural zmek ve nce sever(Sahis, okuma) ksmnn doru olup olmadn bulmak iin btn gerekleri batan sonra kadar inceler. zm bulunmadan nce Sahis deikeninin deeri yoktur, yani serbesttir. te yandan okuma ksm bilinmektedir. lk sever(oktay, okuma) gereindeki okuma ksm sorguya uyduu iin Sahis oktay deerini alr. Prolog ayn zamanda aaya doru nereye kadar tarama yaptn gstermek iin kuraln bayla eleen ilk noktaya bir pointer koymaktadr. Sorgunun ilk ksm dorulandktan sonra ikinci ksmnn da dorulanmas gerekir. Yani yzmeden holanan kiinin de bulunmas gerekir. Sahis deikeni oktay deeri ald iin artk sever(oktay, yuzme) gereinin doru olup olmad aratrlr. Gerekler incelenirse, oktay isimli ahsn yzmeden holanmad grlr. Bu durumda Prolog Sahis deikenine atad oktay deerini etkisiz hale getirir ve Sahis yeniden serbest hale gelir. Kuraln ilk ksmn dorulayan gerei bulmak iin Prolog bu kez kurallarn bandan deil, gerekler listesine daha nce yerletirmi olduu

13

pointerden aaya kadar doru taramaya balar. lk gerek gereken artlar salayamad iin artk dikkate alnmaz. Bu ileme Geriye z Srme denir. Yaplan taramada okumadan holanan kiinin ismail olduu grlnce Sahis deikeni bu kez ismail deerini alr. Kuraln ikinci ksmnn dorulanmas iin tarama yaplrsa, yzme iin gereken artn yine ismail ile saland grlr. Dolaysyla Prologun verecei cevap u olur: Sahis=ismail 1 Solution 2.11. Anonim Deikenler Anonim deikenler, programlarn gereksiz bilgi ve satrlarla karmak hale gelmelerini engeller. Bylece bir sorgulamadan beklenilen bilgileri alabilir ve ihtiya olmayan deerler iptal edilmi olur. Prologda anonim deikenler _ ile gsterilir. Aadaki rnekte anonim deikenin kullanm verilmitir: 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,_). Dier deikenlerin yerine kullanlabilen anonim deikenlerin, normal deikenlerden tek farklar udur: anonim deikenler hibir zaman bir deere eitlenemezler. Yukardaki rnek yazdktan sonra GOAL ebeveyn(Ebeveyn,_) sorgusu altrlarak, ebeveyn olan kiilerin isimleri renilebilir. ocuklarn isimleri istenmedii iin isimlerinin yerine anonim deiken kullanlmtr.

14

Programn sonucunda u sonu grntlenir: Ebeveyn=selehattin Ebeveyn=sacide Ebeveyn=selehattin 2 solutions Tanmlanan deiken anonim olduu iin, alnacak cevabn ikinci argmanla balants olmayacaktr. Anonim deikenler, gereklerin tanmlanmasnda da kullanlabilir. vardir(_,televizyon). yemek_yer(_). fadeleri konuma dilinde Herkesin televizyonu var ve Herkes yemek yer olarak evrilebilir. 2.12. Hedefler (Sorgular) imdiye kadar Prologa soru sormak anlamnda kullanlan sorgulama kelimesinin yerine bu andan itibaren Hedef(Goal) kelimesi kullanlacaktr. Sorgulamalar hedef olarak tanmlamak daha anlamldr, nk Prologa bir sorgu yneltmekle, ona yerine getirilmesi gereken bir hedef verilmi olur. Hedefler sever(ismail, yuzme) gibi basit olabilecei gibi sever(Sahis, okuma), sever(Sahis, yuzme) gibi daha karmak da olabilir. Birden fazla paradan oluan hedefe Birleik Hedef, her bir paraya da alt hedef denir. 2.12.1. Birleik Hedefler: Balalar ve Ayralar Birleik bir hedefin zmn bulmak iin her iki alt hedefin doru olmas gerekir. Bu durumda, iki alt hedef arasnda (ve) anlamna gelen , kullanlr. Fakat istenilen durumlarda alt hedeflerden sadece birinin doru olmas art da aranabilir. Bu durumda alt hedefler arasnda (veya) anlamna gelen ; kullanlmas gerekir. Bu duruma Ayrma ilemi denilmektedir. imdi bu durumu gsteren 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) /*Cihatn ebeveyni */ /* Cihatn ebeveyni*/ /* Sezenin ebeveyni*/

15

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, cmleciklerde tarif edilen 25000 dolarlk arabay bulur. Benzer ekilde; fiyat 25.000 dolardan daha az olan bir araba var m? eklindeki bir soruya cevap bulmak da mmkndr. Bunun iin araba(Marka, Kilometresi, Kullanim_Suresi, Renk, Fiyat), Fiyat< 25000 eklindeki bir sorguyla bu sorunun cevabn bulmak mmkndr. Bu kural sorgulandnda, alnacak cevap chrysler olacaktr. imdi fiyat 25.000 dolardan az olan bir araba veya fiyat 20.000 dolardan daha az olan bir kamyon var mdr? eklindeki bir soruya uygun bir hedef yazalm: 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 olmadn aratrr. Sonu doru olsun veya olmasn, ikinci alt hedef de aratrlr. Her ikisinden birinin doru olmas durumunda alnacak cevap olumlu olacaktr. Hedefin dorulanmas iin birden fazla alt hedefin ayn anda doru olmas gerekmez. Bu tr hedeflere ayrtrma denilmektedir ve bunun iin alt hedefler arasnda ; ayrac kullanlmaktadr. 2.13. Aklama Satrlar Program yazarken program satrlar arasna aklamalar yazmak, bakalarnn da program okuyup anlamasna imkan tanr. Program ierisine yazlan bu yorum satrlar derleyici tarafndan dikkate alnmaz. Prologda yorum satrlar bir ka satrdan

16

oluacaksa /* ile balamal ve */ ile bitmelidir. Eer tek bir satr yorum yazlacaksa % iareti kullanlabilir. /* Program yazarken kullanlan deikenler, yklem ve kurallar*/ /*hakknda bilgi vermek iin bu tr yorum satrlar yazlabilir*/ %Tek satrlk yoruma bir rnek. /* ie /* yorum */ satr yazmak da mmkndr*/ 2.14. Eletirme Prologda eletirme yaplrken elenik yaplar birbiriyle eleebilir.

ebeveyn(selehattin, X), ebeveyn(sacide, cihat) kuralndaki X deikeni cihat deerini alr ve serbest olan bu deiken artk bal hale gelir. Bal hale gelen baka bir deikene atanrsa, dier deiken de ayn deeri alr. 2.15. Blm zeti 1. Prologda bir program gerekler ve kurallardan oluan cmleciklerden oluur. Gerekler, doru olduklar kabul edilen ilikiler ve zelliklerdir. Kurallar baml ilikiler olup, gerekler ve ilikileri kullanarak bilgi elde etmeye yararlar. 2. Gereklerin genel yazl biimi yledir: ozellik(nesne1, nesne2,..... nesneN) veya iliki(nesne1, nesne2,..... nesneN) Burada zellik nesnelerin herhangi bir zellii, iliki ise nesneler arasndaki herhangi bir ilikidir. zellik ve iliki kelimelerinin her ikisi de Prologda ayn anlamda kullanlr. 3. Bir programda verilen bir iliki bir veya daha fazla nesne arasndaki ilikiden ibarettir. sevmek(ahmet, futbol) gereindeki sevmek bir ilikiyi, ahmet ve futbol ise bu ilikinin nesnelerini temsil eder. solak(hasan) gereinde solak bir zelik, hasan ise bir nesnedir. 4. Kurallarn genel yazlma ekli: Ba:-Gvde olup, daha ak hali aadaki gibidir.

17

iliki(nesne, nesne, ....., nesne) :iliki(nesne, nesne, ..., nesne), . . iliki(nesne, nesne, ...., nesne). 5. liki ve nesne isimlerinin yazlmas baz kurallara baldr. Nesne ve iliki isimleri daima kk harfle balar. Bunu takiben istenilen sayda byk-kk harf, rakam, _ kullanlabilir. 6. Deiken isimleri daima byk bir harf veya _ ile balar. Bunu takiben istenildii kadar kk_byk harf, rakam vs. kullanlabilir. Deikenler bir deer almadan nce serbest, deer aldktan sonra ise bal hale gelirler. Bir deikene deer atayp bilgi depolamak mmkn deildir. nk bir deiken sadece bir cmlecikte bamldr. 7. Bir sorgudan sadece belirli bir bilgi alnmak isteniyorsa, anonim deiken (_) kullanlabilir. Anonim deikene hibir zaman deer atanmas yaplamaz. 8. Prologa programda verilen gereklere gre bir soru sormak Prolog Sistemini Sorgulama olarak adlandrlr ve bu sorguya Hedef denir. Bileik bir hedef iki veya daha fazla hedeften oluur. Bu paralarn her birine alt hedef ad verilir. Bileik hedefler Bala veya Ayra eklinde olabilir. 10. Eletirme birbirine denk yaplar arasnda gerekletirilir. Serbest bir deiken bir sabite veya nceden deer alp baml hale gelmi baka bir deikene atanabilir. Serbest olan iki deiken birbirine atanrsa, birinin alaca deer otomatik olarak dierine atanm olur.

18

3. VISUAL PROLOG PROGRAMLARININ TEMEL BLMLER Bir VIP Program genelde u drt blmden oluur: Clauses (Gerekler ve Kurallar), Predicates (Yklemler), Domains (Deiken Tipleri) ve Goals(Hedefler). 3.1. Clauses(Olgular veya Kurallar) Bu blm bir programn kalbi durumundadr. nk programda tanml hedefler dorulanmaya allrken, doruluu daha nceden bilinen gereklerden yola klr. Gerek ve gerekler arasndaki ilikileri tanmlayan kurallarn tanmland yer bu blmdr. Bir yklem iin tanmlanmas gereken btn clauselar kmesine Procedure denir. 3.2. Predicates (Yklemler) Yklemlerin ve yklemlerdeki argmanlarn tiplerinin tanmland yer bu blmdr. Visual Prologda mevcut olan hazr yklemlerin tanmlanmas gerekmez. 3.3. Domains (Deiken Tipleri) Burada, Visual Prologda olmayan tiplerin tanmlanmas yaplr. 3.4. Goal (Hedef) Programdaki sorgular buraya yazlr. 3.5. Yklem Tanm Bir yklemin genel yazl biimi yledir: yuklem_adi(argman_tip1, argman_tip2, argman_tip3,...., argman_tipN) Yklemlerin biti parantezinin clauses blmndeki gibi . ile sonlanmadna dikkat edilmelidir. Yklem isimleri en fazla 250 karakterten oluabilir ve herhangi bir harfle balayabilir. Yklemler iin isim seilirken kk veya byk harfle balamak nemli deildir. Fakat kk bir harfle balayan bir isim seilmesi nerilir. nk Prolog derleyicilerin ou ancak kk harfle balayan yklem isimlerini kabul etmektedir. Kullanlabilecek karakterler unlardr: Byk harfler: A, B, .........., Z

19

Kk harfler: a, b, ............, z. Rakamlar: 0, 1, .................., 9 Alt tire: _. Geerli Yklem simleri Olgu Oynar sahip_olunan_servet tahakkuk_fisi 10_kisilik_sinif 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) Yukardaki program parasnda yklem ve argmanlarn anlamlar aada verilmitir. sever yklemi iki argman alr: sahis ve eylem. Bu argmanlarn her ikisi de deer olarak symbol, yani alfabetik karakterler alabilir. Geersiz Yklem simleri [olgu] *gider* Sahiptir/araba bu-ayin-bordrosu <10-kisiden_biri

20

ebeveyn ykleminin iki argman da sahis olup, domainde tanmlad ekliyle symbol tipindedir. satin_alabilir yklemi tipi symbol olan sahis ve araba argmanlarn almtr. araba yklemi 5 adet argman almtr. lk ikisinin tipi symbol, son nn ise integerdr (tamsay). yesil yklemi, tipi symbol olan tek bir argman almtr. Symbol tipi zaten Visal Prologun standart tipleri arasnda yer aldndan, ayrca tanmlamaya gerek yoktur.

derece ykleminin argmanlar da standart domainde yer almaktadr.

3.6. Domains (Tip tanmlar) Blm Domain ksmnda argmanlarn tipleri tanmlanr. Bir argman alfabetik, nmerik veya her ikisinden oluan karakterleri deer olarak alabilir. Domain ksm, birbirinin ayns gibi grnebilecek verilere farkl isimler vermemize imkan tanr. VIP programlarnda iliki veya gereklerde tanmlanm olan nesneler (yklemdeki argmanlar) domainlere aittir. Bu tipler standart olarak tanml olabilecei gibi, kullanc tarafndan sonradan da tanmlanabilir. Domain ksm son derece faydal iki grev icra eder. Birincisi, yklemlerde tanmlanan argmanlarn tipleri VIPde standart olarak tanmlam olan symbol, tamsay vs. domainleri olsalar bile, argmanlara farkl anlaml isimler vermemize imkan tanr. kincisi, standart domainler tarafndan tanmlanmam veri yaplarn tanmlanmasna imkan salar. Ayrca, yklemdeki argmanlarn net olarak anlatlabilmesi iin farkl domainler olarak tanmlanmas da faydaldr. rnekler: 1. Aadaki tabii dil cmlesinin VIPde karln yazp, zel domain tanm aadaki ekilde yaplr. Hasan, 28 yanda bir erkektir. Eer zel olarak domain tanmlanmazsa, yani VIPdeki standart tipler kullanlrsa yukardaki cmle yle yazlabilir: sahis(symbol, symbol, integer)

21

Bu yklem ve argmanlar doru biimde tanmland iin alr. Fakat sahis yklemi iinde tanmlanan argmann neye iaret ettiini hatrlamak zor olabilir. Bunun yerine: domains isim, cinsiyet yas predicates sahis(isim, cinsiyet, yas) eklinde ayr domain tanmlanrsa sahis argmanndaki isim, cinsiyet ve yas argmanlarnn anlam her zaman iin barizdir. Bu tanmlamann bir faydas da argman tipleri arasnda olabilecek tip eletirme hatalarn nlemektir. zel domainler, argmanlarn anlamn ok daha iyi ifade ettikleri halde, btn argmanlar iin zel domain kullanmak gerekmez. Bir argman iin belli bir tip tanmlanmas yapldktan sonra, bu argman, tipi ayn olan bir baka argmanla hibir ekilde kartrlmaz. rnein isim ve cinsiyet argmanlarnn her ikisinin de tipi symbol olmasna ramen birbiriyle kartrlmazlar. Fakat kullancnn tanmlad argmanlarn hepsi nceden tanmlanm argmanlarla kartrlabilir. Aadaki rnek, altrld 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) doru alr ve Toplam=86 1 Solution cevab alnr. Carpma_yap fonksiyonu iin 35 ve 25 deerlerleri kullanlrsa, = symbol = integer

22

Carpma=875 1 Solution sonucu alnr. 31 ve 17 saylarnn arpmn bulup, elde edilen sayy kendisiyle toplayp Cevap argmannn deeri aadaki ekilde bulunur. carpma_yap(31, 17, Toplam), toplama_yap(Toplam, Toplam, Cevap) eklinde bir hedef yazlabilir. Bu hedefe gre, bulunacak sonucun Toplam=527 (31*17), Cevap=1054 (527+527) olmas gerekirken, VIP derleyici bir hata mesaj verir. nk carpma_yap fonksiyonundaki Toplam argman 527 deerini aldktan sonra bu deeri ikinci yklem olan toplama_yaptaki ilk iki argmana tamaya alr. Her iki argman da tamsay tipinde olmasna ramen farkl isimlerde olduklarndan, birbirleriyle eletirilemezler ve neticede hata mesaj grntlenir. Bu yzden bir cmledeki fonksiyonda tanmlanan deiken birden fazla fonksiyonda kullanlacaksa, her fonksiyonda ayn ekilde tanmlanmaldr. 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 ykleminin 5 argman mevcuttur. Yas argman byte tipinde olduu iin alabilecei deer 8 bitlik ve 0-255 arasnda deien pozitif bir saydr. Ayn ekilde yol ve fiyat tipleri ulong (uzun tamsay) olup 32-bit pozitif tamsay deerleri alr. Son olarak marka ve renk tipleri symbol tipindedir. Yukardaki sorgular tek tek

23

deneyince her birinin ayr bir tip hatasna neden olduu grlecektir. GOAL araba(renault, 13, 40000, kirmizi, 12000) sorgusunda byte tipinde olmas gereken yas argman 40000 deerini almtr. Bunun 0-255 arasnda olmas gerekir. kinci sorguda yas ve renk argmanlarnn deerleri yer deitirmitir. Bu nedenle yine hataya neden olur. 3.7. Goal Blm Goal blmnn bir kuraln yapsndan sadece iki fark vardr. 1. Goal kelimesinden sonra if anlamndaki :- operatr kullanlamaz. 2. Program alrken VIP ilk nce GOAL satrn altrr. 3.8. Deklarasyon ve Kurallara Ayrntl Bak Bir yklemdeki argmanlarn tiplerini tanmlarken, VIPde hazr bulunan standart tipler kullanlabilir. Bu tiplerin domains ksmnda, ayrca tanmlanmas gerekmez. Aadaki tabloda hazr olarak bulunan tipler verilmitir (Tablo 1).
Tablo 3.1: Visual Prologda Tipler ve Alabilecekleri deerler.
Tip short Ushort Long Ulong nteger (Bilgisayar ve Mimariye bal olarak veya + deer alabilir) Unsigned (Bilgisayar ve mimariye bal olarak -/+ deer alabilir) byte Word Dword Kullanld Yer Btn Platformlar Btn Platformlar Btn platformlar Btn platformlar 16 Bit Platformlar 32 Bit platformlar 16 Bit Platformlar 32 Bit platformlar Btn platformlar Btn platformlar Btn platformlar 16 Bit 16 Bit 32 bit 32 bit 16 Bit 32 Bit 16 Bit 32 Bit 8 bit 16 bit 32 bit Deer Aral -32768....+32767 0...65535 -2147483648.........+2147483647 0...4294967295 -32768....+32767 -2147483648........+2147483647 0...65535 0...4294967295 0-255 0...65535 0...4294967295

Her deiken tipi verilen aralkta bulunan bir deeri alabilir. Integer ve unsigned tipleri, deikenlerin tanmland bilgisayar veya sistemlere gre deien aralktaki deerleri alrlar. Domain tanm yaplrken signed veya unsigned kelimeleri byte, word ve dword domainleri ile birlikte kullanlabilirler. Domains i8 = signed byte tanm normalde unsigned olan ve bu yzden 0-255 aralndan deer alan byte yerine -128...+127 deerleri arasnda deer alan bir tip haline gelir.

24

3.8.1. Char aretsiz bir byte olarak kullanlr. rnek: A, b... 3.8.2. Real +/- DDDD.DDDD eklinde olan 8 bitlik bir deiken. (1*10- 307-1*10+308) 3.8.3. String 255 karakter uzunluunda olabilen bu tipin iki format vardr. a) veya altizgiden oluur. b) oluur. rnek rnekler: Ad_soyad, Mterinin Ad, Fox Ltd. 3.8.4. Symbol Format stringler ile ayndr. Symbol ve string deikenler birbirinin ayns olmakla beraber, VIP bunlar farkl ekillerde depolar. Symbol tipleri bir tabloda saklanr. Adresleri ise nesneleri temsil edecek ekilde saklanr. Bylece eletirme ileminde hzl kullanlrlar. Fakat karlatrmalarda String tipler karakter baznda eletirilir. 3.9. Yklemlerdeki Argmanlarn Yazlmas Predicates blmndeki bir argmann tipini tanmlamaya, argman tipi tanmlama denilmektedir. Hasan, 28 yanda olan bir erkektir = sahis(hasan, erkek, 28). Sahis bu argmanlarla birlikte kullanan bir yklem olarak tanmlamak iin aadaki satrn predicates blmnde yazlmas gerekir. sahis(symbol, symbol, unsigned) Grld gibi her argman da standart tipte tanmlanmtr. Yani, program ierisinde her ne zaman sahis yklemi geerse, bu yklemi sadece 3 argmanla birlikte kullanlabilir. Bunlarn ilk ikisi symbol, ncs ise unsigned tipinde bir integer olmaldr. ift trnak arasna alnm karakterlerden lki kk harf olmak zere harf, say

25

Alfabedeki bir harfin yerini belirleyen alfabedeki_yer(Harf, Yer) eklinde bir ilikiyi incelendiinde, Harf ve Yer argmanlarnn her ikisi de deiken olarak tanmland grlr. Bylece Harf=a ise Yer=1, Harf=b ise Yer=2 vs. eklinde devam eder. Bu durum ksaca yle ifade edilebilir. alfabedeki_yer(Bir_harf, N). Bunun iin yazlmas gereken olgular: alfabedeki_yer(a, 1). alfabedeki_yer(b, 2). alfabedeki_yer(c, 3). ........... alfabedeki_yer(z, 29.) eklinde olmaldr. PREDICATES alfabedeki_yer(char, integer) CLAUSES alfabedeki_yer(a, 1). alfabedeki_yer(b, 2). alfabedeki_yer(c, 3). GOAL alfabedeki_yer(c, Nerede). Program altrldnda c harfinin yerini veren Nerede deikeni 3 deerini alr. 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 GREL", "3134578"). telefon_numarasi("Husamettin BULUT", "3145869"). telefon_numarasi("Kasim YENIGN", "3174152"). Bu program, aadaki sorgularla veya yenileri ilave edilerek altrlabilir. GOAL telefon_numarasi(Kimin_Telefonu, "3145869"). GOAL telefon_numarasi("Orhan AYDIN", Telefon_Numarasi).

26

GOAL telefon_numarasi(Telefon_Sahibinin_Adi, Telefon_Numarasi). rnek: Ekrandan girilen bir karakterin harf olup olmadn kontrol eden bir program yaznz. (Not: char tipi sadece bir tek karakteri tanmlar) REDICATES nondeterm aranan_harf(char) CLAUSES aranan_harf(Harf):a<=Harf, Harf<=z. aranan_harf(Harf):A<=Harf, Harf<=Z. GOAL aranan_harf(x). aranan_harf(2). aranan_harf(Merhaba). aranan_harf(a). aranan_harf(x). Yukardaki program, verilen bir karakterin alfabenin bir harfi olup olmadn test etmektedir. Yazlan sorgular kullanarak elde edilen sonular inceleyiniz. Baz klarda neden hata verdiini bulmaya alnz. Predicate blmnde ayn isimde birden fazla yklem tanmlanabilir. Fakat bunlarn argmanlarnn farkl sayda olmas gerekir. Predicates ve Clauses blmlerinde ayn isimde olanlarn birlikte gruplanmalar gerekir. Bu yklemler, tamamen farklym gibi ilem grrler. rnek: DOMAINS sahis=symbol PREDICATES baba(sahis) %Buradaki ahs bir babadr. baba(sahis, sahis) %Buradaki birinci kii ikinci kiinin babasdr. CLAUSES baba(Insan):-,

27

baba(Insan, _). baba(ahmet, mehmet). baba(omer, yavuz). 3.10. Kurallarn Yazm Biimi VIPde kurallar, Ba ve Gvde olmak zere iki ksmdan meydana gelir. Genel Biim: Ba:- <alt hedef1>, <alt hedef2>,......, <alt hedefN>. Alt hedefler biribirinden , ile ayrlr ve sonuncusu nokta ile biter. Alt hedeflerin her biri ayr bir yklem arr. Alt hedefin doru olup olmad kontrol edilir. Sonu ne olursa olsun, bu ilem btn alt hedeflere uygulanr. Alt hedeflerin tamamnn olumlu netice vermesiyle beraber o kuraln doruluu ispatlanm olur. Sadece bir alt hedef bile yanl olursa, btn kural yanl olur. 3.11. Prolog ve Dier Dillerdeki if Komutunun Karlatrlmas VIPde ba ve gvde ksmn ayran :- sembol if anlamna gelir. rnein Pascaldaki if komutu, ncelikle if komutundan sonra gelen ifadenin doru olup olmadn kontrol eder. Eer ifade dorulanrsa, komut then ifadesinden sonraya geer geer. Yani if x>10 then writeln(Bu ilem tamam); satrnda ncelikle x deikeninin 10dan byk olup olmad kontrol edilir. Eer sonu doru ise Bu ilem tamam satr grntlenir. Aksi takdirde program bir alt satrdan itibaren almaya devam eder. Bu tip ifadeye if/then artl denir. VIP ise bunun tam tersi olan bir sistem uygular. ncelikle gvdedeki alt hedeflerin doru olup olmadna baklr. Tamam olumlu sonu verirse, kuraln gvde ksmnn doruluu ispatlanm olur. Bu ise VIPda then/if artnn geerli olduunu gsterir. 3.12. Otomatik Tip Dntrmeler VIPde iki deiken karlatrldnda her ikisinin de ayn tipte olmas her zaman gerekmez. Deikenler bazen baka tiplerdeki sabit deikenlere de atanabilir. nk VIP aadaki tipler arasnda otomatik olarak tip dntrmesini yapar. string ve symbol

28

tablosundaki karl olur.

Btn integral tipler ve reel deikenler.

Bir karakter saysal bir deere dntrlrken, bu karakterin karl, saynn ASCII rnein string tipindeki bir agman symbol tipi ile uyumludur. Benzer ekilde integer olarak tanml bir tip real, char, word etc. Tipleriyle uyumludur. Bu tr tip deiiklii u kolaylklar salar: tipindeki bir argmanla arlabilir. tipindeki bir argmanla arlabilir. tipindeki bir argmanla arlabilir. bilinmeden de rahatlkla kullanlabilir. Argmanlar, tanml olduklarnn dnda bir tipe dnrken ne gibi kurallarn etkili olduu, sonuta ortaya kan argmannn hangi tipte olaca konusu ileride incelenecektir. 3.13. Bir Programn Dier Blmleri imdiye kadar VIPdaki clauses, predicates, domains ve goals blmleri incelenmi ve bol miktarda rnek verilmitir. imdi database, constants ve global blmlerine ksa bir giri yaplacaktr. 3.13.1. Database Blm Bir VIP programnn gerekler ve kurallardan olutuu bilinmektedir. Program alrken bazen kullanlan gerek ve kurallar deitirmek, gncellemek, ilave yapmak veya karmak gerekebilir. Byle bir durumda gerekler, dinamik bir dahili veritaban oluturur. Program alrken deitirilebilecek gereklerin tanml olduu blme database blm denilmektedir. Alfabetik karakterler ASCII deerleri char tipiyle tanml bir yklem integer real tipiyle tanml bir yklem integer string tipiyle tanml bir yklem symbol

29

3.13.2. Constants Blm Dier dillerde olduu gibi VIPde de sabit deikenler kullanlabilir. Bu deikenler constants blmnde tanmlanr. Her bir satra sadece tek bir sabit yazlabilir. constants yuz=(10*(10-1)+10) pi=3.14159265 maas_katsayisi=4 mavi=5 Program derlenmeden nce her sabit deikenin karsndaki string olduu gibi atanr. rnek: A=yuz*34, bekle(A) eklindeki A deikenine yuz sabiti yerine 100 deil, yuz sabit deikeninde tanml ekliyle (10*(10-1)+10) deeri atanr. Sembolik sabitlerin yazmnda u kurallar geerlidir: Yani sayi= 2*sayi/2 yanltr. Byk veya kk harfle balayan sabit deikenler, farkl olarak ilem grmezler. Bu yzden byk harfle balayan sabit bir deiken clause veya goal blmnde kk harfle balatlmaldr. Bylece byk harfle balamalar zorunlu olan normal deikenlerle karmazlar. rnek: constants iki=2 goal A=iki, write(A). tanmlanm olmalar gerekir. kez tanmlanabilir. Tanmlanan sabitler tanmlanan noktadan balayp programn sonuna kadar ayn deerde kalrlar. Bir sabit deiken sadece bir Bir programda birden fazla constants blm olabilir. Fakat programda kullanlmadan nce bu deikenlerin mutlaka Sabit bir deiken kendisini aramaz.

30

3.13.3. Global Blm VIPde imdiye kadar tanmladmz domains, predicates ve clauses blmleri tamamen lokal idi. Bunlar global yapmak iin programn en banda global domains, global predicates vs. blmler oluturulabilir. Bu konu daha sonra incelenecektir. 3.14. Derleyici Direktifleri VIP, yazlan bir program parasnn derleme srasnda belirtilen ekilde ilem grmesi iin baz direktiflerin kullanlmasna imkan tanr. Bu seenekler mendeki Options/Compiler Directives balndan ayarlanabilir. 3.14.1. Include Direktifi Bu direktif daha nce yazlan bir program parasnn veya prosedrn her arldnda ayn program ierisinde tekrar tekrar kullanlmasn salar. Bu durum basit bir rnek zerinde aklanmaktadr. inde en sk kullanlan tip ve yklemlerin bulunduu TEST.PRO isminde bir programn olduunu varsayalm. Hazrlanan baka bir programda bu program arlp kullanlmak istendiinde, kullanlan include test.pro bir derleyici direktifidir. Ana program derlendii zaman VIP test.pro isimli program derleyip ana programa ilave eder. Include direktifiyle tanmlanan bir programda da baka bir include satr bulunabilir ve o da baka bir program arabilir. Fakat bir programda bir dosya sadece bir kez include dosyaismi.pro eklinde kullanlabilir. 3.15. Blm zeti 1. domains argman1,...,argmanN=tip predicates yklem_ismi(argman1,..., argmanN) clauses kurallar ve gerekler Bir VIP programnn yaps u ekildedir:

31

GOAL alt_hedef1, alt_hedef2, ........, alt_hedefN 2. ushort, word, integer vs. 3. Yazlm olan gerek ve kurallar inceleyerek doruluunun salanmas istenilen Goal (sorgu), programn iine yazlmas gerekir. Bu dahili bir sorgudur. Harici olarak tanmlanacak olan bir sorgu program alrken alan Dialog penceresine yazlr. 4. 5. Ayn isimde fakat farkl sayda argman Kurallar Ba:alt_hedef1, tayan yklemler tamamen farkl yklemlermi gibi ilem grr. alt_hedef2, ........., alt_hedefN genel ekliyle yazlr. Bir kuraln istenilen sonucu vermesi iin alt hedeflerin tamamnn dorulanmas gerekir. 6. if/then eklinde tanmldr. Prologdaki if komutu dier dillerdeki if komutundan farkldr. Prologda then/if eklinde tanml olan bu komut dier dillerde Domains blmnde kullanlacak deikenlerin tipleri tanmlanr. VIPda kullanlabilecek baz tipler: char, byte, short,

32

4. ELETRME VE GERYE Z SRME VIP bir alt hedeften gelen bir ary clauses blmnde tanml bir cmle ile karlatrmaya alrken belirli bir ilem kullanr. Bu ileme eletirme denir. Bir program alrken Goal yazdi(X,Y). sorgusunun kullanldn kabul edilsin. Bu sorgunun doruluunu aratrrken, clauses blmdeki btn yazdi(X,Y) cmlecikleri eletirme ilemi iin test edilir. Goal yazdi(X,Y) ifadesindeki X ve Y argmanlar, clauses blmndeki yazdi(...) cmlecikleriden kontrol edilir. Bunun iin btn cmlecikler tek tek incelenir. Sorguyla eleen bir cmle bulunduu zaman cmledeki deer serbest olan deikene atanr ve bylece cmle ile goal elemi olur. Bu duruma sorgunun cmle ile elemesi, bu ileme de eletirme denilir. rnek DOMAINS kitap_adi, yazar = symbol sayfa_sayisi PREDICATES kitap(kitap_adi, sayfa_sayisi) nondeterm yazdi(yazar, kitap_adi) nondeterm roman(kitap_adi) CLAUSES yazdi(eco, "Gln Ad"). yazdi(tolstoy, "nsan Ne le Yaar"). kitap("nsan Ne le Yaar ", 245). kitap("Gln Ad", 760). roman(Kitap_adi):Sayfa_sayisi> 400. GOAL yazdi(Yazar, Kitap_adi). Sorgudaki Yazar ve Kitap_adi deikenleri serbest deikenler olduklarndan herhangi bir argmana eitlenebilirler. Dolaysyla sorgu clauses blmndeki ilk yazdi cmlesi ile eleir. Yani yazdi(Yazar, Kitap_adi) cmlecii yazdi(eco, Gln Ad) olur. Burada Yazar=eco, Kitap_adi=Gln Ad deerini alr. Ayn ilem btn yazdi(_, Kitap_adi), kitap(Kitap_adi, Sayfa_sayisi), = unsigned

33

alternatif zmler iin tekrar edileceinden, Yazar ve Kitap_adi deikenleri srasyla tolstoy ve nsan Ne le Yaar deerlerini de alr. Yani sonuta 2 zm bulunur. GOAL roman(Roman_adi) arsnn nasl alt incelenecektir. Bir arnn bir olgu veya kuraln ba ksmyla eleip elemedii kontrol edilir. Yani kuraln ba ksm olan roman(Kitap_adi) ksmyla eleir. Kullanlan olgudaki argmanlar eletirilir. X argman bal olmad iin herhangi bir argmanla eleebilir. Kuraln ba olan roman(Kitap_adi)nda, Kitap_adi argman bamsz bir deikendir. Kuraln bayla sorgu ksm eletirilir. VIP, eletirme yapldktan sonra alt hedefleri srasyla dorulamaya alr. roman(Kitap_adi):yazdi(_, Kitap_adi), kitap(Kitap_adi, Sayfa), Sayfa>400. GOAL roman(Roman_adi) kodunda ilk nce yazdi(_,Kitap_adi) ksm sorgulanr. Buradaki ilk argman anonimdir. Dolaysyla ilk olgudaki eco ve Gln Ad _ ve Kitap_adi argmanlaryla eleir. Bundan sonra kitap(Kitap_adi,Sayfa_sayisi) cmleciindeki kitap olgusuna ar yaplr. lk cmlecikteki eco ve Gln Ad deerlerini alr. lk alt hedef doruland iin sonraki adm olarak kitap(Kitap_adi, Sayfa_sayisi) alt hedefine geilir. Kitap_adi argman Gln Ad deerine bal hale geldii iin ar kitap(Gln Ad, Sayfa_sayisi) eklinde devam eder. Programn bandan balayan sorgu kitap(Gln Ad, 760) cmleciinde eletirme yapmaz. nk ilk argman Gln Ad olmutu. kinci cmlecik sorguyu dorular ve Sayfa_sayisi 760 deerini alr. Sayfa_sayisi>400 alt hedef halini alr. 760 deeri 400den byk olduu iin alt hedef dorulanr ve bylece btn hedef dorulanm olur. Sonuta u mesaj grntlenir: Roman_adi=Gln Ad 1 Solution 4.1. Geriye z Srme Gerek problemlere zm ararken, verilen karar dorultusunda mantkl olan bir yol takip eder, yolun sonuca ulamamas durumunda alternatif bir yol aranr. Mesela bir labirent oyununda k yolunu ararken sola veya saa doru gidilir. kmaz

34

sokaa gelindiinde geriye dner, baka bir yolu takip eder. Bu ynteme gre devam edilirse, sonunda k noktas bulunur. VP, geriye iz srme denilen bu sistemi kullanr. Bir sorgunun doru olup olmad aratrlrken alt hedeflerin herbirinin ayr ayr dorulanmaya allr. VP, dorulama ilemini yrtrken sorgulanmas gereken durumlarn balang noktasna bir iaret koyar. Sonra bu yollarn ilkini dener. Eer olumlu sonu alnrsa ileme oradan itibaren devam eder. Sonucun olumsuz kmas durumunda, iaret konulan yere dner ve ikinci yolu, yani bir sonraki alt hedefi dener. te bu ileriye gidi ve gerektiinde yine geriye dn ilemine Geriye z Srme denir. rnek PREDICATES nondeterm yemeyi_sever(symbol, symbol) nondeterm yemek(symbol) yemegin_tadi(symbol, symbol) CLAUSES yemeyi_sever(besir,X):yemek(X), yemegin_tadi(X, iyi). yemegin_tadi(kebap, iyi). yemegin_tadi(kapuska, kotu). yemek(kapuska). yemek(kebap). GOAL yemeyi_sever(besir, Besirin_Sevdigi_Yemek). Programda iki olgu kmesi, bir de kural bulunmaktadr. Kural, Blentin, tad gzel olan yemeklerden holandn sylemektedir. Sorgunun dorulanmas iin VP ilk satrdan balayarak tarama yapar. Hedefe uyan ilk satr yemeyi_sever(bulent, X) kuralnn ba olduu iin Besirin_Sevdigi_Yemek argman X ile eleir. Bu durumda kuraln geri kalan ksmnn dorulanmasna allr. Buradaki ilk alt hedef yemek(X) cmleciidir. VP alt hedefi dorulamak iin yine programn en bana gider. VP eleen bir olgu ararken yemek(kapuska) cmleciine ular ve burada X deikeni kapuska deerini alr. VIP, buraya geri dn iaretini koyar ve alternatif bir zm ararken hareket edilecek ilk noktann balangc belirtilmi olur.

35

Bir sonraki hedef, yemegin_tadi(X, iyi) alt hedefi olur. X kapuska deerini aldna gre bu cmle yemegin_tadi(lahana, iyi) ekline dnr. Bunun dorulanmas srasnda argmanlar baka bir olguyla elemedii iin bu alt hedef olumsuz olur. Dolaysyla sorgunun bu dorulanmas baarsz olur. te bu noktada VP geri dn iaretini koyduu en son noktaya, yani yemek(kapuska) cmleciine gider. Geri dn noktasna gelindiinde, bu noktadan sonra deer alm olan btn deikenler yeniden serbest hale gelirler. Bu noktadan sonra ilk eleme yemek(kebap) olgusu ile olur ve X deikeni kebap deerini alr. Daha sonraki alt hedef yemegin_tadi(kebap, iyi) olduundan, programn bandan itibaren yaplacak bir taramadan olumlu sonu alnr. nk yemegin_tadi(kebap, iyi) olgusu nceden tanmlanmt. Sonuta grntlenecek mesaj u olur: Besirin_sevdigi_yemek=kebap 1 Solution Geriye z Srme yntemiyle sadece tek zm deil, mmkn olan btn zmler elde edilir. DOMAINS aday=symbol adayin_yasi=integer PREDICATES nondeterm oyuncu(aday, adayin_yasi) CLAUSES oyuncu(ahmet, 10). oyuncu(mehmet, 12). oyuncu(ali, 10). oyuncu(huseyin, 10). GOAL oyuncu(Birinci_oyuncu, 10), oyuncu(Ikinci_oyuncu, 10), Birinci_oyuncu<>Ikinci_oyuncu. VPden yalar 10 olan ocuklar arasnda dzenlenecek bir masa tenisi turnuvas iin muhtemel ikili rakip listesi istensin. Eletirme srasnda yalar 10 olan, fakat kendileriyle elemeyecek ikili gruplar istensin. Geriye z Srme ynteminin nasl altn grmek iin VPnin takip edecei prosedr adm adm yazarsak:

36

1. VP ilk nce sorgunun oyuncu(Birinci_oyuncu, 10) alt hedefini dorulamaya alr. Bu hedef oyuncu(ahmet, 10) cmleciiyle salanm olur. VP hemen ikinci alt hedefi dorulamaya alr. (Bu srada programn en bana dn yaplr) oyuncu(kinci_oyuncu, 10) alt hedefini salamaya alrken yine 10 ya artn birinci cmlecik salar. Dolaysyla kinci_oyuncu argman da ahmet deerini alr. Her iki alt hedef salandktan sonra imdi nc alt hedef salanmaya allr. Yani Birinci_oyuncu<>kinci_oyuncu (Birinci ve ikinci oyuncu ayn kii olmayacak) 2. Oyuncularn her ikisi de ahmet olarak eletii iin bu hedef salanamaz, dolaysyla sorgu baarsz olur. VPnin Geriye z Srme mekanizmas yeniden bir nceki alt hedefi, yani ikinci alt hedefi salamaya ynelir. Bu kez ikinci_oyuncu argman ali deerini alr. 3. nc alt hedef salanm olur. nk ahmet ve ali, yalar 10 olan farkl kiilerdir. Btn alt hedefler salandndan sorgunun tamam baarlm olur. Sonuta oluan ilk ikili Birinci_oyuncu= ahmet, kinci_oyuncu=ali olarak bulunmu olur. 4. VPnin sadece bir zm deil, mmkn olan btn zmleri bulur. Bu yzden 3. alt hedef salandktan sonra baka zm olup olmadn bulmak iin btn alternatifler tkeninceye kadar ikinci alt hedefi sorgulanr. Bu kez ikinci_oyuncu olarak Hseyin seilir. Ahmet ve Hseyin 3. art da salad iin ikinci grup ahmet ve hseyinden oluur. 5. Peki baka zm var m? VP bunu bulmak iin yine ikinci alt hedefe dn yapar. Grld gibi son oyuncu olan Hseyin ile bu an tkenmitir. te bu noktada Geriye z Srme yine ilk alt hedefe dner. kinci eleme oyuncu(ali, 10) cmlesinde olur. kinci oyuncu Hseyin ile eleir. En son alt hedef de saland iin bu kez ali=hseyin ikilisi oluturulur. 6. Baka zm iin VP 2. alt hedefe dner. VP ikinci kez hseyin ismiyle eleme yapar. Fakat kii ayn olduundan sonu alnamaz. Geriye z Srme yntemiyle btn seeneklerin srasyla denenmesi sonucunda u tablo ortaya kar. Birinci_oyuncu=ahmet, kinci_oyuncu=ali Birinci_oyuncu=ahmet, kinci_oyuncu=hseyin Birinci_oyuncu=ali, kinci_oyuncu=ahmet Birinci_oyuncu=ali, kinci_oyuncu=hseyin

37

Birinci_oyuncu=hseyin, kinci_oyuncu=ahmet Birinci_oyuncu=hseyin, kinci_oyuncu=ali 6 Solutions Bulunan sonularn bazlar, isimlerin sadece yer deitirilmesinden olumu ayn ikili gruplardr. Bunu engellemek mmkndr. (Not: Ayn program ile yalar 10 ve 12 olan ikili gruplar bulunuz) 4.2. Geriye z Srme Mekanizmasnn Ayrntlar Aadaki programa bakarak Geriye z Srme ilemenin nasl ilediini anlamaya alalm. DOMAINS isim, sey= symbol PREDICATES sever(isim, sey) okur(isim) merakli(isim) CLAUSES sever(ahmet, limonata):-!. sever(murat, yuzme):-!. sever(murat, kitap):-!. sever(murat, basketbol):-!. sever(Z,kitap):okur(Z), merakli(Z). okur(ahmet). merakli(ahmet). GOAL sever(X, limonata), sever(X, kitap). VP hedefi deerlendirirken, dorulanan ve dorulanamayan alt hedefleri belirler. Yukardaki programa aadaki hedefi gz nne alarak bakalm. Hedef aadaki gibi bir aa dal eklinde gsterilebilir. Dorulanan alt hedefi alt izili halde, bununla eleen cmlecii de bunun hemen altna yazalm.
sever(X,limonata) Sever(X,kitap)

38

4.2.1. Geriye z Srmenin 4 Temel Prensibi Yukardaki rnekte, hedefin gerekletirilmesi iin dorulanmas gereken iki alt hedef vardr. Bunun iin VP drt temel prensibe gre alr: 1. Btn alt hedefler, ilkinden balanmak zere, birer birer dorulanmaldr. Bir cmleciin dorulanmas iin hangi alt hedefin kullanlacana ikinci kurala gre karar verilir. 2. Yklem cmlecikleri (fonksiyonlar) programdaki srasyla, yukardan aaya gre test edilirler. Buna gre yukardaki program alrken sever yklemini salayan sever(ahmet, limonata) cmleciiyle dorulanr. Dolaysyla sever(X, limonata) alt hedefindeki X argman ahmet deerini alr. Daha sonra ikinci alt hedef dorulanmaya allr. Burada bal hale gelen X=ahmet argman kullanlr. Fakat sever(ahmet, limonata) alt hedefi sever(ahmet, kitap) alt hedefine eitlenemez, nk limonata ve kitap ayn deildir. Btn cmleciklerin srayla denenecei iin bir sonraki cmlecik sever(murat, kitap) olacaktr. Fakat X daha nce ahmet deerini ald iin bu k da baarsz olur. Bu yzden bir sonraki sever cmleciinin salanmas gerekir. sever(Z,kitap):-okur(Z), merakli(Z). Z argman bir deikendir ve X deikeni ile eleebilir. Zaten kitap argmanlar da eleir. Dolaysyla hedef, kuraln ba ksmyla elemi olur. Bir alt hedef bir kuraln ba ksmyla eletii zaman, kuraln gvde ksmnn dorulanmas salanmaldr. Bylece kuraln gvdesi dorulanmas gereken bir alt hedefler kmesi oluturur. imdi yeniden rnee dnelim.
sever(X,limonata) okur(Z) sever(X,kitap) merakli(Z)

okur(Z) ve merakli(Z) alt hedeflerinin dorulanmas gerekir. Burada Z deikeninin ahmet deerini ald sylenmiti. imdi ise her iki alt hedefi de salayan sorgulama balayacaktr. Sonuta elde edilecek aa:
sever(X,wine) sever(ahmet,wine) okur(ahmet) merakli(ahmet) sever(X,kitap) sever(Z,kitap) okur(Z) merakli(Z)

4. Hedef aacnn her bir daln salayan bir gerek bulunduu zaman hedef salanm olur. Sonuta

39

X=ahmet 1 Solution cevab grntlenir. Harici bir hedef dorulandktan sonra VPnin, eer varsa, btn alternatifleri bulmak iin alaca sylenmiti. Bir alt hedef baarsz olursa, VP yeniden bir nceki alt hedefe dner. Bu alt hedefi, biraz nce baarsz hale gelen alt hedefi de dorulayacak bir cmlecik ile dorulamaya alr. VP bir alt hedefi salamak iin sorgulamaya yklemi tanmlayan ilk cmlecikten balar. Bu srada aadaki durumlardan biri meydana gelebilir: 1. lk cmlecik verilen yklemle eleir. Bu durumda; a. Alt hedefi dorulama ihtimali olan baka bir cmlecik varsa, Geriye z Srme ileminde kullanlmak zere bu cmleciin yanna bir iaret konur. b. Alt hedefteki btn serbest deikenler cmlecikteki deerleri alr ve bal hale gelirler. c. Eer eleen cmlecik bir kuraln ba taraf ise, hemen kuraln gvde ksm deerlendirilir. Bu durumda gvdedeki btn alt hedeflerin dorulanmas gerekir. 2. Eleen herhangi bir cmlecik bulunmaz ve sorgu baarsz hale gelir. VP bir nceki alt hedefi dorulamak iin geriye iz srer. En son geriye dn noktasna geldiinde, VP geriye dn noktasndan sonra deer alm btn deikenleri serbest hale getirir. Daha sonra alt hedefi yeniden dorulamaya alr. Tarama, programn bandan balar. Geriye z Srme ilemi, daha nce yerletirilen geriye dn noktasndan itibaren balar. Sorgu burada da baarsz olursa, geriye iz srme ilemi tekrar edilir. Btn alt hedef ve cmlecikler iin geriye dn ilemi tamamlandnda sonu elde edilemezse, hedef baarsz olur. Geriye dn ilemi iin baka bir rnek. rnek: PREDICATES nondeterm tur(symbol, symbol) nondeterm canli(symbol, symbol) yasar(symbol, symbol) nondeterm yuzebilir(symbol) CLAUSES tur(tirnakli, hayvan). tur(balik, hayvan)

40

canli(zebra, tirnakli). canli(alabalik, balik). canli(kopekbaligi, balik). yasar(zebra, karada). yasar(kurbaga, karada). yasar(kurbaga, suda). yasar(kopekbaligi, suda). yuzebilir(Y):tur(X, hayvan), canli(Y,X), yasar(Y, suda). GOAL yuzebilir(Ne), write(Bir ",Ne," yzebilir\n"). Program yazlp altrldnda ilk olarak GOAL blm salanmaya allr. imdi yaplacak ilemleri adm adm yazalm: 1. yuzebilir yklemi, Ne serbest deikeni ile arlr. Eleme olup olmadn bulmak iin program tarandnda Ne argman Y deerini alr. 2. Hemen sonra hedefin gvde ksmna geersek tur(X,hayvan) alt hedefinin dorulanmas gerekir. Programn bandan itibaren yaplacak bir taramada tur(tirnakli, hayvan) cmlecii bu alt hedefi salar. Bylece X=tirnakli deerini alr. 3. Burada tur(X,hayvan) alt hedefini salayabilecek birden fazla alternatif olduu iin, tur(tirnakli,hayvan) cmleciinin yanna Geriye z Srme iareti konur. 4. X deikeni tirnakli deerini alnca birinci alt hedef dorulanm olur. Bu kez ikinci alt hedef yani canli(Y, X) dorulanmaya allr. Bu hedef ise canli(Y, tirnakli) olarak salanr. canli(zebra, tirnakli) cmlecii ikinci alt hedefi salar ve Y deikeni zebra deerini alr ve bu hedefi salayan baka cmlecikler de mevcut olduundan, VP bu cmleciin yanna da bir Geriye z Srme iareti koyar. 5. imdi X=tirnakli ve Y=zebra olacak ekilde en son alt hedefin dorulanmas gerekir. yasar(Y, suda) alt hedefinin salanmas iin yasar cmleciklerinin biriyle elemesi gerekir. Fakat cmlecikler arasndan bunu salayan bir gerek olmad iin hedef baarsz olur. 6. VP bu noktada geriye dn iareti koyduu en son noktaya, yani ikinci alt hedef ve canli(zebra, tirnakli) cmleciine dner.

41

7. Geriye dn noktasna geldiinde, bu noktadan sonra deer alm btn deikenler serbest hale gelir. Daha sonra canli(Y, tirnakli) alt hedefine yeni bir zm arar. 8. VP daha nce iaret koyup durduu satrdan balamak zere, geriye kalan cmlecikler arasnda tarama yaparak imdiki alt hedefe uyacak bir zm arar. Programmzda alt hedefi dorulayacak baka bir seenek bulunmadndan, yaplan ar baarsz olur ve VP yeniden bir nceki alt hedefe dner. 9. Bu kez tur(tirnakli, hayvan) hedefini dorulamaya alr. nk geriye dn iareti buraya konulmutu. 10. Btn deikenler serbest hale getirilir ve yeniden tur(X, hayvan) alt hedefine zm arar. Geriye dn noktasndan sonraki tur(balik, hayvan) cmlecii bu hedefi dorular ve X=balik deerini alr. VP bu kez geriye dn noktasn bu cmleciin yanna yerletirir. 11. VP imdi kuraldaki ikinci alt hedefi dorulamak zere aaya doru hareket eder. Bu tarama yeni bir tarama olduu iin tarama yine cmleciklerin bandan, yani canli(Y, tirnakli) cmleciinden balar. 12. deerini alr. 13. 14. Y imdi alabalik deerini ald iin, yasar(alabalik, suda) alt hedefi Cmleciklerde grld gibi, yasar yklemleri arasnda yasar(alabalik, arlr. Bu da yeni bir ar olduu iin program yine batan balar. suda) alt hedefini dorulayacak bir seenek yoktur. Bu yzden ar baarsz olur ve bir nceki alt hedefe yeniden dn yaplr. 15. 16. 17. 18. canli(alabalik, balik) geriye dn noktasna gidilir. Bu noktadan sonra deer aln btn deikenler yeniden serbest hale Bu kez Y=kopekbaligi deeri alt hedefi salar. VP nc alt hedefi yeniden dorulamaya alr. Y kopekbaligi canli(alabalik, balik) cmlecii alt hedefi dorular ve Y=alabalik

geldikten sonra canli(Y, balik) arsna cevap aranr.

deerini ald iin yasar(kopekbaligi, suda) alt hedefinin dorulanmas gerekir. Bu yeni ar dorulanr, nk son cmlecik elemektedir. 19. Alt hedeflerin dorulanmasndan sonra kuraln ba ksm da salanm olur. VP, Y deikeninin ald kopekbaligi deerini yuzebilir(Ne) kuralndaki Ne

42

deikenine atar ve bylece Goal blmndeki write("Bir ",Ne," yzebilir\n") alt hedefi de arlr. Sonu: Bir kpekbal yzebilir Ne=kopekbaligi 1 Solution 4.3. Tarama leminin Kontrol Edilmesi VPde var olan geriye iz srme mekanizmas bazen gereinden fazla tarama yapabilir. Bu ise verimi drr. Bazen verilen bir problem iin sadece bir zm bulmak istenebilir. Bazen de, bir zm bulunsa bile varsa- baka alternatif zmleri de bulmak istenebilir. te bu gibi durumlarda geriye dn ileminin kontrol edilmesi gerekir. Geriye z Srme ilemini kontrol edebilmek iin VPnin iki zelliinden faydalanlabilir. Bunlar,: VPyi geriye iz srme ilemi yapmaya zorlayan fail yklemi ve geriye dn mekanizmasn engelleyen cut ! zelliidir. 4.4. fail Ykleminin Kullanlmas Alt hedeflerden birinin salanamamas durumunda geriye dn ilemi yaplr. Baz durumlarda alternatif zmleri bulabilmek iin bu ilemin yaplmas gereklidir. VPnin fail yklemi, bir sorgunun baarsz olmasna ve bylece geriye dn ileminin yaplmasna imkan tanr. DOMAINS isim=symbol PREDICATES nondeterm baba(isim, isim) herkesi_bul CLAUSES baba("mer ", yavuz). baba(ahmet, kasim). Baba(huseyin, veli). Baba(murat, yusuf). herkesi_bul:baba(X,Y), write(X, Y," Babas\n"),

43

fail. herkesi_bul. GOAL herkesi_bul. Programdaki dahili hedef dorulandktan sonra VPnin geriye iz srmesine gerek yoktur. Bundan dolay baba ilikisine yaplan ilk ar baarl olur ve sadece bir tek zm salanm olur. Fakat yklem blmndeki herkesi_bul yklemi fail zelliini kullanarak Prologu geriye iz srme mekanizmasn kullanmaya zorlar ve mmkn olan btn zmlerin bulunmasn salar. Herkes ykleminin amac, grntlenen cevaplarn daha net olmasdr. Herkes yklemi VPyi zorlayarak, baba(X,Y) kuralnn salanmas iin geriye dn ileminin altrlmasn salar. Daima olumsuz cevap verecei iin fail kuralnn dorulanmas mmkn deildir. Bu yzden VP daima bir stteki alt hedefe geriye dn yapar. Geriye dn olduunda VP, birden fazla zm verebilecek en son hedefe dner. Bu tr bir ar belirsiz (non-deterministic) olarak tanmlanr. Belirsiz bir ar, belirli olan ve sadece bir tek zm sunabilen bir arnn tam tersidir. write ykleminin doruluu yeniden salanamaz, nk yeni zmler sunmaz. Haliyle VP kuraldaki ilk alt hedefe geriye dn yapar. fail yklemini takiben baka alt hedeflerin yazlmas hibir ie yaramaz. nk fail ykleminin kendisi daima baarsz olacandan, fail yklemini takip eden bir alt hedefin sorgulamas mmkn deildir. 4.5. Geriye z Srmeyi Engelleme VPde nlem iareti ile gsterilen (!) cut ykleminden itibaren geriye dn mmkn deildir. Cut yklemi, bir kuraln iinde herhangi bir alt hedefmi gibi yazlr. Program alrken cut alt hedefi daima dorulanr ve ilem bir alt hedefe geer. Bu hedeften nceki alt hedeflere ve cut komutunu ieren alt hedefin kendisine geriye dn artk mmkn deildir. Cut komutu iki ama iin kullanlr: 1. Alternatif zmn mmkn olmadna nceden karar verilirse, vakit ve bellek kaybn nlemek iin bu komut kullanlabilir. Bylece program daha hzl alr. Buna green cut (Olumlu Cut) denir.

44

2. Programn kendi mant cut yklemini gerektiriyorsa, alternatif alt hedeflerin incelenmesini nlemek iin de cut kullanlr. Buna ise red cut (Olumsuz Ik) ad verilmektedir. 4.5.1. Cut Komutunun Kullanm Bu blmde cut komutunun kullanm ile ilgili rnekler zerinde alalm. r1, r2, r3 kurallar r yklemini, a, b, c ise alt hedefleri gsterir. Bir kural iindeki bir alt hedefe geri dn engellemek iin R1:- a, b, !, c. yazlabilir. Yukardaki kuraln anlam udur: Kural ierisindeki a ve b alt hedeflerini dorulayan bir zm bulunduunda program durdur. Bu yzden cut komutunu geip c alt hedefine gemek mmkn deildir. Dolaysyla a ve b iin alternatif zmler mmkn olsa da, sadece bulunan ilk zmle yetinilir. Cut komutu r1 yklemini tanmlayan baka bir cmlecik iine gitmeyi de engeller. rnek PREDICATES araba_satin_al(symbol,symbol) nondeterm araba(symbol,symbol,integer) renkler(symbol,symbol) CLAUSES araba_satin_al(Model,Renk):araba(Model,Renk,Fiyat), renkler(Renk,cazip),!, Fiyat > 20000. araba(murat,yesil,25000). araba(mersedes,siyah,24000). araba(bmw,kirmizi,28000). araba(renault,kirmizi,24000). araba(toyota, sari, 30000). renkler(kirmizi,cazip). renkler(siyah,orta). renkler(yesil,berbat). renkler(sari, cazip).

45

GOAL araba_satin_al(bmw, Hangi_renk). Bu rnein verilmesinin amac, rengi cazip, fiyat da uygun olan bir BMW almaktr. Veri tabannda BMW iin zaten bir satr vardr. Prologun yapmas gereken tek ey, fiyatnn verilen arta uyup uymadn kontrol etmektir. Goal ierisindeki ! komutu, BMW iin fiyat uygun deilse, baka bir araba aranmasn engeller. Program altrldnda Hangi_renk=kirmizi 1 Solution yant alnr. 4.5.2. Geriye z Srmeyi Engelleme Cut komutu, bir yklem iin doru olan bir cmlenin seildiini belirtmek iin de kullanlabilir. r(1):-!, a, b, c r(1):-!, d r(1):-!, c r(_):- write (Cmlelerin tamam buraya yazlr). Cut komutu r yklemini deterministic (belirli) yapar. Dolaysyla r yklemi bir tamsay argman ile arlr. Yaplan arnn r(1) olduunu kabul edelim. Prolog yaplan arya uygun bir eleme ararken, ryi tanmlayan bir cmlecik bulur. Birden fazla zm mmkn olduundan, Prolog ilk cmlecie geri dn noktas iareti koyarak aada doru ileme devam eder ve geri kalan satrlara geer. Olacak ilk ey, cut komutu gemektir. Byle yapmak artk baka bir r cmleciine geri dn ortadan kaldrr ve geri dn noktas ortadan kalkt iin, programn alma hz olduka artar. Bu tr yapnn dier dillerde yazlan Case yaplarna benzedii grlr. Deneme art, kuraln ba tarafnda yazlr. Yukardaki satrlar daha anlalr yapmak iin yle yazalm: r(x):- X=1, !, a, b, c. r(x):- X=2, !, d. r(x):- X=3, !,c. r(_):-write (Cmlelerin tamam buraya yazlr). rnek:

46

PREDICATES arkadas(symbol,symbol) kiz(symbol) sever(symbol,symbol) CLAUSES arkadas(ahmet,fatma):- kiz(fatma), sever(ahmet,fatma),!. arkadas(ahmet,mehmet):- sever(mehmet,futbol),!. arkadas(ahmet,esra):- kiz(esra). kiz(tuba). kiz(fatma). kiz(esra). sever(mehmet,futbol). sever(ahmet,esra). GOAL arkadas(ahmet,Kimin_Arkadasi). Program ak ierisinde Cut komutu kullanlmazsa, yukardaki rnekten iki ayr sonu elde edilir. Yani Ahmet hem Mehmetin hem de Esrann arkadadr. Fakat arkadas iliskisini tanmlayan ilk cmledeki Cut komutu, bu cmlenin dorulanp Ahmetin bir arkadann bulunmas durumunda, artk ikinci bir arkada bulmann gereksiz olduunu vurgular. Bu yzden yukardaki Goal iin sadece Mehmetin Ahmetin arkada olduu cevab grntlenir. 4.6. Determinism ve Cut Yukardaki rnekte arkadas yklemi Cut kullanlmadan tanmlanm olsayd, non-deterministic, yani geriye iz srme ilemiyle birden fazla zm retmesi mmkn bir yklem olacakt. Programlarn ihtiya duyacaklar bellek miktar artacandan, zellikle non-deterministic yklemler ile allrken dikkatli olmak gerekir. VIP nondeterministic yklemleri dahili olarak kontrol etmekle beraber, gvenli bir program yazmak iin check_determ derleyici direktifini kullanmak faydaldr. Eer check_determ programn hemen ilk satrna yerletirilirse, programn altrlmas esnasnda non-deterministic yklemlere gelindiinde bir uyar mesaj grntlenir. Bylece non-deterministic olan bir yklemin gvde ksmnda (body) uygun bir Cut komutu kullanarak yklemi deterministic hale getirebiliriz.

47

4.7. Not Yklemi Genel Not Ortalamas 3.5 olan ve beklemeli olmayan eref rencisini bulman program: DOMAINS isim= symbol gno= real PREDICATES nondeterm seref_ogrencisi(isim) nondeterm ogrenci(isim, gno) beklemeli(isim) CLAUSES seref_ogrencisi(Isim):-ogrenci(Isim,Gno),Gno>=3.5, not(beklemeli(Isim)). ogrenci ("Kasm Yenign", 3.5). ogrenci("Ferit DADEVREN", 2.8). ogrenci("Orhan AYDIN", 3.8). beklemeli("Kasm Yenign"). beklemeli("Ferit DADEVREN"). GOAL seref_ogrencisi(Seref_Ogrencisinin_Adi_Soyadi). Not komutunu kullanrken dikkat edilmesi gereken tek bir kural vardr: Not komutu, sadece alt hedefin doruluunun ispatlanamamas durumunda ilem grr. Serbest deikenli bir alt hedef Not ierisinden arld zaman, Prolog, Free variables not allowed in not or retractall (Not veya retractall ierisinde serbest deikenler kullanlamaz) hata mesajn verecektir. Prologun bir alt hedefteki serbest deikenlere deer atamas iin, bu alt hedefin baka cmlecikle elemesi ve alt hedefin dorulanmas gerekir. Not ieren bir alt hedefteki bamsz deikenleri kullanmann en doru yolu anonim deikenler (_) kullanmaktr. Aada bu konu ile ilgili yanl ve doru rnekler verilmitir: sever(ahmet, Herhangi_Biri):sever(esra, Herhangi_Biri), not(nefret_eder(ahmet, Herhangi_Biri). Burada Herhangi_Biri, nefret_eder(ahmet, Herhangi_biri) alt hedefinin doru olmad ispatlanmadan nce Herhangi_biri argman sever(esra, Herhangi_biri) alt /* Herhangi_Biri kt argmandr*/

48

hedefindeki Herhangi_biri argmanna atanm olur. Dolaysyla yukardaki kod tam olarak arzu edildii gibi alr. Yukardaki ksa program sever(ahmet, Herhangi_biri):not(nefret_eder(ahmet, Herhangi_biri), sever(esra, Herhangi_biri). eklinde yazlacak olursa, ilk nce Not ile balayan cmlecik arlm olur. Not cmlecii iinde serbest deiken tanmlamak mmkn olmad iin, Prolog hata mesaj vermi olur. nk not(nefret_eder(ahmet, Herhangi_Biri) cmleciindeki Herhangi_biri argman serbest deikendir ve hibir deeri yoktur. Programdaki Herhangi_biri yerine anonim deiken olan (_) kullanlsa bile, Prolog yine yanl bir sonu verecektir. sever(ahmet, Herhangi_biri):not(nefret_eder(ahmet, _), sever(esra, Herhangi_biri). nk yukardaki cmlelerden anlalan udur: Eer Ahmetin nefret ettii bir ey bilinmiyorsa ve eer esra Herhangi_birini seviyorsa, Ahmet Herhangi_birini sever. Anlatlmak istenen ey ise udur: Esrann sevdii ve Ahmetin de nefret etmedii Herhangi_biri varsa, Ahmet bu Herhangi_birini sever. Not yklemini kullanrken ok dikkatli olmak gerekir. Yanl kullanm, ya hata mesaj alnmasna ya da program ierisinde mantksz bir yapya neden olacaktr. rnek: PREDICATES Nondeterm alisveristen_hoslanir(symbol) Nondeterm kredi_kartina_sahip(symbol, symbol) kredisi_bitmis(symbol, symbol) CLAUSES alisveristen_hoslanir(Kim):kredi_kartina_sahip(Kim,Kredi_karti),not(kredisi_bitmis(Kim,Kredi_karti)), write(Kim, Kredi_karti, "ile alveri yapabilir\n"). kredi_kartina_sahip(yavuz, visa). kredi_kartina_sahip(yavuz, diners). kredi_kartina_sahip(ahmet, shell). kredi_kartina_sahip(mehmet, masterkart). /*Doru almaz*/ /* Doru almaz*/

49

kredi_kartina_sahip(asaf_bey, akbank). kredisi_bitmis (yavuz, diners). kredisi_bitmis (asaf_bey, masterkart). kredisi_bitmis (yavuz, visa). GOAL alisveristen_hoslanir(Kim). rnek: DOMAINS isim,cinsiyet,meslek,cisim,yardimci,madde = symbol yas=integer PREDICATES nondeterm sahis(isim, yas, cinsiyet, meslek) nondeterm iliskili(isim, isim) ile_oldurdu(isim, cisim) oldurdu(isim) nondeterm katil(isim) sebep(yardimci) uzerinde_leke_var(isim, madde) sahip(isim, cisim) nondeterm birbirine_benzer(cisim, cisim) nondeterm sahip_oldugu_cisim(isim, cisim) nondeterm supheli(isim) /* * * Katil hakkndaki gerekler * * */ CLAUSES sahis(huseyin,55,m,arastirma_gorevlisi). sahis(yavuz,25,m,futbolcu). sahis(yavuz,25,m,kasap). sahis(ahmet,25,m,yankesici). iliskili(fatma,ahmet). iliskili(fatma,huseyin). iliskili(deniz,ahmet). ile_oldurdu(deniz,sopa). oldurdu(deniz).

50

sebep(para). sebep(kiskanclik). sebep(durustluk). uzerinde_leke_var(huseyin, kan). uzerinde_leke_var(deniz, kan). uzerinde_leke_var(yavuz, camur). uzerinde_leke_var(ahmet, cikolata). uzerinde_leke_var(fatma,cikolata). sahip(huseyin,tahta_bacak). sahip(ahmet,tabanca). /* Temel Bilgiler */ birbirine_benzer(tahta_bacak, sopa). birbirine_benzer(demir, sopa). birbirine_benzer(makas, bicak). birbirine_benzer(futbol_sopasi, sopa). sahip_oldugu_cisim(X,futbol_sopasi):-sahis(X,_,_,futbolcu). sahip_oldugu_cisim(X,makas):-sahis(X,_,_,kuafor). sahip_oldugu_cisim(X,Cisim):-sahip(X,Cisim). /* Susan'n oldrld silaha sahip herkesi pheli kabul edilsin */ supheli(X):ile_oldurdu(deniz,Silah) , birbirine_benzer(Cisim,Silah) , sahip_oldugu_cisim(X,Cisim). /* Susan ile ilikisi olan insanlar da pheliler listesine girmeli */ supheli(X):sebep(kiskanclik), sahis(X,_,m,_), iliskili(deniz,X). /* Susan'n, ilikilerinden haberdar olduu bayanlar da pheli listemizde olmal */ supheli(X):sebep(kiskanclik), sahis(X,_,f,_), iliskili(X,Erkek),

51

iliskili(deniz,Erkek). /* pheli, para iin katil olan bir yankesici olabilir */ supheli(X):sebep(para), sahis(X,_,_,yankesici). katil(Katil):sahis(Katil,_,_,_), oldurdu(Olduruldu), Olduruldu <> Katil, /* It is not a suicide */ supheli(Katil), uzerinde_leke_var(Katil,Devam), uzerinde_leke_var(Olduruldu,Devam). GOAL katil(Katil_Kim). 4.8. Prosedrel Adan Prolog Prolog tanmsal yapya sahip bir dildir. Program hazrlarken problem olgular(nceden bilinen gerekler) ve kurallarla tanmlanr. Bunu takiben bilgisayardan zm bulmas beklenir. Pascal, BASIC ve C gibi diller ise tamamen prosedrlere dayanrlar. Bilgisayarn belli bir probleme zm bulabilmesi iin, programcnn, yaplmas gereken ilemleri alt programlar ve fonksiyonlar halinde adm adm tanmlamas gerekir. 4.8.1. Kurallar ve Olgularn Prosedrlere Benzerlii Prologdaki bir kural dier dillerdeki bir procedure olarak grmek mmkndr. rnein sever(ahmet, Birsey):- sever(gul, Birsey). eklindeki bir kural Ahmetin bir eyi sevdiini ispatlamak iin, Gln de ayn eyi sevdiini ispat et anlamna gelir. Ayn ekilde sever(Orhan, Baklava). eklindeki Prolog kural Orhann baklava sevdiini ispat etmek iin dur anlamndaki bir procedure olarak dnmek mmkndr. Burada sever(Kim, Ne)

52

eklinde bir sorgu gelirse, Kim ve Ne serbest deikenleri srasyla Orhan ve Baklava deerlerini alrlar. Case ifadesi, boolean testleri ve goto komutu dier dillerde mevcut olan procedure rnekleridir. Benzer ilemleri, kurallar kullanarak yapabiliriz. 4.8.2. Bir Kuraln Case ifadesi Gibi Kullanlmas Prologdaki Kural ile dier dillerdeki Procedure arasndaki byk farklardan biri, Prologun ayn procedure iin birden fazla alternatif tanmlama imkan vermesidir. Pascaldaki CASE ifadesi kullanyormu gibi, her argman deeri iin farkl bir tanm yazarak oklu tanm kullanabilirsiniz. Prolog kurallar pepee kullanarak eleenleri bulur ve kuraln tanmlad ilemi yapar. rnek: PREDICATES nondeterm basilan_tus(integer) CLAUSES basilan_tus(1):nl, write("1 Tuuna Bastnz."), nl. basilan_tus(2):nl, write("2 Tuuna Bastnz."), nl. basilan_tus(3):nl, write("3 Tuuna Bastnz."), nl. basilan_tus(N):nl, N<>1, N<>2, N<>3, write("Hangi Tua Bastnz Bilmiyorum"), nl. GOAL write("1-3 arasnda bir say yaznz: "), readint(Sayi), basilan_tus(Sayi). rnekte, 1, 2 veya 3 haricindeki rakamlar girildiinde eleme olamaz ve zm bulunmaz.

53

4.8.3. Bir Kural inde Test Yapmak Yukardaki rnekte geen basilan_tus(N) cmleciinde; verilecek herhangi bir deere otomatik olarak Ne atanacaktr. Burada verilen saynn sadece 1-3 aral dnda olmas durumunda Hangi Tua Bastnz Bilmiyorum mesajnn grntlenmesi gerekir. Bu N<>1, N<>2, N<>3 alt hedefleri ile gerekletirilmektedir. Prolog ilk nce yazlan deerin 1-3 arasnda olup olmadn dorulamaya alr. Doru olmadn grnce geriye dn ilemi yapmaya alr. Fakat baka alternatif olmad iin bu cmlenin geriye kalan ksmna gei yapamaz. Basilan_tus ilikisi atanacak olan seeneklere dayanr. Eer basilan_tus ilikisi argman serbest olan bir deiken ile alrsa, GOAL bu cmlelerin hepsiyle eleir ve ilk kural alternatif zmler olarak sunulur. Son cmle ise hataya neden olur. nk bamsz bir deikeni bir say ile eletirmek mmkn deildir. 4.8.4. Cut Komutunun Goto Gibi Kullanlmas Yukardaki rnek vakit kaybna neden olur. nk dorulanan bir kural bulunsa bile, Prologun son kural da test edip baka alternatif aramas gerekir. Prologa alternatif aramaktan vazgemesini sylemek iin Cut komutu kullanlabilir. Bunun sonucu, bize zaman ve bellek tasarrufu salanr. Yukardaki program, imdi de Cut komutu ile yazlsn. PREDICATES nondeterm basilan_tus(integer) CLAUSES basilan_tus(1):- !, nl, write("1 Tuuna Bastnz."), nl. basilan_tus(2):- !, nl, write("2 Tuuna Bastnz."), nl. basilan_tus(3):- !, nl, write("3 Tuuna Bastnz."), nl. basilan_tus(_):- !, write("Hangi Tua Bastnz Bilmiyorum"), nl.

54

GOAL write("1-3 arasnda bir say yaznz: "), readint(Sayi), basilan_tus(Sayi). Cut komutunun ileme girebilmesi iin Prologun iinde Cut bulunan bir kurala gitmesi ve Cut komutunun bulunduu noktaya kadar gelmi olmas gerekir. Cut komutu basilan_tus(X):- X>3, !, write(Yazdnz rakam ok yksek) gibi testlerden nce gelebilir. X>3 alt hedefi doruland anda Cut komutu nemli hale gelir. Burada kurallarn sras olduka nemlidir. 13. rnekte kurallar; arzu edilen sraya gre yazlabilir. nk onlardan sadece biri girilen bir say ile eleir. Fakat Cut kullanlan yukardaki rnekte, bilgisayarn write("Hangi Tua Bastnz Bilmiyorum") kuralna dier kural denemeden nce kesinlikle gemediinden emin olmak gerekir. nk buradaki Cut komutlar red_cut, yani olumsuz cut, grevi grrler ve programn mantn deitirirler. Eer yukardaki programda X<>1, X<>2 ve X<>3 eklindeki karlatrma anahtarlarn tutup her cmleye sadece bir Cut komutu yerletirilirse, buradaki Cut komutlar Green Cut olarak grev yaparlar. Cut, dier programlama dillerinde tpk GOTO komutu gibi grev grr. Cut komutunun kullanm faydaldr, fakat iinde Cut kullanlan programlar anlamak bazen zor olabilir. 4.9. Hesaplanm Deerleri Grntleme Program aknda, ilk bata herhangi bir deeri olmayan argmanlar, daha sonra belirli deerle alrlar. rnein sever(orhan, gulsah). eklindeki bir olgu sever(orhan, Kim) eklindeki bir hedef cmlesindeki Kim argmanna Gulsah deerini atam olur. Yani GOAL sever(orhan, Kim) hedef cmlesindeki Kim argman ilk nce serbest olmasna ramen, sever(orhan, gulsah) olgusunu ard anda olgudaki Gulsah deeri Kim argmanna atanr ve Kim argman snrl hale gelir. rnek: PREDICATES nondeterm ekrana_yaz(integer, symbol) CLAUSES ekrana_yaz(0, sifir).

55

ekrana_yaz(Sayi, negatif):- Sayi<0. ekrana_yaz(Sayi, pozitif):- Sayi>0. GOAL ekrana_yaz(14, Sayinin_isareti). ekrana_yaz ilikisinin ilk argman daima sabit bir say ve bal bir deiken olmak zorundadr. kinci argman ise snrl veya snrsz bir deiken olabilir. lk deikene bal olarak sfr, negatif veya pozitif bir say olabilir. Yukardaki GOAL cmleciinin bulaca cevap elbette yes olacaktr. nk 14 sfrdan byk bir saydr ve pozitiftir. Burada sadece 3. cmlecik dorudur. GOAL ekrana_yaz(14, negatif). Hedef cmlesiyle ayn prosedr takip edilir ve no cevab alnr. Prologun sonu almas incelenirse, lk nce ilk cmlecik incelenir. Belirle ilikisindeki argmanlar, yani 14 ve negatif deerleri, 0 ve sifir deerleriyle elemezler. kinci cmlecie sra geldiinde, Sayi 14e eitlenir fakat sayi<0 testi dorulanamaz. nc argmana gelindiinde bu kez ikinci argmanlar elemez, yani pozitif kelimesi negatif ile eleemez. Anlaml bir cevap almak iin rnein GOAL belirle(14, Sayinin_Isareti) kullanlrsa, Sayinin_Isareti=pozitif 1 Solution cevab alnr. Yukardaki rnein almas esnasnda, ilemler aadaki sra ile yaplacaktr. ekrana_yaz(14, Sayinin_Isareti) hedef cmlesi, ilk cmleciin ekrana_yaz(0, sifir) ksmyla elemez. Bu yzden ilk cmlecik kullanlamaz. 1. ekrana_yaz(14, Sayinin_Isareti) hedef cmlesi ikinci cmleciin ba ksmyla eleir ve Sayi=14, Sayinin_Isareti=negatif olur. Fakat hemen sonraki Sayi<0 yanl olduundan Prolog bu cmlecikten geriye dner ve Sayi=14 deeri iptal edilir. 2. ekrana_yaz(14, Sayinin_Isareti) hedef cmlesi nc cmleciin ba ksmyla eleir ve Sayi=14, Sayinin_Isareti=pozitif olur. Sayi>0 eitlii de saland iin Prolog artk geriye iz srme ilemini yapmaz ve sonucu grntler.

56

5. BAST VE BLEK NESNELER imdiye kadar Prologda kullanlan veri nesnelerinden number, symbol, string gibi birka tip incelenmitir. Bu blmde basit ve bileik veri trlerinin tamam incelenecektir. Standart tip olarak tanmlanabilen veriler, baz bileik veri yaplarn iermezler. Bu yzden farkl veri yaplarna gz atarak, bunlarn domains ve predicates blmlerinde nasl tanmlanabilecei greceiz. 5.1. Basit veri nesneleri Basit bir veri nesnesi, bir deiken veya bir sabitten oluabilir. Sabit, constants blmnde tanmlanan veri tipi deil; char, integer, symbol, string gibi deimeyen bir nesnedir. 5.1.1 Veri Nesneleri Olan Deikenler VIP deikenleri A-Z arasndaki byk bir harf veya (_) ile balamaldr. (Deiken isimlerinde , , , , vs. gibi Trke karakterler kesinlikle kullanlamaz) Yalnz bana kullanlan (_) deikeninin anonim deiken olduunu ve herhangi bir deerle eleebilecei bilinmektedir. Prologdaki deikenler global deil, lokaldir. Yani iki ayr cmlecikte ayn isimle -rnein X- gsterilen bir deiken farkldr. Eleme srasnda birbiriyle eleebilir, fakat temelde birbiri zerinde hibir etkisi yoktur. 5.1.2. Veri Nesneleri Olan Sabitler Sabitler karakter, say veya atom biiminde olabilirler. 5.1.3. Karakterler Karakterler char kelimesi ile gsterilir ve 0-9, A-Z ve a-z, ASCII 127 karakter tablosundaki deerleri alabilirler. Fakat ASCII 32 (boluk) ve daha kk karakterler kontrol amacyla kullanlrlar. Tek karakterlik bir sabit yle yazlr: a 3 * { W A \\=\ \= \225= (ASCII 225)

Bunlarn dnda baka fonksiyonlar olan karakterler de vardr.

57

\n \r \t 5.1.4. Saylar

Yeni satra gei komutu Satr sonu Yatay sekme (tab)

Saylar tamsay ve reel olabilirler. Reel saylar 10-308-10+308arasnda deiirler. rnek: Tamsaylar 10 -77 32034 -10 5.1.5. Atomlar Bir atom symbol veya string olabilir. kisi arasndaki fark genelde Prologun altrld sisteme baldr. Prolog string ve symbol tipleri arasnda otomatik dntrme yapabilir. Dolaysyla symbol ve string tipindeki deikenler birbirinin yerine kullanlabilirler. Fakat programclkta yaygn olan adet, itf trnak () iine alnmas gereken sabitleri string, itf trnak gerektirmeyen sabitleri de symbol olarak kabul etmektir. Symbol: kk harfle balayan ve sadece harf, rakam ve _ karakterlerini ierir. String: ift trnak iine alnabilen ve string sonunu belirleyen 0 (Sfr) hari, herhangi bir karakteri ierebilir. Symbol Yemek A PdcProlog a Visual Prolog Development Center String Yavuz AYDIN 34.96 -32769 4*10+27 Reel Saylar 3.

Ahmetin_babasi 12. Cadde

5.2. Bileik Veri Nesneleri ve Fonksiyon Operatrleri Bileik veri nesneleri, birden fazla paradan oluan verileri tek bir paraym gibi kullanma imkan tanr. Mesela 16 Mays 1998 tarihi gn, ay ve yl olarak 3 paradan

58

oluan bir bilgiyi temsil eder. Bu tr bir bilgiyi tek bir paraym gibi kullanmaya imkan tanyan sabitler vardr. rnek: Domains Islem_tarihi= date(string, unsigned, unsigned) eklindeki bir tanmdan sonra D=date(Mays, 16, 1998) eklinde yazlabilir. Burada D bir olgu deil, symbol veya say gibi kullanlabilecek bir veridir. Bu tr ifadeler genelde bir fonksiyon operatr ve takip eden 3 argman ile balar. Operatrler herhangi bir hesaplama yapamazlar. Sadece bir tr bileik veri nesnelerini tanmlar ve argmanlarn tek veriymi gibi tutulmasna imkan tanr. Bileik veri nesnelerinin argmanlar da bileik olabilir. rnein Dogum_Gunu Kisi AhmetSAGMEN eklinde gsterilen bir tarihi Prologda dogum_tarihi(kisi(Ahmet,SAGMEN),date(Mart,15,1976)) yazlabilir. Bu rnekte dogum_tarihi bileik nesnesinin iki blm vardr: kisi(Ahmet, SAGMEN) ve date(Mart, 15, 1976). Buradaki operatrler kisi ve datedir. 5.3. Bileik Nesnelerin Eletirilmesi Bileik bir nesne basit bir deiken veya kendisine uyan dier bir bileik nesne ile eleebilir. rnein date(Nisan, 18, 1983) eklindeki bir clause tarih clauseuna tam olarak eleir. Ayn ekilde date(Nisan, 18, 1983) date(Ay, Gun, Yil) cmleciinde Ay=Nisan, Gun=18, Yil=1983 deerlerine atanr. 5.4. Bileik Nesneleri Eletirmek in = Sembolnn Kullanlmas VIP iki durumda eletirme ilemi yapar. lki bir Goal veya ar fonksiyonunun bir cmleciin ba ksmyla elemesi durumunda meydana gelir. kincisi ise = iaretinin argmanlar arasnda kullanlmas durumunda meydana gelir. Prolog, eitliin her iki tarafndaki ayn iaretli nesneleri eletirmek iin gerekli balantlar yapar. Aadaki rnekte, soy isimleri ayn olan iki kiiyi bulup her ikisinin adreslerini eitleyelim. eklinde date Mart 15 1976

59

DOMAINS sahis=sahis(isim, adres) isim=isim(adi, soyadi) adres=adres(cadde, sehir, ulke) cadde=cadde(cadde_no, cadde_ismi) sehir, ulke, cadde_ismi=string adi, soyadi= string cadde_no= integer GOAL P1 = sahis(isim(orhan, aydin), adres(cadde(5, "1. Cadde"), "Elazig", "Turkiye")), P1= sahis(isim(_, aydin), Adres), P2= sahis(isim(oktay, aydin), Adres), write("Birinci Sahis =", P1), nl, write("kinci Sahis =", P2), nl. 5.5. Birden Fazla Nesneyi Tek Nesne Olarak Kullanmak Prologda yazlm programlarda bileik nesneleri tek bir nesne gibi kullanmak kolaydr. Bu da programcl olduka kolaylatrr. rnein sahiptir(fatih, kitap(Visual Prolog le Programlama, Prof.Dr. Asaf VAROL)). cmlesi Fatihin Prof.Dr. Asaf Varol tarafndan yazlan Visual Prolog ile Programlama adl bir kitab var anlamndadr. Benzer ekilde; sahip(fatma, sevgili(can)). cmlesi Fatmann, ismi Can olan bir sevgilisi var anlamna gelir. kitap(Visual Prolog le Programlama, Prof.Dr. Asaf VAROL) ve sevgili(can) cmlelerdeki bileik nesnelerdir. Bileik nesne kullanmann nemli bir avantaj, birden fazla argmandan oluan cmleleri sadece bir argman olarak kullanabilmektir. rnek: Basit bir telefon rehberi veritaban program PREDICATES Adres_listesi(symbol, symbol, symbol, symbol, integer, integer) /*(adi, soyadi, telefonu, ay, gun, yil)*/ clauses

60

adres_listesi(davut, yildirim, 3128456, ocak,6, 1978). adres_listesi(maksut, hazneci, 3154878, nisan,14, 1969). adres_listesindeki 5 argman sahis(Adi, Soyadi), dogum_tarihi(Ay,Gun,Yil). eklinde yazmak mmkndr. Yeni ekliyle program yle yazlabilir: Domains Adi= sahis(symbol, symbol) Dogum_tarihi= d_tarihi(symbol, integer, integer) Telefon_no= symbol Predicates adres_listesi(adi, telefon_no, d_tarihi) clauses adres_listesi(sahis(davut, yildirim), 3128456, d_tarihi(ocak,6, 1978)). adres_listesi(sahis(maksut, hazneci), 3154878, d_tarihi(nisan,14, 1969)). imdi yukardaki kk programa birka kural daha ilave edip, doum tarihleri bugnn tarihi ile uyuanlar bulmaya alalm. Programda standart yklem olan date kullanlarak bugnn tarihi bilgisayardan alnacaktr. DOMAINS adi = sahis(symbol,symbol) dogum_gunu = d_gunu(symbol,integer,integer) tel_no = symbol PREDICATES nondeterm tel_listesi(adi,symbol,dogum_gunu) d_gunu_ayini_bul ay_donustur(symbol,integer) d_gunu_ayini_kontrol_et(integer,dogum_gunu) sahsi_yaz(adi) CLAUSES d_gunu_ayini_bul:write("====Bu ay doanlarn listesi ======="),nl, write(" Ad\t\t Soyad\n"), write("=============================="),nl, date(_, Bu_ay, _), /* Tarihi bilgisayardan oku */ /* (Ad, Soyad) */ /* (Ay, Gun, Yl) */ /* Telefon Numaras */ /* (Adi, Soyad)*/ /*(Ay, Gn, Yl)*/ /* Telefon no*/

61

tel_listesi(Sahis, _, Date), d_gunu_ayini_kontrol_et(Bu_ay, Date), sahsi_yaz(Sahis), fail. d_gunu_ayini_bul:write("\n\n Devam etmek iin herhangi bir tua basn "),nl, readchar(_). sahsi_yaz(sahis(Adi,Soyadi)):write(" ",Adi,"\t\t ",Soyadi),nl. d_gunu_ayini_kontrol_et(Yeni_ay,d_gunu(Ay,_,_)):ay_donustur(Ay,Ay1), Yeni_ay = Ay1. tel_listesi(sahis(paki, turgut), "267 78 41", d_gunu(ocak, 3, 1965)). tel_listesi(sahis(arif, gurel), "338 41 23", d_gunu(subat, 5, 1972)). tel_listesi(sahis(mehmet_can, hallac), "512 56 53", d_gunu(mart, 3, 1965)). tel_listesi(sahis(cuma, cetiner), "267 22 23", d_gunu(nisan, 29, 1963)). tel_listesi(sahis(omer, akgobek), "355 12 12", d_gunu(mayis, 12, 1971)). tel_listesi(sahis(fatih, dilekoglu), "438 63 42", d_gunu(haziran, 17, 1970)). tel_listesi(sahis(levent, aksun), "567 84 63", d_gunu(haziran, 20, 1972)). tel_listesi(sahis(cengiz, gok), "255 56 53", d_gunu(temmuz, 16, 1973)). tel_listesi(sahis(kasim, yenigun), "132 22 23", d_gunu(agustos, 10, 1968)). tel_listesi(sahis(husamettin, bulut), "412 48 34", d_gunu(eylul, 25, 1967)). tel_listesi(sahis(arif, demir), "315 24 21", d_gunu(ekim, 20, 1992)). tel_listesi(sahis(sezen, demir), "233 13 12", d_gunu(kasim, 9, 1980)). tel_listesi(sahis(nebahat, arslan), "337 22 23", d_gunu(kasim, 15, 1987)). tel_listesi(sahis(leyla, aydin), "145 41 50", d_gunu(aralik, 24, 1940)). ay_donustur(ocak, 1). ay_donustur(subat, 2). ay_donustur(mart, 3). ay_donustur(nisan, 4). ay_donustur(mayis, 5). ay_donustur(haziran, 6). ay_donustur(temmuz, 7).

62

ay_donustur(agustos, 8). ay_donustur(eylul, 9). ay_donustur(ekim, 10). ay_donustur(kasim, 11). ay_donustur(aralik, 12). GOAL d_gunu_ayini_bul. Yukardaki program kodu incelendiinde, bileik nesnelerin neden faydal olduu aka grlr. Dogum_tarihi_ayi yklemi, en youn kullanlan cmle durumdadr. 1. Program ilk nce sonular bir pencerede grntler. 2. Sonra sonularn yorumlanaca bir balk ksm grntlenir. 3. Daha sonra hazr fonksiyonlardan biri olan date kullanlarak bilgisayarn saatinden bugnk tarih okunur ve ay belirlenir. 4. Bundan sonra yaplmas gereken tek ey, satrlar halinde sralanan veritabanndan isim, telefon no, doum tarihi okutmaktr. Burada doum tarihi sistemden okunan ay ile karlatrlp ayn olanlar bulunur. adres_listesi(Sahis,_, Date) ars ad ve soyadn Sahis deikenine atar ve sahis operatr Sahisa atanm olur. Date deikeni de ilgili ahsn doum tarihini alr. Buradaki adres_listesi bileik bir deiken olup, bir kii hakkndaki btn bilgileri saklar. 5. Daha sonra aranan kiinin doum tarihini Date deikenine atar. Bir sonraki alt hedefte tamsayyla gsterilen bugnk ay ve kiinin doum tarihi dogum_gununu_kontrol_et yklemine iletilir. 6. dogum_gununu_kontrol_et yklemi iki deikenle birlikte arlr. lk deiken bir tamsayya, ikincisi ise dogum_tarihine balanr. dogum_gununu_kontrol_et kuraln tanmlayan kuraln ba ksmndaki Bu_ay Mon deikenine atanr. kinci argman olan Date ise dogum_tarihi(Ay, _,_) cmleciine atanr. Sadece bugnk tarihten ay ile ilgilendiimiz iin, gn ve yl iin anonim deikenler kullanlmtr. 7. dogum_gununu_kontrol_et yklemi ayn sembolik deerini tam sayya dntrr ve bu deeri sistemden okunan ay deeri ile karlatrr. Karlatrmann baarl olmas durumunda bir sonraki alt hedefe geer. Karlatrma baarsz olursa geriye iz srme ilemi balar.

63

8. lenmesi gereken bir sonraki alt hedef adini_yazdr. stenilen bilgi, doum tarihi bu ay olan kiinin ismi olduu iin, ekrana bu kiinin ad ve soyad yazlr. Bir sonraki cmle fail olduu iin otomatik olarak geriye iz srme ilemi balar. 9. Geriye iz srme daima en son kullanlan non-deterministic ykleme geri gider. Bizim programmzda zaten non-deterministic bir yklem bulunduu iin ilem hemen adres_listesine gider. Program burada ileme konmak zere baka bir isim aramak iin veritabanna gider. Eer veritabannda ileme konacak baka biri kii yoksa ilemdeki cmle baarsz olur. Prolog, veritabanndaki dier satrlar inceler ve dogum_gununu_kontrol_et kuraln tanmlayan baka bir cmle bulur. 5.6. Bileik Nesnelerin Tiplerini Tanmlamak Bu blmde bileik nesne tiplerinin nasl tanmlanaca zerinde duralm. sahiptir(ahmet, kitap(Pascal 7, mer AKGBEK)) sahiptir(ahmet, at(firtina)). eklinde tanmlanan ilikiler GOAL sahiptir(ahmet, Ne) sorgusuyla irdelenirse Ne deikeni iki ayr argman ile eleebilir. Bunlardani biri kitap, dieri ise attr. Sahiptir yklemi artk sahiptir(symbol, symbol) eklinde tanmlanamaz. kinci argman symbol tipindeki nesnelere iaret etmez. Bunun yerine sahiptir(isim, esyalar) eklinde bir yklem tanmlamak mmkndr. Tipleri tanmlarken Domains esyalar= kitap(kitap_adi, yazar); at(atin_adi) kitap_adi, yazar, atin_adi = symbol yazlabilir. Yukardaki ; iareti veya anlamna gelir. Bu durumda iki alternatiften bahsetmek mmkndr. Bir kitap, kitabn ad ve yazarnn adyla, bir at ise sadece ismiyle tanmlanabilir. Kitap_adi, yazar, atin_adi deikenlerinin tamam symbol tipindedir. Tip tanmlanmasna daha fazla alternatif rahatlkla ilave edilebilir. rnek DOMAINS esyalar= kitap(kitap_ismi, yazar); at(atin_adi); araba; banka_hesabi(nakit)

64

kitap_ismi, yazar, atin_adi=symbol nakit = real isim=symbol PREDICATES nondeterm sahiptir(isim, esyalar) CLAUSES sahiptir(ahmet, kitap("Pascal 7.0", "mer AKGBEK")). sahiptir(ahmet, at(firtina)). sahiptir(ahmet, araba). sahiptir(ahmet, banka_hesabi(1000)). GOAL sahiptir(Kim, Sahip_oldugu_esyalar). Program derlenip altrldnda Sahip_oldugu_esyalar=kitap(Pascal 7.0, mer AKGBEK)). Sahip_oldugu_esyalar=at(firtina)). Sahip_oldugu_esyalar=araba Sahip_oldugu_esyalar= banka_hesabi(1000)). 4 Solutions cevab grntlenir. 5.7. Tip Tanmlamalar zerine Ksa Bir zet Bileik nesnelerin tip tanmlar genel bir ekilde gsterilecek olursa: Domain= alternatif1(Tip, Tip, ......); alternatif2(Tip, Tip, .....) Burada alternatif1 ve alternatif2 farkl operatrlerdir. (Tip, Tip, ...) gsterimi standart veya baka yerde ayrca tanmlanan symbol, integer, real vs. gibi tip isimlerdir. Not: 1. Alternatifler birbirinden daima ; ile ayrlrlar. 2. Her alternatif bir operatr ve bu argmana ait tip tanmlarn ierir. 3. Eer operatrde herhangi bir argman kullanlmazsa, bunu alternatifN veya alternatifN( ) biiminde yazlabilir.

65

5.8. oklu-Dzey Bileik Nesneler Prologda, birden fazla dereceden oluan bileik nesne kullanmak mmkndr. rnein kitap(Atatrk: Bir Milletin Yeniden Douu, Kinross) olgusundaki Kinross soyismi yerine, yazarn adn ve soyadn ayrntl olarak gsteren bir yap kullanmak mmkndr. kitap(Atatrk: Bir Milletin Yeniden Douu, yazar(Lord, Kinross)) Daha nceden yaplan tip tanmnda kitap(kitap_adi, yazar) yazlyordu. kinci argman olan yazar, operatr durumundadr. Fakat yazar=symbol sadece bir isimi kapsadndan, yetersiz kalr. Bu durumda yazar deikeninin de bileik nesne olarak tanmlanmas gerekir. Bunu da: yazar=yazar(isim, soyisim) eklinde tanmlamak mmkndr. imdi tip tanmlarna geelim. Domains esyalar=kitap(kitap_adi, yazar); yazar=yazar(adi, soyadi) kitap_adi, isim, soyisim=symbol kullanmak byk kolaylk salar. Kitap Kitap_adi sim, rnein kitap=kitap(kitap_adi, yazar(adi, soyadi)) eklindeki tip tanm yanltr. 5.9. oklu-Tipli Argmanlar Bir yklemin farkl tiplerde bilgi verebilmesi iin bir operatr tanmnn yaplmas yapmamz gerekir. Aadaki rnekte sizin_yasiniz cmlecii yas argmann kabul edilmektedir. Yas argman ise string, real veya integer olabilir. yazar soyisim /*lk derece*/ /*ikinci derece*/ /*nc derece*/

Birden fazla dereceden oluan bileik nesneler kullanrken, aa biiminde bir yap

Tip tanm yaplrken bir anda aa yapsnn sadece bir derecesi kullanlabilir.

66

DomaIns yas=i(integer); r(real); s(string) Predicates siniz_yasiniz(yas) CLAUSES sizin_yasiniz(i(Yas)):-write(Yas). sizin_yasiniz(r(Yas)):-write(Yas). sizin_yasiniz(s(Yas)):-write(Yas). 5.10. Listeler retim yelerinin verdikleri dersleri liste halinde saklamak istediimizi kabul edelim. Bunun iin aadaki kodun yazlmas yeterlidir. PREDICATES profesor(symbol, symbol,symbol) /*Ad, soyad ve verdii ders*/ CLAUSES profesor(asaf, varol, bilgisayar). profesor(ali, erdogan, betonarme). profesor(ahmet, aydogan, fizik). Bu tr bir programda, btn hocalarn isimlerini ve verdikleri dersleri tek tek sralamak mmkndr. Her hoca iin ayr bir olguyu veritabanna ilave etmek gerekir. Kolay grnen bu iin yzlerce retim yesi olan bir niversite iin yapldnda ne kadar zor olduunu aktr. Prologdaki liste bir veya daha fazla deer alabilir ve benzer ilerde byk kolaylklar salar. Bir listedeki deikenlerin aldklar deerleri [] arasnda yazmak gerekir. DOMAINS dersler=symbol* PREDICATES profesor(symbol, symbol, dersler) CLAUSES profesor(asaf, varol, [bilgisayar, termodinamik, iklimlendirme]). profesor(ali, erdogan, [betonarme, statik, malzeme]). profesor(ahmet, aydogan, (fizik, matematik, kimya]).

67

eklindeki satrlarda dersler liste tipinde bir deiken olarak tanmlanmtr. Buradaki * sembol dersler deikeninin liste tipinde olacan gsterir. Ayn biimde, listenin tamsaylardan olutuu bir deiken tipi Domains tamsayilar_listesi=integer* eklinde tanmlanabilir. rnek: DOMAINS notlar=integer* PREDICATES nondeterm sinav_sonuclari(symbol, symbol, notlar) CLAUSES sinav_sonuclari(orhan, aydin, [78, 98, 100]). sinav_sonuclari(kasim, yenigun, [45, 54, 60]). sinav_sonuclari(husamettin, bulut, [80, 90, 95]). sinav_sonuclari(huseyin, karasu, []). GOAL sinav_sonuclari(orhan,_,Aldigi_Notlar). Program altrldnda Orhann ald notlar grntlenir.

68

6. TEKRARLAMA VE REKRSYON Prosedr ve veri yaplarnda tekrarlama ilemleri Visual Prologda kolay bir ekilde yaplr. Bu blmde nce tekrarl ilemler (dngler ve rekursif prosedrler), daha sonra ise rekursiv veri yaplar incelenecektir. 6.1. Tekrarl lemler Pascal, BASIC veya C gibi konvansiyonel programlama dilleriyle alanlar, Prologla almaya baladklarnda FOR, WHILE, REPEAT gibi ifadeleri gremeyince arabilirler. nk Prologda iterasyonu anlatan direkt bir yol yoktur. Prolog sadece iki trl tekrarlama-geriye dn imkan tanr. Bu ilemlerde bir sorguya birden fazla zm bulmak ve bir prosedrn kendisini ard rekrsiyon ilemine imkan tanr. 6.2. Geriye z Srme Bir prosedr, istenilen bir hedef iin uygun bir zm yerine alternatif baka zmler aramak iin geriye dner. Bunun iin geriye henz denenmemi bir alternatifi kalan en son alt hedefe gidileceini, bu noktadan tekrar aaya doru inilecei bilinmektedir. Geriye dn iptal edip tekrarl ilemler yaptrmak mmkndr. rnek: PREDICATES nondeterm ulke_adi(symbol) ulke_adlarini_yaz CLAUSES ulke_adi("Trkiye"). ulke_adi("Kazakistan"). ulke_adi("Azerbaycan"). ulke_adi("Amerika"). ulke_adlarini_yaz:ulke_adi(Ulke), write(Ulke), nl, fail. ulke_adlarini_yaz. GOAL ulke_adi(Ulke).

69

Yukardaki ulke_adi yklemi sadece lke isimlerini sralar. Dolaysyla GOAL ulke_adi(Ulke) eklindeki bir hedefin birden fazla sonucu vardr ve ulke_adlarini_yaz yuklemi bunlarn hepsini grntler. ulke_adlarini_yaz :- ulke_adi(Ulke), write(Ulke), nl, fail. satryla sylenmek istenen ey udur: Btn lke isimlerini yazmak iin, nce ulke-adi(Ulke) cmlesine cevap bul, bunu yaz, yeni bir satra ge ve ilemi yeniden balat. fail komutunun programa ykledii grev yle zetlenebilir: GOAL cmlesine uygun bir zm bulunduunda, geriye dn yap ve baka alternatiflere bak. fail yerine, sonucu daima yanl olan ve bu yzden geriye dn zorlayan baka bir alt hedef kullanmak mmkndr. rnein, 10=5+6 satr her zaman yanl olaca iin, Prolog baka alternatifler bulmak iin daima geriye dn yapar. rneimizde ilk nce Ulke=Trkiye olur ve sonu ekrana yazlr. fail komutuna sra geldiinde program, bir alt hedefe geri dner. Fakat nl veya write(Ulke) satrlar iin kullanlabilecek herhangi bir veri olmad iin, bilgisayar ulke_adi(Ulke) ilikisi iin baka zmler arar. Ulke_adi(Ulke) ilikisi altrldnda, nceden bo deiken olan Ulke deikeni Trkiye deerini almt. Bu yzden bu ilikiyi yeniden kullanmadan nce Ulke deikeni yeniden serbest hale getirilir. Daha sonra Ulke deikeninin alabilecei baka bir olgu aranr. kinci oluguda bu salanr ve ulke_adi yklemindeki Ulke deikeni Kazakistan deerini alr. Bu ilem bylece devam eder ve sonuta u satrlar grntlenir. Trkiye Kazakistan Azerbaycan Amerika 4 Solutions Eer ulke_adlarini_yaz yklemi fail komutundan sonra yazlmam olsayd, cevap yine ayn olurdu fakat yes yerine no satr grntlenirdi. 6.3. nceki ve Sonraki Eylemler Bir hedef iin gerekli olan btn zmleri salayan bir program, zm yapmadan ve yaptktan sonra baka eyler de yapabilir. rnein

70

1. Yaanacak gzel yerler 2. Ulke_adi(Ulke) ykleminin btn sonularn yaz. 3. Baka yerler de olabilir... eklinde bir mesaj yazarak bitirebilir. Ulke_adlarini_yaz cmlesin ulke_adi(Ulke) ykleminin btn sonularn ierir ve sonunda bir biti mesaj yazar. rnekte geen ilk ulke_adlarini_yaz cmlesi yukardaki admlardan ikincisi iindir ve btn zmleri yazar. kinci cmlesi ise nc adma tekabl eder ve sadece hedef cmlesini baarl bir ekilde bitirmek iindir. nk ilk cmle daima yanltr. Program baka ekilde yazmak gerekirse: PREDICATES nondeterm ulke_adi(symbol) ulke_adlarini_yaz CLAUSES ulke_adi("Trkiye"). ulke_adi("Kazakistan"). ulke_adi("Azerbaycan"). ulke_adi("Amerika"). ulke_adlarini_yaz:write("Yaanacak baz yerlerin listesi.."), nl, fail. ulke_adlarini_yaz :ulke_adi(Ulke), write(Ulke), nl, fail. ulke_adlarini_yaz:write("Baka gzel yerler de vardr..."), nl. GOAL ulke_adlarini_yaz. lk cmledeki fail komutu ok nemlidir. nk bu komut ilk cmle altrldktan sonra programn ikinci cmleye geiini salar. Buradaki write ve nl komutlarnn baka bir i yapmamas ok nemlidir. Son fail komutundan sonra programn ikinci cmlecie geii salanmaldr.

71

6.4. Dngl Geriye Dnn Uygulanmas Geriye dn ilemi bir hedefin btn zmlerinin bulunmas asndan son derece nemlidir. Birden fazla zm sunamayan hedefler iin yine de geriye dn ilemi yaplabilir. Bu da tekrarlama ilemini yapar. rnein: tekrar. tekrar:-tekrar. gibi iki cmlecik sonsuz sayda zm olduunu gstermektedir. rnek: PREDICATES nondeterm tekrar nondeterm karakteri_ekrana_yaz CLAUSES tekrar. tekrar:-tekrar. karakteri_ekrana_yaz:tekrar, readchar(Harf), /*Klavyeden girilen harfi oku ve C'ye ata*/ write(Harf), Harf='\r', !. /* Satr sonu tuuna (Enter/Return) baslmadysa devam et*/ GOAL karakteri_ekrana_yaz, nl.Yukardaki rnekte tekrar ileminin nasl yaplacan grlebilir. Karakteri_ekrana_yaz:-... kural, Enter/Return baslmad mddete, klavyeden girilen kararterleri kabul edip ekranda gsteren bir prosedr tanmlamaktadr. Karakteri_ekrana_yaz kuralnn alma mekanizmas yle sralanabilir: 1. tekrar altr. (Hibir ey yapmaz) 2. bir karakter oku (Harf) 3. Harf karakterini yaz 4. Harfin satr sonu karakteri olup olmadn kontrol et. 5. Eer satr sonu eleman ise, ilemi bitir, deilse, geriye iz srme ilemini yap ve alternatif ara. Buradaki write ve readchar kurallarnn hibiri alternatif salayamaz. Dolaysyla geriye dn hemen tekrar kuralna gider, bunun ise alternatif sunmas tabiidir. 6. lem devam eder. Bir karakter oku, onu ekrana yaz, satr sonu eleman olup olmadn kontrol et.

72

Harfe deer atayan readchar(Harf) ykleminin ncesine geriye dn yapld anda, Harf deikeni serbest hale gelir. Deiken deerinin kaybolmas geriye dn ilemi sayesinde alternatif zmler elde etmek iin ok nemlidir. Fakat geriye dn ilemi baka bir i iin kullanlamaz. nk geriye dn ilemi alternatif ararken, ilemleri birok kez tekrar edebilir. Fakat bu tekrarlar srasnda bir tekrardan dierine geite hibir ey hatrlayamaz. Daha nce de sylediimiz gibi, ilemlerden sonra deer atamas yaplan deikenlerin tamam, geriye dn ilemi srasnda btn bu deerleri kaybederler. Byle bir dngde saya gibi bir ey kullanp toplam, kayt says vs. gibi bir deeri tutmann kolay bir yolu yoktur. 6.5. Rekursif Prosedrler Tekrarlama ilemin yapmann dier bir yolu da rekursiyondur. Kendisini arabilen prosedre rekursiv prosedr diyoruz. Rekursiv prosedrler alrken yaptklar ilerin saysn, toplamn veya ilemlerin ara sonularn saklayabilir ve bunlar bir dngden dierine rahatlkla aktarabilirler. rnek: N saysnn faktoriyelini hesaplamak iin 1. Eer N=1 ise, faktoriyel=1 2. Dier durumlarda N-1in faktoriyelini bul ve bunu N ile arp eklindeki emirleri anlayp uygulayan bir program yazalm. rnein 3 saysnn faktriyelini bulmak iin 2nin faktriyelini, 2nin faktriyelini bulmak iin de 1in faktriyelini bulmamz gerekir. 1in faktryeli zaten bilindiinden yaplmas gereken tek ey 2 ve 1in faktriyellerini N says olan 3 ile arpmaktr. Grld gibi ilemler burada sonsuza kadar gitmemektedir. imdi bunlar Prolog ile ifade etmeye alalm: PREDICATES faktoriyel(unsigned, real) CLAUSES faktoriyel (1, 1):-!. faktoriyel (X, Faktoriyel_X):Y=X-1, faktoriyel(Y, Faktoriyal_Y), Faktoriyel_X=X*Faktoriyal_Y. GOAL X=6, faktoriyel(X, Faktoriyel).

73

Program 6 saysnn faktriyelini bulur. Burada ilgin bir durum vardr. Bilgisayar faktriyel ileminin yarsnda iken nasl olur da faktriyeli hesaplar? Faktriyel kuraln X=6 olacak ekilde arlrsa, faktriyel kendini X=5 iin arlacaktr. Bu durumda X deeri 6 m olacak 5 mi? Cevap udur: Bilgisayar faktriyel prosedrnn bir kopyasn oluturur ve bu kopyay ar. Kopyann kendini faktoriyel prosedrnn aynsym gibi alr. Sadece argmanlarn ve deikenlerin kopyalarna ihtiya duyulur. Bu bilgi yn olarak hafzada saklanr ve bir kural arldnda her seferinde yeniden oluturulur. Kural non-deterministic deil ise sona erdii zaman bellek yn sfrlanr. 6.5.1. Rekursiyonun Avantajlar Baka trl gvenli bir ekilde ifade edilemeyen algoritmalar daha ak bir ekilde ifade edebilir. Mantksal olarak iterasyondan ok daha basittir. Listeleri ilemede ok yaygn olarak kullanlr. Rekursiyon ilemi zellikle problem ierisinde dallanmalarn mevcut olduu, yani bir problemin zmnn bir alt probleme bal olduu durumlarda ok faydaldr. 6.5.2. Sondan Rekursiyon Optimizasyonu Rekursiyon ileminin en nemli dezavantaj, bellei fazlaca kullanmasdr. Bir prosedr baka bir alt prosedr ardnda, ary yapan prosedrn ary yapt anki alma durumu mutlaka kaydedilmelidir. Bylece arlan prosedrn yapmas gereken ilem bittii zaman, ary yapan prosedr kald yerden ileme devam edebilir. Bunun dezavantaj udur: rnein bir prosedr kendisini 100 defa arrsa, her seferki durum kaydedilecei iin tam olarak 100 deiik durum hafzaya alnm olur. Hafzaya alnan her duruma stack frame (yn alan) denir. 16 bitlik PC DOS sisteminde bu alan 64K ile snrl olup, ancak 3000-4000 yn alacak kapasitedir. 32 Bitlik sistemlerde teorik olarak bu alan GB dzeyine kadar kabilir, fakat bu kez de baka engeller ortaya kar. Yn alann azaltmak iin ne yaplabilir? Bir prosedrn, baka bir prosedr kendisinin en son adm olarak ardn dnelim. arlan prosedr grevini yaptktan sonra, ary yapan prosedrn

74

yapmas gereken baka ey kalmaz. ary yapan prosedrn kendisin alma ann kaydetmesi gerekmez, nk o andaki bilgi artk gereksizdir. arlan prosedr biter bitmez, program ak normal biimde devam eder. Bu durum daha ak olarak aadaki ekilde ifade edilebilir. A prosedrnn B prosedrn, B prosedrnn ise C prosedrn son adm olarak ardn dnelim. B prosedr Cyi ardnda, Bnin baka bir ey yapmas gerekmez. Yani Cnin o anki alma durumunu B olarak kaydetmek yerine, Bnin kaydedilen eski durumun Cya aktarmak, depolanan bilgi iinde uygun deiiklik yapmak mmkndr. C bittii zaman, dorudan A prosedr tarafndan arlm gibi olacaktr. B prosedrnn Cyi armak yerine, kendisini ilemin en son adm olarak ardn dnelim. B prosedr yine Byi ard zaman, ary yapan Bnin yn bilgisi, arlan Bnin yn bilgisi ile yer deitirilmelidir. Bu ise ok basit bir ilemden yani argmanlarn yeni deerleri almasndan ibarettir. Daha sonra ilem, prosedrn ba ksmna gider. Prosedrel olarak bu olay bir dngdeki kontrol deerlerinin yenilenmesine benzer. Bu ilemlere sondan rekursiyon optimizasyonu veya son-ar optimizasyonu ad verilmektedir. 6.5.3. Sondan Rekursiyonun Kullanm Prologda bir prosedrn baka bir prosedr kendisinin en son adm olarak armasnn ne anlama geldi konusu incelenecektir. 1. ar, cmlenin en son alt hedefidir. 2. Bu cmlenin ilk ksmlarnda geriye dn noktalar yoktur. Aadaki rnek bu iki art salamaktadr: sayac(Sayi):write(Sayi), nl, yeni_sayi=Sayi+1, sayac(Yeni_sayi). te bu prosedr sondan rekursif bir prosedrdr ve hafzada yeni bir yna neden olmakszn kendisini arr. Dolaysyla hafzay tketmez. Bu programa GOAL sayac(0) deeri verilse, 0 ile balayan tam saylar yazlmaya balanr ve ilem bitmez. rnek:

75

PREDICATES sayac(ulong) CLAUSES sayac(Sayi):write('\r',Sayi), Yeni_sayi=Sayi+1, sayac(Yeni_sayi). GOAL nl, sayac(0). Bu programa GOAL sayac(0) ile altrlrsa, 0dan balamak zere tam saylar yazlmaya balanr ve ilem bitmez. 6.5.3. Sondan Rekursiyonu Engelleme 1. Eer rekursiv ar en son adm deilse, prosedr sondan rekursiv deildir. rnein; PREDICATES rakam_yaz(ulong) CLAUSES rakam_yaz(Sayi):write('\r', Sayi), Yeni_sayi=Sayi+1, rakam_yaz(Yeni_sayi), nl. Goal nl, rakam_yaz(0). Rakam_say prosedr kendisini ardnda, kontroln yeniden rakam_say(Sayi) dnmesi iin hafzada bir yn kaydedilir. nk son alt hedef nldir ve bunun ileme girmesi gerekir. Dolaysyla dng bir sre sonra hata mesaj vererek durur. 2. Sondan rekursiyonu engellemenin bir dier yolu da rekursiyonun yapld anda, geriye henz denenmemi bir alternatifin kalmasdr. Bu durumda prosedrn son durumunun kaydedilmesi gerekir. nk rekrsiv arnn baarsz olmas durumunda ary yapan prosedrn geriye gidip denenmemi bir alternatifi deneyebilmesi gerekir. rnek: Clauses rakam_yaz(Sayi):-

76

write('\r', Sayi), Yeni_sayi=Sayi+1, rakam_yaz(Yeni_sayi). rakam_yaz(Sayi):Sayi<0, write(Sayi sfrdan kktr.). GOAL rakam_yaz(0). Burada rakam_yaz cmlesi, ikinci cmle denenmeden nce kendisini arr. Program yine bir sre sonra hafza tkenmesinden dolay durur. 1. Denenmemi alternatifin rekursiv prosedrn kendisi iin ayr bir cmle olmas gerekmez. Rekrsiv prosedrn ard baka bir cmlede bir alternatif de olabilir. rnek: rakam_yaz(Sayi):write('\r', Sayi), Yeni_sayi=Sayi+1, Kontrol_et(Yeni_sayi). rakam_yaz(Yeni_sayi). Kontrol_et (Z):-Z>=0. Kontrol_et (Z):- Z<0. Sayi deikeninin deeri normalde pozitiftir. Bu durumda rakam_yaz her ne zaman kendisini arsa, kontrol_et ykleminin ilki dorulanr, fakat ikinci kontrol_et yklemin henz dorulanmam durumdadr. Bu yzden rakam_yaz yklemi, geriye dn ilemi srasnda kontrol etmek zere yn blgesine bir kopya almak zorundadr. PREDICATES yanlis_sayac1(long) yanlis_sayac2(long) yanlis_sayac3(long) kontrol_et(long) CLAUSES /* Rakam_yaz: Rekursiv ar son adm deildir.*/ yanlis_sayac1(Sayi):write ('\r', Sayi), Yeni_sayi=Sayi+1,

77

yanlis_sayac1(Yeni_sayi), nl. /* Rakam_yaz2: Rekursiv ar yapld anda henz denenmemi bir clause var.*/ yanlis_sayac2(Sayi):write ('\r', Sayi), Yeni_sayi=Sayi+1, yanlis_sayac2(Yeni_sayi). yanlis_sayac2(Sayi):Sayi<0, write ("Say negatiftir."). /* Rakam_yaz3: Rekursiv ardan nce arlan yklemde denenmemi bir alternatif var.*/ yanlis_sayac3(Sayi):write ('\r', Sayi), Yeni_sayi=Sayi+1, kontrol_et(Yeni_sayi), yanlis_sayac3(Yeni_sayi). kontrol_et(Z):Z>=0. kontrol_et(Z):Z<0. GOAL yanlis_sayac1(1458). 6.6. Rekursiyonda Cut Kullanm Bir prosedrn sondan rekrsiyonlu olup olmadndan kesin olarak emin olunamayaca dnlebilir. Rekursiv olan ary, son cmleciin en son alt hedefi yaparak, bu problemi zmek mmkndr. Fakat yine de hedef cmlesinin araca dier prosedrler arasnda denenmemi baka bir alternatif olmadn nasl garantiye alabiliriz? Bunu garantiye almak gerekmez, nk ! yani Cut komutunu kullanarak bulunabilecek btn alternatiflerin nn kesmek mmkndr. Cut komutunun anlam yleydi. Goal cmlecii ile belirlenen ykleme uygun zm ararken, gelinen nokta bizim aradmz noktadr. Artk teye gitmeye gerek bulunmamaktadr. Alternatifler de ortadan kalkt iin, artk hafzada yn oluturmaya gerek kalmaz.

78

Yukardaki rnekte grlen rakam_say cmlesini, yle dzeltmek mmkndr (lemdeki ismini deitirelim): Cut_sayaci3(Sayi):Write (\r, Sayi), Yeni_sayi=sayi+1, Kontrol_et(Yeni_sayi), !, cut_sayaci3(Yeni_sayi). Cut komutu yanlis_sayac2 cmleciinde ayn ekilde etkili olur. nk testi negatife drp ikinci cmlecikten birinciye tar. Cut_sayaci2(Sayi):Sayi>=0, !, Write (\r, Sayi), Yeni_sayi=Sayi+1, cut_sayaci2(Yeni_sayi). Cut_sayaci2(Sayi):- write (Sayi negatiftir.). Cut komutunu non-deterministic olan, yani birden fazla zm salayan yklemlerle alrken, alnan bilginin yeterli olduuna inanld anda rahatlkla kullanlabilir. Ayn ey yanlis_sayac3 iin de geerlidir. Kontrol_et yklemi iaretine bal olarak Sayi zerinde biraz daha ilem yaplmasn gerektiren bir durumu gstermektedir. Fakat kontrol_et kodu non-deterministic olduu iin Cut komutu iyi bir zmdr. Kontrol_et yklemi yle yazlabilir: Kontrol_et(Z):- Z>=0, !, /* Zyi kullanarak ilem yapmak*/ Kontrol_et(Z):-...... Cut komutu kullanld zaman bilgisayar denenmemi bir alternatifin kalmadna karar verir ve bu yzden de yn oluturma yoluna gitmez. Aadaki programda yanlis_sayac2 ve yanlis_sayac3n dzeltilmi hali vardr. PREDICATES cut_sayaci2(long) cut_sayaci3(long) nondeterm kontrol_et(long) CLAUSES /* Rekursiv ar yapld anda henz denenmemi bir seenek var*/ cut_sayaci2(Sayi):-

79

Sayi>=0, !, write('\r', Sayi), Yeni_sayi=Sayi+1, cut_sayaci2(Yeni_sayi). cut_sayaci2(_):write("Sayi negatiftir."). /* Rekursiv ardan nceki cmlecikte henz denenmemi bir seenek var*/ cut_sayaci3(Sayi):- write('\r', Sayi), Yeni_sayi=Sayi+1, kontrol_et(Yeni_sayi), !, cut_sayaci3(Yeni_sayi). kontrol_et(Z):-Z>=0. kontrol_et(Z):-Z<0. GOAL cut_sayaci3(214). 6.7. Argmanlarn Dng Deikeni Olarak Kullanm Rukursiyon blmnde verilen bir saynn faktriyelini hesaplayan bir program gelitirilmiti. Bu durum Pascalda yle ifade edilebilir: P:=1; For I:=1 to N do P:= P*I; FactN:=P; N, faktriyeli hesaplancak olan say, FactN, N saysnn faktriyeli, I deeri 1den Ne kadar deien dng deikeni ve P ise ara saylarn deerlerinin topland deikendir. Bu program Prologa aktarrken yaplmas gereken ilk ey, for komutu iin daha basit bir dng kurmak ve her admda I deikenine ne olduunu daha ak ekilde gstermektir. Program while ile, aadaki biimde yazlr. P:=1; I:=1; While I<= N do Begin P:=P*I; I:=I+1; End; /*P ve I deikenlerine yeni deerleri ata*/ /* Dng kontrol*/ /* P ve I deikenlerine ilk deeri ata.*/

80

FactN:=P; PREDICATES

/* Saynn Faktriyelini Yaz..*/

Ayn program Prolog ile aadaki gibi yazlr. faktoriyel(unsigned, real) carpanlarin_faktoriyeli(unsigned, long, unsigned, long) CLAUSES faktoriyel(Sayi, Sayinin_Faktoriyeli):carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, 1, 1). carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I,P):I<=Sayi, !, Yeni_P=P*I, Yeni_I=I+1, carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, Yeni_I, Yeni_P). carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I, P):I>Sayi, Sayinin_faktoriyeli=P. GOAL faktoriyel(5, Sayinin_Faktoriyeli). Programn ayrntlar aada verilmitir. Faktoriyel cmleciinin Sayi ve Sayinin_Faktoriyeli olmak zere iki deikeni vardr. Bunlardan say, faktriyeli bulunacak say, dieri ise bu saynn faktriyelidir. Rekursiyon ilemi aslnda carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I, P) cmlesinden meydana gelir. Bu cmledeki 4 deikenin bir admdan dierine aktarlmas zorunludur. Bu yzden faktoriyel sadece carpanlarin_faktoriyeli yklemini harekete geirir ve say, saynn faktriyeli, I ve Pnin ilk deerlerini buraya aktarr. Bylece faktoriyel(Sayi, Sayinin_Faktoriyeli):carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, 1, 1). sayesinde I ve P deikenleri ilk deerlerini alm olurlar. Burada dikkat eken ey, faktoriyel ykleminin hibir deeri olmayan Sayinin_faktoriyeli deerini carpanlarin_faktoriyeli yklemindeki sayinin_faktoriyeli deikenine aktarmasdr. Prologun yapt tek ey, iki cmlede bulunan Sayinin_faktoriyeli deikenlerini eletirmektir. Ayn ey carpanlarin_faktoriyeli yklemindeki sayinin_faktoriyeli deikeninin rekursiv ar esnasnda kendisine atanmasnda da olur. Son aamada ise

81

Sayinin_faktoriyeli bir deer alacaktr. Bu deeri ald zaman daha nceki btn sayinin_faktoriyeli deikeni ayn deeri alr. Gerekte ise sayinin_faktoriyeli deikeninin bir deeri vardr. nk Sayinin_faktoriyeli deikeni, ikinci cmledeki carpanlarin_faktoriyeli cmlesinden nce hibir zaman gerek anlamda kullanlmaz. imdi carpanlarin_faktoriyeli yklemine gelelim. Bu yklem, dngnn devam art olan I saysnn Sayidan az veya eit olup olmadn kontrol eder. Daha sonra Yeni_I ve Yeni_P deerleriyle kendisini rekursiv olarak arr. Burada Prologun baka bir zellii ortaya kmaktadr. Dier dillerin ounda mevcut olan P=P+1 eklindeki bir ifade Prologda yanltr. Bu yzden Prologda bir deikenin deerini deitirmek mmkn deildir. Bunun yerine Yeni_P=P+1 eklinde bir ifade kullanmak gerekir. Bu durumda ilk cmlecik carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I,P):I<=Sayi, !, Yeni_P=P*I, Yeni_I=I+1, carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, Yeni_I, Yeni_P). eklinde yazlabilir. Buradaki Cut komutu, cmlecik yklemde en sonda olmasa da, son ar optimizasyonuna imkan tanr. Zamanla I deikeninin deeri Sayi deikeninin deerine geer. Bu durumda ilem Pnin o anki deerini sayinin_faktoriyeli ile eletirir ve rekursiyonu bitirir. Bu nokta ikinci cmlede, yani birinci cmledeki I<=Sayi testinin yanl kt zaman meydana gelecektir. carpanlarin_faktoriyeli(Sayi, sayinin_faktoriyeli=P. haline dnr. Sayinin_faktoriyeli=P ifadesinin ayr bir satrda olmas gerekmez. nk sayinin_faktoriyeli deikeninin yerine P deikenini yazarak deer atamas yaplabilir. Ayrca I>Sayi testi de gereksizdir, nk bunun tersi zaten birinci cmlede denenmi olmaktadr. Bunun son hali: carpanlarin_faktoriyeli(_, Sayinin_faktoriyeli,_, Sayinin_Faktoriyeli) olur. PREDICATES faktoriyel(unsigned,real) faktoriyel(unsigned,real,unsigned,real) Sayinin_faktoriyeli, I, P):I>Sayi,

82

CLAUSES faktoriyel(Sayi, Sayinin_faktoriyeli):faktoriyel(Sayi, Sayinin_faktoriyeli,1,1). faktoriyel(Sayi, Sayinin_faktoriyeli, Sayi, Sayinin_faktoriyeli):-!. faktoriyel(Sayi, Sayinin_faktoriyeli,I,P):Yeni_I = I+1, Yeni_P = P*Yeni_I, faktoriyel(Sayi, Sayinin_faktoriyeli, Yeni_I, Yeni_P). GOAL faktoriyel(12, Sayinin_Faktoriyeli). 6.8. Rekursiv Veri Yaplar Sadece kurallar deil, ayn zamanda veri yaplar da rekursiv olabilir. Prolog bu tr yaplarn kullanlmasna imkan tanyan yaygn kullanlan tek programlama dilidir. Bir veri tr, kendisi gibi yaplar ieren baka yaplarn kullanmna izin veriyorsa, bu tr veri tiplerine rekursiv denir. En temel rekursiv veri tr listelerdir. Fakat ilk bakta rekursiv yapda olduklar belli olmaz. imdi rekursiv olan bir veri tr tanmlayp, bunu olduka hzl bir sralama programnda kullanlmas gsterilecektir. Bu veri trnn yaps aada aa yapsnda verilmitir. Grld gibi Ali ve Aye ile gsterilen her bir dal kendi iinde ayrca alt dallara ayrlmtr. Bundan dolay da bu tr bir yap rekursiv olarak adlandrlr.

Emine

Ali

Aye

Hasan

Fatma

Fuat

Leyla

ekil 6.1. Aile Fertlerinin ecere Olarak Gsterilmesi

83

6.9. Aa Biimindeki Veri Trleri Rekursiv veri trleri, ALGOL60 dilinden Pascal dilini karan Niklaus Wirth tarafndan popler hale getirilmitir. Bu veri tiplerini Pascalda kullanmam, fakat faydalarna deinmitir. Visual Prolog, otomatik olarak oluturulup, pointerlar iereren gerek rekursiv tip tanmlara imkan tanr. rnein aadaki biimde bir aa yaps tanmlamak mmkndr. Domains Agac_yapisi= agac(string, agac_yapisi, agac_yapisi) Bu ifade agac isimli bir operatr tanmlandn, bunun da biri string, ikisi ayrca aac yapsnda, toplam deikeninin olduunu gsterir. Aa yapsndaki hibir veri tr sonsuza kadar gidemeyecei, rekursiyonu da bitirmek mmkn olmad iin bu ifade tam olarak doru deildir. rnein baz hcrelerin dier hcrelerle balantlar yoktur. Prologda aa yapsndaki bir veri yapsnda iki tip operatr tanmlanr. Bunlar ayr argman olan agac veya hibir argman olmayan bos operatrleridir. Domains Agac_yapisi= agac(string, agac_yapisi, agac_yapisi); bos Yukardaki agac ve bos adndaki yklemlerin Prologda nceden tanml bir anlamlar yoktur ve programc bunlarn yerine istedii baka isimleri kullanabilir. imdi ekil 6.1de gsterilen tablonun Prologda nasl ifade edilebilecei incelenecektir. agac("Emine", agac("Ali", agac("Hasan", bos, bos) agac("Fatma", bos, bos)) agac("Aye", agac("Fuat", bos, bos) agac("Leyla", bos, bos))) 6.9.1. Bir Aa Yapsnda Tarama Yapma Aa eklindeki yaplarda youn olarak yaplan ilem, ya btn hcreleri incelemek ve hcreleri bir ekilde ilemek veya belirli bir deeri aramak ve btn deerleri toplamaktr. Buna bir aac taramak ad verilmektedir. Bunun en temel algoritmalarndan biri udur: 2. Eer aa bo ise hibir ey yapma

84

3. Eer dolu ise, o anki noktay incele, buradan soldaki alt dala ge ve daha sonra sadaki alt dal incele. Algoritma da tpk aa yaps gibi rekursivdir. Soldaki ve sadaki aa yaplarn orijinal aa gibi inceler. Prolog bunu iki cmlecik ile ifade eder, biri bo dieri de dolu aa iindir. incele(bos) incele(agac(A, B, C)):incele(A), incele(B), incele(C). Aadaki aa tarama algoritmas aaya-doru-arama olarak bilinir. nk Prolog her dalda mmkn olduu kadar derinlemesine gider, bu daln sonuna ulat anda geriye dner ve baka bir dal incelemeye balar. (ekil 6.2).

1 Emine
2

Ali
3

5 6

Aye

Hasan
4

Fatma

Fuat
7

Leyla

ekil 6.2. ekil 6.1deki aa yapsnda Aaya-Doru-Arama metodunun uygulanmas. Prologun yukardaki aac nasl tarayaca yukarda belirtilmitir. Aadaki program, aa yapsn tarayarak aacn her elemann ekranda grntlenir. DOMAINS agac_yapisi=agac(string, agac_yapisi, agac_yapisi); bos_dal PREDICATES agaci_tara(agac_yapisi) CLAUSES agaci_tara(bos_dal).

85

agaci_tara(agac(Isim, Sol, Sag)):write(Isim, '\n'), agaci_tara(Sol), agaci_tara(Sag). GOAL agaci_tara(agac("Emine", agac("Ali", agac("Hasan", bos_dal, bos_dal), agac("Fatma", bos_dal, bos_dal)), agac("Aye", agac("Fuat", bos_dal, bos_dal), agac("Leyla", bos_dal, bos_dal)))). Program yazp altrlrsa ekranda unlar grlr. Emine Ali Hasan Fatma Aye Fuat Leyla yes aaya-doru-arama Prologun bir veri tabann tararken kulland ynteme ok benzer. Bu tarama esnasnda cmlecikler aa eklinde dzenlenir ve her bir dal ayr ayr incelenerek sorgu baarsz oluncaya kadar ileme devam edilir. 6.10. Bir Aa Oluturmak Aa biiminde bir yap oluturmann bir yolu operatrlerden ve argmanlardan oluan i ie gemeli bir yap yazmaktr. Prolog, hesaplama yaparak elde ettii deerlerden bir aa oluturabilir. Her bir admda, argmanlarn eletirilmesiyle bo alt daln iine bo olmayan bir dal yerletirilir. Basit verileri kullanarak bir hcreli bir aa oluturmak ok basittir. agac_olustur(Sayi, agac(Sayi, bos_dal, bos_dal)). Yukardaki satr Prolog iin Eer Sayi bir say ise, agac(Sayi, bos_dal, bos_dal) tek hcreli bir aa olup veri olarak bu sayy ierir anlamna gelir. Aa yaps oluturmak da en az bu kadar basittir. rnein sola_yerlestir(Sayi, agac(A, _, B), agac(A, Sayi, B)). Prosedr argmandan olumutur. lk aac, ikinci aacn alt dal olarak alr ve nc aac da sonu olarak verir. Yaplan tek ey ise, sadece argmanlar bire bir

86

eletirmektir. rnein agac(Ali, bos_dal, bos_dal) eklindeki bir yapy agac(Emine, bos_dal, bos_dal) yapsnn sol alt dal olarak yerletirilmek istenirse, yazlmas gereken tek ey u hedefi altrmaktr. sola_yerlestir(agac(Ali, bos_dal, bos_dal), agac(Emine, bos_dal, bos_dal), T). Tnin deeri agac(Emine, agac(Ali, bos_dal, bos_dal), bos_dal) olur. Aadaki rnekte bu teknik gsterilmitir. DOMAINS agac_yapisi = agac(string,agac_yapisi,agac_yapisi); bos_dal() PREDICATES agac_olustur(string,agac_yapisi) sola_yerlestir(agac_yapisi,agac_yapisi,agac_yapisi) saga_yerlestir(agac_yapisi, agac_yapisi, agac_yapisi) basla CLAUSES agac_olustur(A,agac(A,bos_dal,bos_dal)). sola_yerlestir(X,agac(A,_,B),agac(A,X,B)). saga_yerlestir(X,agac(A,B,_),agac(A,B,X)). basla:%Tek daldan oluan aalar oluturalm agac_olustur("Hasan",Ha), agac_olustur("Fatma",Fa), agac_olustur("Ali",Al), agac_olustur("Fuat",Fu), agac_olustur("Leyla",Le), agac_olustur("Ayse",Ay), agac_olustur("Emine",Em), %dallar birletirelim sola_yerlestir(Ha, Al, Al2), saga_yerlestir(Fa, Al2, Al3), sola_yerlestir(Fu, Ay, Ay2), saga_yerlestir(Le, Ay2, Ay3), sola_yerlestir(Al3, Em, Em2),

87

saga_yerlestir(Ay3, Em2, Em3), %sonucu gster write(Em3,'\n'). GOAL basla. Program yazlp altrlnca ekranda u sonu grntlenir. agac("Emine",agac("Ali",agac("Hasan",bos_dal,bos_dal),agac("Fatma",bos_dal,b os_dal)),agac("Ayse",agac("Fuat",bos_dal,bos_dal),agac("Leyla",bos_dal,bos_dal))) yes Prologda bir deiken herhangi bir deeri aldktan sonra, artk bu deeri deitirmenin bir yolu yoktur. Bundan dolay yukardaki rnekte ok sayda deiken ismi kullanlmtr. Her yeni deer olutuunda, yeni bir deiken tanmlamamz gerekir. 6.11. Binary Arama Aac imdiye kadar aa yaps, bir aa ve elemanlar arasndaki ilikileri gstermek iin kullanld. Temel ama bu olsayd, bunun yerine cmleciklerle ifade edilen olgular kullanmak mmkn olurdu. Oysa aa yapsnn baka kullanmlar da vardr. Aa yaplarn kullanarak veri saklamak ve istenildiinde bu deerleri bulmak ok kolaydr. Bu maksatla oluturulan aa yapsna arama aac ad verilir. Programc asndan buna liste veya array tipindeki verilere bir alternatif gzyle baklabilir. Basit bir aa yapsn tararken, ncelikle o an iinde bulunulan hcreye, daha sonra bu hcrenin solu ve sana, belirli bir deeri ararken, bir aa yapsndaki btn hcrelere baklmas gerekebilir. te binary arama aac, herhangi bir hcreye bakarak aranan bir deerin hangi alt dalda bulunacan tahmin edebilecek ekilde tasarlanr. Bunun iin veri paralar arasnda ne tr sralama olacann (rnein alfabetik veya saysal sralama) tanmlanmas gerekir. Sol taraftaki alt dalda bulunan veri, o an iinde bulunulan hcredeki veriden nce gelir ve sa taraftan devam edilir. Aadaki ak emasn inceleyim.

88

Emine

Ali

Aye

Hasan

Fatma

Fuat

Leyla

smail

Fatih Haydar

ekil 6.3. Binary tarama yaps Farkl srada yerletirilen ayn isimlerin farkl bir aa emas oluturur. Ayrca, emada 10 isim olmasna ramen, bunlardan herhangi biri en fazla 5 admda bulunabilir. Binary bir tarama yapsnda bir hcreye bakarken, geriye kalan hcrelerin yarsn elimine edilir. Bu yzden tarama ok abuk ilerler. Bir Binary Tarama Yapsndaki bir maddeyi bulmak iin gereken zaman ortalama olarak log2Ndir. Bir aa olutururken, ie nce bo bir aa ile balanr. Daha sonra dier paralar teker teker ilave edilir. Bir madde ilave etmek iin gereken prosedr, bir maddeyi aramak iin gereken ile tamamen ayndr. 1. Eer iinde bulunulan nokta bo bir aa ise, buraya bir madde yerletir. 2. Deilse, buraya yerletirilecek maddeyi, orada sakl olan madde ile karlatr. Karlatrmann sonucuna gre, maddeyi sol veya sa alt dala yerletir. Bunun iin Prologa 3 cmle gerekir. lk cmle: yerlestir(Yeni_Madde, bos, agac(Yeni_madde, bos, bos):-!. Bunu konuma diline Yeni_maddeyi bos olan yere yerletirmenin sonucu agac(Yeni_madde, bos, bos) olur. Buradaki Cut komutu, cmlenin uygun olmas durumunda baka bir cmlenin denenmemesi iindir. kinci ve nc cmleler bo yerlere yerletirmek iin kullanlr. Yerlestir(Yeni_Madde, bos, agac(Eleman, Sol, Sag), agac(Eleman, Yeni_Sol, Sag):- Yeni_Madde<Eleman, !, yerlestir(Eleman, Sol, Yeni_Sol).

89

Yerlestir(Yeni_Madde, bos, agac(Eleman, Sol, Sag), agac(Eleman, Sol, Yeni_Sag):- yerlestir(Yeni_Madde, Sag, Yeni_Sag). Eer Yeni_Madde<Eleman olursa, deer sol alt dala yerletirilir; aksi takdirde sa alt dala yerletirilir. 6.12. Aaca Bal Sralama Aa yaps oluturulduktan sonra, bu yap ierisindeki btn maddeleri alfabetik olarak elde etmek ok kolaydr. Kullanlacak algoritma aaya-doru-tarama ynteminin deiik bir eklidir: 1. Eer aa bo ise hibir ey yapma. 2. Deilse, sol tarafta olan btn deerleri, daha sonra o anki eleman, sonra da sa taraftaki btn elemanlar al. Prolog diliyle, aadaki ekilde ifade edilir. Hepsini_al(bos). Hepsini_al(agac(Madde, Sol, Sag)):Hepsini_al(Sol), isleme_devam_et(Madde), hepsini_al(sag). rnek: Aadaki programda ekrandan yazlan karakterler, daha sonra alfabetik srayla grntlenmektedir. Karakterler kendi aralarnda byk veya kk olmalarna gre de sralanmaktadr. Programda kullanlan baz yklemler daha sonra incelenecektir. DOMAINS karakter_dizisi = agac(char, karakter_dizisi, karakter_dizisi); son PREDICATES nondeterm basla(karakter_dizisi) eylem(char, karakter_dizisi, karakter_dizisi) agac_olustur(karakter_dizisi, karakter_dizisi) yerlestir(char, karakter_dizisi, karakter_dizisi) agaci_yaz(karakter_dizisi) nondeterm tekrar CLAUSES basla(Agac):tekrar,nl, write("***********************"),nl,

90

write("Agaci guncelleme : 1 \n"), write("Agaci incelemek : 2 \n"), write("Programi bitirmek : 7 \n"), write("***********************"),nl, write("Tercihiniz > "), readchar(X),nl, eylem(X, Agac, Yeni_agac), basla(Yeni_agac). eylem('1',Agac,Yeni_agac):write("Istediginiz karakterleri yaziniz, bitirmek iin # karakterini giriniz: "),nl, agac_olustur(Agac, Yeni_agac). eylem('2',Agac,Agac):agaci_yaz(Agac), write("\nDevam etmek iin bir tusa basiniz.."), readchar(_),nl. eylem('7', _, son):exit. agac_olustur(Agac, Yeni_agac):readchar(C), C<>'#',!, write(C, " "), yerlestir(C, Agac, Gecici_agac), agac_olustur(Gecici_agac, Yeni_agac). agac_olustur(Agac, Agac). yerlestir(Yeni,son,agac(Yeni,son,son)):-!. yerlestir(Yeni,agac(Eleman,Sol,Sag),agac(Eleman,Yeni_sol,Sag)):Yeni<Eleman,!, yerlestir(Yeni,Sol,Yeni_sol). yerlestir(Yeni,agac(Eleman,Sol,Sag),agac(Eleman,Sol,Yeni_sag)):yerlestir(Yeni,Sag,Yeni_sag). agaci_yaz(son). agaci_yaz(agac(Madde,Sol,Sag)):agaci_yaz(Sol),

91

write(Madde, " "), agaci_yaz(Sag). tekrar. tekrar:-tekrar. GOAL write("Yazilan karakterleri siralama "),nl, basla(son).

92

7. LSTELER VE REKRSYON ok sayda eleman ieren nesnelerle almak, yani liste ilemek, Prologun gl ynlerinden biridir. Daha nce ksaca anlatlan bu konu, burada daha ayrntl olarak ele alnacaktr. Listelerin ne olduklar, nasl tanmlandklar ve uygulama programlarnda nasl kullanlabilecekleri hakknda baz rnekler zlecektir. Liste ileme metoduna rekursiv ve prosedrel ynlerden yaklarken, Prologun ok nemli yklemlerinden olan member ve append zerinde durulacaktr. Daha sonra verilen dahili bir sorgu iin mmkn olan btn zmleri bulan ve grntleyen findall standart yklemini incelenecektir. 7.1. Listeler Bir listenin, ok sayda nesne ieren bir nesne olduu bilinmektedir. Prologdaki bir liste, dier dillerdeki dizilere(array) karlk gelir. Listelerin dizilerden en nemli fark, bir diziyi kullanmadan nce bu dizide ka tane eleman olacan nceden belirtmenin gerekmemesidir. Eer birletirilecek nesnelerin says nceden biliniyorsa, bunlar tek bir bileik veri yapsnn argman haline getirilebilir. Elemanlar a, b ve c olan bir liste [a, b, c] eklinde ifade edilir. Burada a, b ve c birer elemandr ve bu elemanlar bir virgl ile ayrlarak [.....] arasnda yazlrlar. rnekler: [araba, ev, televizyon] [Mahmut AKSOY, Sefer KAAR, Mahmut STNDA] 7.2.1. Liste Tanmlanmas Liste tanmlar programlarn domains blmlerinde yaplr. Tamsaylardan oluan bir liste Domains tamsayilar_listesi = integer* eklinde tanmlanr. Burada * tamsayilar_listesi argmannn tamsaylardan oluan bir liste olduunu gsterir. Liste tanmlarken, listeye verilen ismin Prologda hibir

93

nemi yoktur. nemli olan ey * ile tanml kelimenin bir listeyi temsil ettiinin belirtilmesidir. Bir listenin elemanlar herhangi bir ey olabilecei gibi, baka listeler de eleman olarak kullanlabilirler. Dikkat edilmesi gereken ey, bir listedeki elemanlarn tamamnn ayn tipde olmas, bu elemanlarn tipinin de ayrca tanmlanmasdr. rnek: Domains Benim_listem = elemanlarim* elemanlarim= integer /*real, symbol vs. olabilir.*/ Fakat bir listede bulunan standart tiplerin kark olarak kullanlmas mmkn deildir. rnein benim_listem = elemanlarim* elemanlarim= integer; real; symbol tanmlamas yanltr. Fakat integer, real ve symbol tiplerinden oluan bir liste tanmlamak iin farkl operatrler kullanlabilir: benim_listem = elemanlarim* elemanlarim= tamsayi(integer); reel_sayi(real); karakter(symbol) 7.2.2. Bir Listenin Paralar: Ba ve Kuyruk Bir liste iki ksmdan oluur. Bunlar listenin ilk elemannn oluturduu ba ve geriye kalan elemanlarn oluturduu kuyruk ksmdr. Yani bir listenin ba ksm daima sadece tek eleman, kuyruk ksm ise daima ayr bir listeden ibarettir. rnek: [a, b, c] listesinde a listenin ba; b ve c ise kuyruk ksmdr. [a] listesinde listenin ba a olur. [], yani bo bir liste de listenin kuyruk ksmdr. Bo bir listeyi ba ve kuyruk olarak ayrmak mmkn deildir. Dolaysyla bir listenin kuyruk ksmnn her seferinde ilk eleman alnrsa, sonuta bo bir listeye ulalr. Bu yzden listeleri bileik nesneler gibi aa yapsnda grmek mmkndr. rnein [a, b, c, d] listesine bu ilem aadaki gibi uygulanr. liste / a / \ liste \

94

b c

liste / / d \ liste \ []

Burada [a] ile a birbirinin ayns deildir. nk a tek bana bir eleman iken [a] tam bir bileik yapdadr. nk [a] liste / a \ []

eklinde ifade edilir. 7.2.3. Listelerin lenmesi Prologda bir listenin elemanlarn virgle ayrmak yerine, ba ve kuyruk ksmlarn daha belirgin olarak ifade etmek iin sadece ba ve kuyruk ksmlar dikey izgi ile | ayrlr. rnein: [a, b, c] yerine [a|[b, c]] veya benzer ekilde devam edersek [a|[b|[c]]] biimi kullanlabilir. Burada [c] listesini de ba ve kuyruk olarak ayrrsak, [a|[b|[c|[]]]] olur. Tablo 7.2. Listelerin ba ve kuyruk halinde gsterilmeleri
Liste ['a', 'b', 'c'] [ 'a' ] [] [[1, 2, 3], [2, 3, 4], []] Ba 'a' 'a' Tanmsz [1, 2, 3] Kuyruk ['b', 'c'] [] /* Bo liste*/ Tanmsz [[2, 3, 4], []]

Tablo 7.3: Liste eletirme rnekleri11


Liste 1 [X, Y, Z] [7] [1, 2, 3, 4] [1, 2] Liste 2 [kedi, eti, yedi] [X | Y] [X, Y | Z] [3 | X] Deiken eletirme X=kedi, Y=eti, Z=yedi X=7, Y=[] X=1, Y=2, Z=[3,4] Yanl (Neden?)

7.2.4. Listelerin Kullanlmas Listeler gerek anlamda rekursiv bileik veri yaplar olduklarndan bunlarn kullanlmalar iin rekursiv algoritmalarn kullanlmas gerekir. Liste ilemesinin en temel yntemi, listenin son elemanna ulancaya kadar listenin her elemann

95

incelemektir. Bu tr ilemde kullanlmas gereken algoritmalar genelde iki cmleden oluurlar. Bir cmle, ba ve kuyruk olarak ikiye blnebilen listeler iin, ikincisi ise bo listeler iin kullanlr. rnein aadaki programda bir listenin elemanlarn nasl grntleyeceimizi grelim: DOMAINS benim_listem = string* PREDICATES benim_listemi_yaz(benim_listem) CLAUSES benim_listemi_yaz ([]). benim_listemi_yaz (Kuyruk). GOAL benim_listemi_yaz(["Visual", "Prolog", "4.0"]). Bu programdaki benim_listemi_yaz (["Visual", "Prolog", "4.0"] sorgusuyla Bas=Visual, Kuyruk=["Prolog","4.0"] deerlerini alr ve Visual deeri yazlr. Daha sonra benim_listemi_yaz yklemi rekursiv olduu iin ["Prolog", "4.0"] ksm yeniden blnr. Bu kez Bas=Prolog, Kuyruk=4.0 olur ve Prolog deeri grntlenir. Rekursiv ilem bir kez daha 4.0 iin uygulanr ve bu defa Bas=4.0, Kuyruk=[] olur. Kuyruk ksm bo liste olduundan sadece 4.0 grntlenir. Rekursiv ar bu kez bo liste iin yaplr, fakat listenin Ba ve Kuyruk ksmlarnn eleebilecekleri deer olmadndan, program akndaki benim_listemi_yaz([]) cmlesi arlr ve program bir ey yapmadan normal ekilde durur. benim_listemi_yaz ([]) eklindeki cmle, programn normal bir biimde durmasn salar. 7.2.5. Liste Elemanlarnn Saylmas Bir listenin ka elemandan olutuunu nasl bulabiliriz? Bunun iin kullanlmas gereken temel mantk udur. Liste bo [] ise, listedeki toplam eleman says 0dr. Bunun dndaki listelerin eleman says 1+ Kuyruk Uzunluu ile bulanabilir. Prologda karl aada verilmitir. DOMAINS liste=integer* /*Liste bo ise yaplacak bir ey yok.*/ benim_listemi_yaz ([Bas|Kuyruk]):-write(Bas), nl,

96

PREDICATES liste_uzunlugu(liste, integer) CLAUSES liste_uzunlugu([], 0). liste_uzunlugu([_|Kuyruk],Eleman_sayisi):-liste_uzunlugu(Kuyruk, Kuyruk_uzunlugu), Eleman_sayisi=Kuyruk_uzunlugu+1. GOAL liste_uzunlugu([1, 2, 3], Eleman_sayisi). lk cmledeki [_|Kuyruk] bo olmayan btn listelerle eleebilir. Bizim iin nemli olan ksm listenin kuyruk ksm olduu iin ba ksm yerine anonim deiken kullanlmtr. GOAL liste_uzunlugu([1, 2, 3], Eleman_sayisi). sorgusu ikinci cmle ile eleir ve Kuyruk=[2, 3] olur. Daha sonraki adm Kuyruk uzunluunu hesaplamaktr. Bu yapld zaman Kuyruk=2 olur. Uzunluk=kuyruk_uzunluu+1 olduundan Uzunluk=3 olur. Liste_uzunlugu yklemi kendisini ararak [2, 3] listesinin uzunluunu bulur. Bunun iin Cmledeki kuyruk=[3] deerini alr. Kuyruk_uzunlugu=Eleman_sayisi deerini alr. Her rekursiv cmlenin kendisine ait deiken kmesi olduundan, cmledeki kuyruk_uzunlugu unutulmamaldr. Bu durumda btn mesele [3] uzunluunu bulmaktr. Bu 1 olduu iin buna 1 ilave edilirse [2, 3] iin toplam uzunluk 2 olur. [3] listesinin uzunluu iin liste_uzunlugu yklemi kendisin tekrar arr. Bu kez [3] listesinin kuyruk uzunluu Kuyruk=[] olur. Kuyruk uzunluunu hesaplamak iin ise liste_uzunlugu([], Kuyruk_uzunlugu) ilk cmle ile eleir ve Kuyruk_uzunlugu=0 olur. imdi bilgisayar bu deere, yani 0a 1 ilave ederek [3]n uzunluunu bulur. Buna 1 ilave ederek [2, 3]n uzunluunu bulur. Nihayet buna da 1 ilave ederek [1, 2, 3] listesinin toplam uzunluunu bulur. imdi bu ilemlerin tamamn sralayarak konuyu biraz daha netletirelim. Liste_uzunlugu([1, 2, 3], Eleman_sayisi1). Liste_uzunlugu([2, 3], Eleman_sayisi2). ve sorgudaki kuyruk_uzunlugu birbirine karmad

97

Liste_uzunlugu([3], Eleman_sayisi3). Liste_uzunlugu([], 0). L3=0+1=1 L2=L3+1=2 L1=L2+1=3 7.2. Sondan Rekursiyona Yeniden Bak Rekursiv bir ar, cmledeki son adm olamayaca iin liste_uzunlugunun sondan rekursiv olamayaca bellidir. Bunu sondan rekursiv yapmann yolu vardr. Burada problem olan ey, kuyruk uzunluu bilinmeden bir listenin toplam uzunluunun hesaplanamaydr. Yani bu probleme bir zm bulunabilirse, liste_uzunlugu yklemini sondan rekursiv yapmak mmkndr. Bunun iin liste_uzunlugu ykleminin argmannn olmas gerekir. 1. Birincisi, her seferinde krplarak sonunda bo bir liste elde edilecek listenin kendisi. 2. Bir dieri, liste uzunluunu saklayacak bo bir deiken 3. Sonuncusu ise 0 ile balayan ve her seferinde deerinin 1 artt bir saya deiken. Geriye sadece bo olan liste kald zaman bu saya hibir deikene atanmam olan sonucu alr. DOMAINS liste=integer* PREDICATES liste_uzunlugu(liste, integer, integer) CLAUSES liste_uzunlugu([], Sonuc, Sonuc). liste_uzunlugu([_|Kuyruk], Sonuc, Sayac):Yeni_sayac=Sayac+1, liste_uzunlugu(Kuyruk, Sonuc, Yeni_Sayac). GOAL liste_uzunlugu([1, 2, 3], Uzunluk, 0), write ("Uzunluk =", Uzunluk), nl. Verilen bir listedeki elemanlar zerinde ilem yaptktan sonra bu elemanlarn yerine hesaplanan elemanlardan oluan baka bir liste oluturmak mmkndr. Aadaki rnekte listenin her elemann 1 ilave ederek yeni bir liste elde edilmitir.

98

DOMAINS liste = integer* PREDICATES yeni_deger_ilave_et(liste, liste) CLAUSES yeni_deger_ilave_et([], []). /* lk art*/ yeni_deger_ilave_et([Bas|Kuyruk],[Bas1|Kuyruk1]):ayrlmas*/ Bas1=Bas+1, ar*/ GOAL yeni_deger_ilave_et([1, 2, 3], Yeni_Liste). Yukarda yaplan ilemler, szel olarak aaadaki ekilde yazlr. Bo bir listenin btn elemanlarna 1 ilave etmek iin sadece baka bir bo liste olutur. Bo olmayan herhangi bir listenin btn elemanlarna 1 ilave etmek iin, listenin ba ksmna 1 ilave et ve ilave edilen bu deeri yeni listenin ba olarak al. Daha sonra kuyruk ksmnn btn elemanlarna 1 ilave et ve yeni deerleri de yeni listenin kuyruk ksm olarak al. Sonucu Yeni_liste olarak ekranda grntle. Verilen liste [1, 2, 3] olduu iin: 1. nce Ba ve Kuyruk ksmlar ayrlr ve srasyla [1] ve [2, 3] olurlar. 2. Sonu listenin ba ve kuyruk ksmlarna Bas1 ve Kuyruk1 deerlerini ata. Burada Bas1 ve Kuyruk1in henz deer almadna dikkat edilmelidir. 3. Bas ksmna 1 ilave et ve Bas1i elde et. 4. Rekursiv olarak Kuyruk ksmndaki btn elemanlara 1 ilave et ve Kuyruk1i elde et. Bu yapld zaman Bas1 ve Kuyruk1 kendiliinden sonu listesinin Bas ve Kuyruk ksm olur. Bunlar birletirmek iin ayr bir operasyon gerekmez. Dolaysyla rekursiv ar gerekten de prosedrn son adm durumundadr. rnek: Bir listedeki saylar tarayp negatif olanlar eleyen program DOMAINS liste=integer* /* Listenin ilk elemanna 1 ilave et*/ /* eleman listenin geriye kalanyla yeni_deger_ilave_et(Kuyruk, Kuyruk1). /* Bas ve Kuyruk

99

PREDICATES negatifleri_ele(liste, liste) CLAUSES negatifleri_ele([], []). negatifleri_ele([Bas|Kuyruk], IslenmisKuyruk):Bas<0, !, negatifleri_ele(Kuyruk, IslenmisKuyruk). negatifleri_ele([Bas|Kuyruk], [Bas|IslenmisKuyruk]):negatifleri_ele(Kuyruk, IslenmisKuyruk). GOAL negatifleri_ele([2, -45, 3, 4, -5, -45], Yeni_Liste). Aadaki yklem, bir listenin her elemann baka bir listeye iki kez aktarmaktadr. elemanlari_ikile([], []). elemanlari_ikile([Bas|Kuyruk], [Bas, Bas|Ikilenmis_Kuyruk]):elemanlari_ikile(Kuyruk, kilenmis_Kuyruk). 7.3. Liste Elemanl Ahmet, Mehmet, Hasan ve Nejla isimlerini eleman olarak ieren bir listede, rnein Ahmet isminin var olup olmadn renilmek istensin. Yani isim ve bir isim arasnda bir iliki sorgulansn. Bunun iin kullanlan bir yklem vardr. uye(isim, isimlistesi). /*Burada isim listede geen bir isimdir.*/ DOMAINS isim_listesi = isim* isim = symbol PREDICATES nondeterm uye(isim, isim_listesi) CLAUSES uye(Isim, [Isim|_]). uye(Isim, [_|Kuyruk]):- uye(Isim, Kuyruk). GOAL uye(ahmet, [ mehmet, ahmet, hasan, nejla]). Yukardaki rnekte nce birinci cmleyi inceleyelim. uye(Isim, [Isim|_]) cmlesindeki Isim deikeni listenin ncelikle ba ksmnda aratrlr. Eer eleme salanrsa yeliin var olduu sonucuna varlr ve olumlu sonu grntlenir. Listenin kuyruk ksm bizi ilgilendirmedii iin burada anonim deiken kullanlmtr.

100

Eer aradmz isim listenin ba ksm ile elemezse bu kez listenin kuyruk ksmn incelemek iin ikinci cmle kullanlr. 7.4. Listeleri Birletirme Aadaki iki cmleyi tekrar inceleyelim. Bu iki cmleye prosedrel ve dekleratif olarak bakmak mmkndr. uye(Isim, [Isim|_]). uye(Isim, [_|Kuyruk]):- uye(Isim, Kuyruk). Bu cmlenin dekleratif olarak anlam udur: Eer cmlenin ba ksm Isim deikenine eitse, bu durumda Isim, listenin bir elemandr. Bu durum doru deilse, Ism deikeni kuyruk ksmnn yesi ise Isim listenin bir elemandr. Prosedrel olarak bu iki cmle yle yorumlanabilir. Bir listedeki herhangi bir eleman bulmak iin, listenin ba ksmn; aksi takdirde, bu listenin kuyruk ksmnn bir yesini bulunuz. Bu iki durumu denemek iin uye(2, [1, 2, 3, 4]) ve uye[X, [1, 2, 3, 4]) sorgularn kullannz. lk sorgu, bir durumun doru olup olmadn sorgulamak iin kullanlrken, ikinci sorgu listenin btn yelerini bulmak iin kullanlmaktadr. 7.5. Rekursiyona Prosedrel Bir Bak Bu ksmda bir listeyi baka bir listeye ekleyen bir yklem oluturulacaktr. Ekle ykleminin argmanla birlikte tanmlanmas gerekir. Ekle(Liste1, Liste2, Liste3) Ekle yklemi Liste1'i Liste2'ye ilave ederek Liste3' elde eder. Eer Liste1 bo ise, bu durumda 1. Listeyi 2. Listeye ilave etmek bir eyi deitirmez. Yani: Ekle([], Liste2, Liste2). Eer liste1 bo deilse, Ekle([Bas|Kuyruk1], Liste2, [Bas|Kuyruk3]):-ekle (Kuyruk1, Liste2, Kuyruk3]). Liste1 bo deilse, rekursiv olan yklem her seferinde bir eleman Liste3'e transfer eder. Liste1 bo olduunda ilk cmle Liste2'yi liste3'n sonuna ilave eder. rnek: DOMAINS sayilar=integer*

101

PREDICATES ekle(sayilar, sayilar, sayilar) CLAUSES ekle([], Liste, Liste). ekle([Bas|Kuyruk1], Liste2, [Bas|Kuyruk3]):ekle (Kuyruk1, Liste2, Kuyruk3). GOAL ekle ([1, 3, 5], [2, 4, 6], Yeni_Liste). Yukardaki program sadece birletirilen iki listenin sonucunu almak iin deil, ayn zamanda sonu listesini yazp ilk iki liste iin geerli btn alternatifleri bulmak iin kullanmak mmkndr. rnein GOAL ekle (Birinci_Liste, Ikinci_liste, [2, 4, 5, 6]). Denendiinde toplam 5 zm bulunur. Ayrca GOAL ekle ([3, Ikinci_eleman],Liste_2, [3, 4, 5, 6]) eklindeki bir sorgu ile birinci listenin, rnein ikinci eleman ve ikinci listenin tamamn bulmak da mmkndr. 7.6. Btn zmleri Bir Defada Bulma Rekursiyon ve geriye iz srme ilemlerini karlatrrken rekursiyonun daha avantajl olduu daha nce belirtilmiti. Bunun nedeni, rekursiyon esnasnda argmanlar vastasyla aradaki admlarda elde edilen verilerin saklanabilmesidir. te yandan geriye dn ilemi bir sorguyu salayan btn zmleri bulabilirken, rekursiyon bunu yapamaz. Bunun iin Prolog'un hazr yklemlerinden olan findall yklemi kullanlr. Findall bir sorguyu kendi argmanlarndan biri olarak alr ve bu sorgunun btn zmlerini tek bir liste altnda toplar. Findall ykleminin toplam 3 argman vardr. lk deiken, rnein Degisken_Ismi, yklemden listeye aktarlacak deikenin hangisi oldugunu gsterir. kinci deiken, rnein yeni_yuklem, deerlerin alnaca yklemi gsterir. nc argman, rnein Yeni_Degisken, geriye dn ilemiyle elde edilen deerlerin listesi tutan bir deikendir. Yeni_degisken deerlerinin ait olduu bir tip tanmnn kullanc tarafndan yaplm olmas lazmdr. Bir gruptaki ya ortalamasn bulan bir program, aadaki ekilde yazlabilir. DOMAINS isim, adres = string yas = integer

102

liste = yas* PREDICATES nondeterm kisi(isim, adres, yas) toplam_liste(liste, yas, integer) calistir CLAUSES toplam_liste([], 0, 0). toplam_liste([Bas|Kuyruk], Toplam, N):toplam_liste(Kuyruk, S1, N1), Toplam=Bas+S1, N=1+N1. kisi("Oktay DUYMAZ", "Cumhuriyet Cad.", 36). kisi("O.Faruk AKKILI", "Nail Bey Mah. ", 30). kisi("Hakay TADEMR", "Firat Cad. No: 17", 28). calistir:findall(Yas, kisi(_,_, Yas), L), toplam_liste(L, Toplam, N), Ortalama=Toplam/N, write("Ortalama = ", Ortalama), nl. GOAL calistir. Programdaki findall cmlesi L listesini oluturarak kisi ykleminden elde edilen btn yalar buraya aktarr. 7.7. Bileik Listeler imdiye kadar oluturulan listelerde daima ayn trden olan elemanlar saklanmtr. Listeler tamsay, symbol vs.den oluuyordu. Bir liste ierisinde farkl tipte elemanlar bir arada yazmak olduka faydal olur. Birden fazla tipte olan elemanlar bir arada tutmak iin zel tanmlamalarn yaplmas gerekir. Bu da farkl operatrler tanmlamakla olur. rnek: Domains. Benim_listem = 1(liste); i(integer); c(char); s(string) Liste=benim_listem* [i(2), i(9), 1([s("araba"), s("bilgisayar")]), s("kalem")]

103

rnek: DOMAINS benim_listem =l(liste); i(integer); c(char); s(string) liste=benim_listem* PREDICATES ekle(liste, liste, liste) CLAUSES ekle([], L, L). ekle([X|L1], L2, [X|L3]):ekle(L1, L2, L3). GOAL ekle([s(sever), l([s(ahmet), s(deniz)])], [s(ahmet), s(ayse)], Sonuc), write("Ilk Liste : ", Sonuc, "\n"), ekle([l([s("Bu"), s("bir"), s("listedir.")]), s(test)], [c('c')],Sonuc2),nl, write ("kinci Liste: ", Sonuc2,'\n').

104

8. AKI DENETM Bir yklem iinde deeri bilinen deikenlere input (giri deikenleri), bilinmeyenlere ise output (k deikenleri) denir. Bu argmanlarn, input argmanlar ise balang deeri verilerek, output argmanlar ise kt almak zere uygun biimde kullanlmasna ak biimi denir. rnein bir argmann iki deikenle arlmas durumunda 4 farkl ak biiminden sz edilebilir. (i, i) (i,o) (o,i) (o, o) Programlar derlendii zaman yklemlerin global bir ak analizi yaplr. Ana sorgu ile balayp btn programn deerlendirmesi yaplr. Bu esnada programdaki btn yklemlere ak biimleri atanm olur. Ak analizi olduka basittir. nk program yazarken farknda olmadan ayn ey tarafmazdan da yaplmaktadr. rnek: GOAL cursor(R, C), R1=R+1, cursor(R1, C). Cursor yklemine yaplan ilk arda R ve C deikenlerinin hibir deeri olmad iin serbest deiken durumundadrlar. Dolaysyla ak biimi cursor(o, o) olur. R1=R+1 ifadesinde R deikeninin deeri cursor ykleminden gelecei iin, R deikenin bal olduu bellidir. Bu ardan sonra R1 deikeni deer alm olur. Eer R deikeni bo olsayd, bu durumda bir hata mesaj grntlenirdi. Cursor ykleminin son kez arlmasnda R1 ve C deikenlerinin ikisi de nceden arld iin artk giri deikenleri olarak ilem grrler. Yani arnn ak biimi cursor(i, i) olur. Burada sadece DOS Metin Modu ortamnda alan aadaki rnekler irdenelecektir. Predicates ozellik_degistir(Integer, Integer) Clauses ozellik_degistir(Yeni_ozellik,Eski_ozellik):-ozellik(Eski_ozellik), ozellik(Yeni_ozellik). GOAL ozellik_degistir(112, Eski), write("Merhaba"), ozellik(Eski, write(" millet").

105

GOAL ksmndaki ilk ar ozellik_degistir(i, o) ile yaplr. Burada 112 bilinen, Eski ise bilinmeyen deikendir. Bu durumda ozellik_degistir cmlesi Yeni_ozellik deikeni ile arldnda bunun deeri belli olduu iin input, Eski_ozellik'in deeri belli olmad iin output olacaktr. Ak denetisi ilk alt hedef olan ozellik(Eski_ozellik) cmlesine geldii zaman ozellik yklemi ozellik(o) ak biimi ile arlr. Ozellik ykleminin ikinci arl ozellik(i) eklinde olacaktr. Ana sorgudaki ozellik yklemine yaplan ar input olacaktr, nk ozellik_degistir ykleminden alnr. 8.1. Bileik Ak Bir yklemdeki deiken bileik bir nesne ise, ak biimi bileik bir ekilde olabilir. imdi aadaki rnekte olduu gibi, bir lke hakknda bilgilerin verildii bir veritaban dnelim. Yeni bilgileri rahatlkla ilave edebilmek iin her bilgiyi kendi tipiyle saklamak istenebilir. DOMAINS ulke_bilgileri=alan(string, ulong); nufus(string, ulong);baskent(string, string) PREDICATES nondeterm ulke(ulke_bilgileri) CLAUSES ulke(alan("Trkiye",876000)). ulke(nufus("Trkiye", 65000000)). ulke(baskent("Trkiye", "Ankara")). ulke(alan("Almanya",840000)). ulke(nufus("Almanya", 50000000)). ulke(baskent("Almanya", "Bohn")). GOAL ulke(alan(Ad, Alan)), ulke(nufus(Ad, Nuf)). Sorguyu aadaki cmlelerle deneyiniz: ulke (C) ulke(alan(Ulke_adi, Alani)) ulke(nufus("Trkiye", Nuf)) ulke(baskent("Trkiye", "Ankara")) (o) (o,o) (i, o) (i)

Son rnekteki btn terimler bilindii iin ak biim dz metindir.

106

8.2. Yklemlerin Ak Biimlerini Tanmlama Yklemler iin uygun bir ak biimi tanmlamak bazen daha gvenlidir. Yklemlerin sadece zel ak biimleri durumunda geerli olaca biliniyorsa, nceden ak biimi tanmlamak faydaldr. nk bu durumda ak denetisi bu yklemlerden yanl kullanlan ok rahatlkla bulabilir. Tip tanm yapldktan sonra '-' iareti yazarak ak biimi vermek mmkndr. PREDICATES musteri_bilgi_listesi(string, string, slist) -(i, o, o)(o, i, o) 8.3. Ak Analizini Kontrol Etmek Analiz mekanizmas, standart bir yklemin yanl bir ak biimi ile arldn tesbit ettii an hata mesaj verir. Bu hata mesaj, standart yklemleri aran yklemler tanmladmz zaman, bunlardan ak biimi anlamsz olanlar tesbit etmede bize yardmc olur. rnek: C=A+B ifadesinde A ve B serbest deiken olduundan, ak denetisi bu yklem iin ak biimi olmadn bildiren bir hata mesaj verecektir. Bu durumu kontrol etmek iin free ve bound standart yklemleri kullanlr. ki say arasnda toplama yapmak veya toplam ile ilk says verilen bir durumda ikinci sayy bulan, btn ak biimleriyle arlabilen topla adnda bir yklem tanmlayalm. rnek: PREDICATES nondeterm topla(integer, integer, integer) nondeterm sayi(integer) CLAUSES topla(X,Y,Z):bound(X), bound(Y), Z=X+Y. /* (i,i,o) */ topla(X,Y,Z):-

107

bound(Y), bound(Z), X=Z-Y. /* (o,i,i) */ topla(X,Y,Z):bound(X), bound(Z), Y=Z-X. /* (i,o,i) */ topla(X,Y,Z):free(X), free(Y), bound(Z), sayi(X), Y=Z-X. /* (o,o,i) */ topla(X,Y,Z):free(X), free(Z), bound(Y), sayi(X), Z=X+Y. /* (o,i,o) */ topla(X,Y,Z):free(Y), free(Z), bound(X), sayi(Y), Z=X+Y. /* (i,o,o) */ topla(X,Y,Z):free(X), free(Y), free(Z), sayi(X), sayi(Y), Z=X+Y. /* (o,o,o) */ /* 0'dan balayan saylar bulma*/

108

sayi(0). sayi(X):sayi(A), X = A+1. GOAL topla(Ilk_sayi,7,10). 8.4. Referans Deikenler Ak denetisi bir cmleyi incelerken, bu cmlenin bandaki btn kt deikenlerinin cmlenin gvdesinde bal olup olmadn kontrol eter. Bir cmlede bir deiken bal deilse, bu deikenin referans deikeni olarak ilem grmesi gerekir. Bu karmaay gsteren bir rnek aada verilmitir. Predicates p(integer) Clauses p(X):-!. Goal p(V), V=99, write(V). Sorgudaki p yklemi kt biiminde arlr fakat clauses blmndeki p ykleminde bulunan X deikeni bal deiken deildir. Ak denetimi srasnda bu fark edildiinde, deikenin domains blmndeki tip tanmna baklr. Eer deiken tipi referans olarak tanmlysa problem kmaz. Tanmszsa uyar mesaj grntlenir. Bir cmledeki bir deiken bal deilse, bu durumda cmlenin herhangi bir deer aktarmas mmkn deildir. Bunun yerine referans deikenine bir pointer yollayarak daha sonra bu noktaya gerek deerin yazlmas salar. Bu, bu tipteki baz deikenlere deer aktarmak yerine, tip tanmnn tamamna ayn ilemin yaplmasn gerektirir. Kaytlara gnderilen pointerlar referans tipe ait argmanlara iletilir. Yani bileik bir tip referans bir tip haline gelirse, bu durumda btn alt tiplerin de referans tip olarak ilem grmesi gerekir. Bileik bir tipin referans tip olarak tanmlanmas durumunda, derleyici dier btn alt tipleri de referans tip olarak kabul eder. 8.4.1. Referans Tip Tanm Ak denetisi program ierisinde bamsz bir deiken bulduunda deiken sadece bir cmleden dn srasnda baml deilse uyar verir. Bu durum sizin iin uygunsa, bu tip tanm otomatik olarak referans tip olarak kabul edilir. Bununla

109

birlikte referans tip olarak tanmlamak istenen bir tipi domains blmnde net olarak tanmlamak daha mantkldr. 8.4.2. Referens Tip ve zleme Dizileri(array) Zorlama ve ekstra eletirme gerektirdii iin, referans tipler programn alma hznda genel bir azalmaya neden olur. Fakat referans tip tanmnn neden olduu problemler daha etkili biimde kullanlabilir ve bu tip tanmlarnn etkileri azaltlabilir. Referans tipler kullanld zaman, Visual Prolog izleme dizini kullanr. Bu izleme dizini referans deikenlerin deer aldklar an bildirmek iin kullanlrlar. Referans bir deikenin oluturulmas ve deer almas arasndaki herhangi bir noktaya geriye dn yapld zaman, bu deikenin yeniden deer almam hale getirilmesi gerekir. Fakat bu problem dz deikenlerle urarken meydana gelmez. nk bunlarn oluturulmas ve deer alma noktalar ayndr. zlemede kaydedilen her bir ar 4 byte (32 bit bir pointerin bykl) kullanr. Gerektiinde kuyruk bykl otomaki olarak arttrlr. zin verilen maksimum byklk 16-bit Visual Prolog iin 64K, 32-bit iin ise snrszdr. Standart tipleri referans tip olarak kullanmak iyi bir fikir deildir. nk program kullancnn tanmlad bu referans tipi, ayn tip iin daima geerliymi gibi kullanr. Bunun yerine, istenilen temel tip iin referans bir tip tanmlamak daha uygundur. rnein aadaki program parasnda kullancnn tanmlad tamsayi_referans_tipi tamsaylar iin referans tiptir. Dolaysyla tamsayi_referans_tipi her kullanmda referans tip olarak ilem grr. Fakat tamsay tipindeki deiken referans tip olarak deil, normal olarak integer olarak ilem grr,. Domains tamsayi_referans_tipi= reference integer Predicates P(tamsayi_referans_tipi) Clauses P(_). 8.5. Referans Tip Kullanm Referans tip kullanmnn en doru biimi, sadece gerekli olan birka yerde kullanp geri kalan ksmlarn tamamnda referans olmayan tipi kullanmaktr. Zaten

110

gerekli olan durumlarda referans ve referans olmayan tipler arasnda dnm yapmak mmkndr. imdi referans olan bir tamsayy referans olmayan bir tamsayya dntrelim. Domains Referans_tamsayi=reference integer Predicates Donustur(referans_tamsayi, tamsayi) Clauses Donustur(X, X). smi ayn olan bir deiken referans ve referans olmayan tipte kullanld zaman dnm otomatik olarak yaplr. Yukardaki rnekte referans_tamsayi ve tamsayi arasnda dnm otomatik olarak yaplr. Referans bir deikenin, referans olmayan bir deere dntrlebilmesi iin ncelikle bir deer alm olmas gerekir. Yani referans tip olarak tanml bir deikeni dntrmek iin (rnein referans tamsaylardan referans karaktere) ncelikle bu deikenin bir deer alm olduundan emin olmak gerekir. Aksi takdirde serbest deiken kullanlamaz eklinde hata mesaj grntlenir. Referans tip tanmlarnn nasl altn tam olarak anlamak iin aadaki program deiik sorgularla altrlmaldr. DOMAINS referans_tamsayi = integer referans_liste= reference referans_tamsayi* PREDICATES nondeterm eleman(referans_tamsayi, referans_liste) ekle(referans_liste, referans_liste, referans_liste) CLAUSES eleman(X, [X|_]). eleman(X, [_|L]):eleman(X, L). ekle([], L, L). ekle([X|L1], L2, [X|L3]):ekle(L1, L2, L3). GOAL eleman(1, L). Aadaki sorgular da deneyin

111

eleman(X, L), X=1. Elemanlar arasnda 1 olan btn listeleri bul. eleman(1, L), eleman(2, L). Elemanlar arasnda 1 ve 2 olan btn listeleri bul X=Y, eleman(X, L),eleman(Y, L), X=3. X ve Ynin eleman olduu listeler eleman(1, L), ekle(L, [2, 3], L1). ekle(L, L, L1), eleman(1, L). 1in iki kez eleman olduu listeler. 8.6. Ak Biimine Yeni Bir Bak Referans bir deiken serbest halde olmasna ramen, bir yklem ars iinde arld anda mevcut olabilir. lkeler hakkndaki programda ayni_baskentler:ulke(baskent(Kent, Kent), write(Kent, \n), fail eklindeki bir sorguyla, bakentleri lke ismiyle ayn olan btn lkeleri bulmak isteyelim. Burada kent deikeni iki kez kt ak ile kullanlmtr. Fakat bu sorgu satrnn syledii ey; Kent deikeni deer ald anda ikinci deiken olan Kentin de ayn deeri almas gerektiidir. Bu yzden her iki deiken ar yaplmadan nce yaratlp eletirilir. te bunu yapabilmek iin bunlarn tipi referans tipe dntrlr ve iki deiken ar anndan itibaren kullanma girerler. Standart tip tanmlarnn referans tip haline getirmenin ok yanl bir kullanm olaca daha nce sylenmiti. Eer byle bir ey yaplmak isteniyorsa, uygun bir referans tip tanmlamak daha mantkldr. 8.7. kili (Binary) Aa Yapsnn Referans Tip le Kullanm nceki sralama ilemleri ikili aa yaps ile zlmt. Ayn eyi referans tip tanm ile daha gzel biimde yapmak mmkndr. Aa yapsndaki bir dal, bir deer aldktan sonra deitirmek mmkn deildir. Aa oluturulurken pek ok noktann kopyas oluturulur. Sralama ilemini byk miktarda veri zerinde yapld dnlrse, bunun hafza tamasna neden olabilecei grlr. Referans bir tip, aacn dallarn serbest deiken olarak brakarak, bu durumu dzeltebilir. Bir referans tipi bu ekilde kullanarak yeni bir daln ilave edilecei noktann zerindeki dal kopyalamaya gerek kalmaz. rnek: Domains agac = reference t(isim, agac, agac) isim = string

112

PREDICATES araya_ekle(isim, agac) CLAUSES araya_ekle(ID, t(ID,_,_)):-!. araya_ekle(ID, t(ID1, Agac,_)):ID<ID1, !, araya_ekle(ID, Agac). araya_ekle(ID, t(_,_,Agac)):araya_ekle(ID, Agac). GOAL araya_ekle("Alper", Agac), araya_ekle("Kasim", Agac), araya_ekle("Paki", Agac). lk araya_ekle(Alper, Agac) alt hedefi ilk kural ile eleir ve bileik nesne t(Alper,_,_) biimini alr. Tdeki son iki argman bal deiken olmasalar da t dier alt hedefe iletilir: araya_ekle(Kasim, Agac). Bu, agac deikenini t(Alper, t(Kasim,_,_),_) deerini aldrr. Son olarak son alt hedef araya_ekle(Paki, Agac) agac deikenini t(Alper, t(Kasim,_, t(Paki,_,_)),_) deerine atar ve sonuta bu deer grntlenir. 8.8. Referans Tip Kullanarak Sralama Daha nce ikili aa kullanarak yaplan sralama rneini, referans ve referans olmayan tipler arasnda ayrm yaparak nasl yapabileceini gsteren bir rnek, aada verilmitir. DOMAINS agac=reference t(deger, agac, agac) deger=integer liste = integer* PREDICATES araya_ekle(integer, agac) agac_ekle(liste, agac) nondeterm agacin_elemanlari(integer, agac) sirala(liste, liste)

113

CLAUSES araya_ekle(Deger, t(Deger,_,_)):-!. araya_ekle(Deger, t(Deger1,Agac,_)):Deger<Deger1,!, araya_ekle(Deger, Agac). araya_ekle(Deger, t(_,_,Agac)):araya_ekle(Deger, Agac). agac_ekle([],_). agac_ekle([Bas|Kuyruk],Agac):araya_ekle(Bas,Agac), agac_ekle(Kuyruk, Agac). agacin_elemanlari(_,Kuyruk):free(Kuyruk),!, fail. agacin_elemanlari(X,t(_,L,_)):agacin_elemanlari(X, L). agacin_elemanlari(X,t(RefStr,_,_)):X=RefStr. agacin_elemanlari(X,t(_,_,R)):agacin_elemanlari(X, R). sirala(L,L1):agac_ekle(L, Agac), findall(X, agacin_elemanlari(X,Agac), L1). GOAL sirala([10,9,17,21,114,5], L), write("Liste= ", L),nl. Bu rnekte referans tipler sadece agac deikeninde kullanlmtr. Dier argmanlarn tamam referans olmayan tiplerdedir. 8.9. Binary (kili) Tip Visual Prologda ikili verileri kullanmak iin zel tip, ikili terimlerin elemanlarna erimek iin zel yklemler vardr. kili terim kullanmann tek amac, baka trl anlaml bir ekilde gsterilemeyen verileri kullanmak ve bunlar saklamaktr. Binary terimleri okuma, bunlar dosyaya aktarma ilemi iin zel yklemler vardr. Binary terimlerin temel amac mantksal olmayan nesneler dier programlama dillerinin iine kolayca yerletirilmesine imkan tanmaktr. Binary terimler, geriye iz srme mekanizmas erevesinde Prologdaki dier terimlerden farkl davranrlar.

114

Geriye iz srme mekanizmas, binary terimin oluturulduu noktadan ncesine giderse, binary terimlerin o ana kadar aldklar deerleri kaybederler. Geriye dn, herhangi bir binary terimin oluturulduu noktadan ncesine dnmezse, binary terimdeki deiikliklere bir ey olmaz. 8.9.1. Binary Terimlerin Kullanlmas Bir binary terim byte biiminde bir dizi ve bu dizinin bykln saklayan word (16 bit) veya dword(32 bit ortam) deikenden oluur.

Dier dillerden ar yapldnda, binary tipindeki bir terim (dier bir dildeki fonksiyonun arsayla aktarlan deiken) gerek ierie iaret eder. Buradaki byklk alan, alann kendisinin sahip olduu byklktr. Binary terimler 16 bit platformlarda genelde 64K ile snrldr. 8.9.2. Binary Terimlerin Yazm Biimi Binary terimler okunup metin biimde yazlabilir. Visual Prologda program satrlar gibi yazlabilir. Yazlm biimi: $[b1, b2, ....., bn] Burada b1, b2 vs. ilgili terimin byte olarak yazlm halidir. Program ak ierisinde yazld zaman, buradaki her byte uygun bir pozitif biimde desimal, hegzadesimal, oktal veya karakter olarak yazlabilir. Karakter olarak yazlan byte, program alrken daima hegzadesimal biime dntrlr ve 0x ksmlar bulunmaz. rnek: GOAL write("Binary terimi metin biiminde yaz: ", $['C', 12, 15, 0x14, 'e', 5], '\n').

115

8.9.3. Binary Terimlerin Oluturulmas Binary terim oluturmak iin Visual Prologda mevcut olan yklemler srayla aada verilmitir. 8.9.3.1. makebinary(1) makebinary, tanmlanan byte saysnda bir binary terim oluturur ve ieriini binary 0 olarak ayarlar. ...., Bin=makebinary(10), .... Burada byte says, alan bykl hari, net byklk olmaldr. 8.9.3.2. makebinary(2) ki argman alabilen biiminde eleman bykl tanmlanabilir. ...., Usize=sizeof(unsigned), Bin=makebinary(10, Usize), .... Bu yklem, terim bykl eleman saysnn eleman byklyle arpmyla belirtilen bir binary terim oluturur. rnekte eleman says 10, eleman bykl ise sizeof(unsigned) olarak tanmldr. Terim ierii 0 olur. 8.9.3.3. composebinary(2) Mevcut olan bir pointer ve bir uzunluktan bir binary terim oluturur. Kullanm biimi: ..., Bin=composebinary(StringVar, Buyukluk), .... 8.9.3.4. getbinarysize(1) getbinarysize, verinin nndeki alan bykln hari tutarak, bir binary terimin net bykln byte trnden verir. ..., Buyukluk=getbinary(Bin), ... 8.9.4. Binary Terimlere Eriim 4 giri, dier 4 de k elde etmek iin kullanlan 8 yklem binary terimlere erimek iin kullanlabilir. Bunlarn hepsi binary terim bykl, tanml indeks ve istenilen maddenin byklne (byte, word, dword veya real) bal olarak bu deikenlerin doru aralklarda olup olmadklarn kontrol eder. Bu yzden bu

116

girileri, ikili terimlerin tanml snrlar dnda tanmlamak ve armak hataya neden olur. ndislerin (eleman numaralar) 0a gre deiir. Yani binary bir terimin ilk elemannn indisi 0, en son elemann da N-1 olur. 8.9.4.1. getentry(2) getentry yklemi getbyteentry, getwordentry, getdwordentry veya getrealentry biimlerinden biri olur ve srasyla byte, word, dword veya real tiplerinde giri yapp, giri alabilir. Deger= getbyteentry(Bin, 3), .... 8.9.4.2. setentry(3) getentryye karlk gelen bir yklem olup byte, word, dword eya real girileri yapar. ...., setbyteentry(Bin, 3, Baytlar), .... 8.9.5. Binary Terimleri Eletirme Binary terimler de dier terimler gibi eletirilebilir. Kullanm biimi: ..., Bin1=Bin2, .... Eletirme annda terimlerden biri serbest halde ise, birbirine eitlenirler. Her ikisi de bal ise, bu durumda binary terimlerin birbirine eit olup olmadklar kontrol edilir. 8.9.6. Binary Terimleri Karlatrma Binary iki terim eletirilirken u sonulara dikkat edilir: Eer byklkleri farkl ise, byk olan byk kabul edilir, deilse byte baznda karlatrlrlar. ki farkl byte bulunduu anda karlatrma durur, sonu toplam terimin karlatrlmas olarak gnderilir. rnein $[1, 2] $[100]den daha byktr fakat $[1,3]den daha kktr. Binary terimlerin baz zelliklerini gsteren bir program aada verilmitir. PREDICATES binary_karsilastir_ve_eslestir binary_karsilastir(binary, binary)

117

al(binary) CLAUSES binary_karsilastir_ve_eslestir:Bin=makebinary(5), binary_karsilastir(Bin, _), binary_karsilastir($[1,2], $[100]), binary_karsilastir($[0], Bin), binary_karsilastir($[1, 2, 3], $[1, 2, 4]). binary_karsilastir(B,B):-!, write(B, " = ", B, '\n'). binary_karsilastir(B1, B2):B1>B2, !, write(B1, " > ", B2, '\n'). binary_karsilastir(B1, B2):B1<B2, !, write(B1, " < ", B2, '\n'). al(Bin):setwordentry(Bin, 3, 255), fail. al(Bin):Buyukluk=getbinarysize(Bin), X=getwordentry(Bin, 3), write("\nBuyukluk= ", Buyukluk, "X = ", X, " Binary= ", Bin, '\n'). GOAL binary_karsilastir_ve_eslestir, % Binary kalatrma ve eletirme iin KelimeBuyuklugu=sizeof(word), Bin=makebinary(4,KelimeBuyuklugu), al(Bin), write("Run-time hatalar yanl indeksten kaynaklanyor:\n"), Indeks=4, trap(Setwordentry(Bin, Indeks, 0), E, write(Bin, "teriminin kelime indeksi", Indeks, " olustururken ", E, " hatasi olustu", '\n')). 8.9.7. Terimleri Binary Terimlere Dntrme Bileik bir terimin argmanlar bellein deiik yerlerinde olabilir. Basit tipleri dorudan kaytl terimde tutulurken karmak olanlar (pointer ile eriilenler ve global bir stackda olanlar) iindeki grndkleri terimin yaknlarnda olmayabilir. Byle bir

118

terimi programdan darya yollamak zor olur. nk terimin btn ieriinin kopyasn almann ak bir yolu yoktur. Dolaysyla bir terimdeki deikeni baka bir deikenle eletirirken sadece bu terime giden pointerin bir kopyas alnm olur. term_str yklemini kullanarak, bir terimi diziye ve diziden tekrar terime dntrmek mmkndr. Bu ise, sadece terimi ieriini kopyalamak iin gerektiinde, olduka yetersiz kalr. te bu problemi term_bin yklemini zer. 8.9.7.1. term_bin(3) term_bin, herhangi bir tipteki terim ve binary veri bloku arasnda dnm, terim ierii ve pointer sabitle bilgisini tutarak, yapar. Pointerin sabitleme bilgisi, binary veriye dntrlm terimi yeniden diziye dntrmek iin kullanlr. Kullanm yledir: term_bin(tip, Terim, Bin) /* (i,i,o), (i,_,i) */ Tip, Terimin ait olduu tip, Bin ise Terimin ieriini tutan binary terimdir. 8.10. Hatalar ve stisnalarla Urama Kaliteli yazlmlar gelitike, gvenilir programlar retmek iin hatalarn bulunmas ve tek tek ayklanmas da nemli hale gelmektedir. Visual Prolog, program alrken meydana gelen hatalar kontrol etmek iin standart yklemlere sahiptir. Programn ileyii esnasnda meydana gelebilecek btn hatalar DOS ortamda PROLOG.ERR, UNIX ortamnda PDCProlog.err dosyasnda saklanr. Hata mesaj numaras 10000 ve yukars kullancnn programnda kullanmas iin exit kodlar olarak ayrlmtr. Hata ve istisna durumlaryla uramak iin Visual Prologda temel olarak trap yklemi kullanlr. Bu yklem, run-time hatalarn ve exit yklemiyle harekete geirilen istisna durumlar yakalayabilir. Bu yklem kullanarak, rnein Ctr+Break tularna baslp baslmadn da kontrol edilebilir. 8.10.1. exit(0), exit(1) exit yklemine yaplan bir ar, run-time hataya edeerdir. Kullanm biimleri: exit ve exit(CikisKodu)

119

Argman kullanmadan exit yklemini kullanmak, exit(0) gibi alr. exite giden ar trap ykleminde dorudan veya dolayl olarak altrlrsa, CikisKodu trap yklemine geer. 8.10.2. trap(3) argman alan bu yklem hata yakalama ve istisna ynetimini gerekletirir. lk ve son argmanlar yklem arma, ikinci argman ise deikendir. Kullanm biimi: trap(YuklemCagirma, CikisKodu, HataDurumundaCagrilacakYuklem) rnein trap(islem(P1,P2,P3), CikisKodu, hata(CikisKodu,P1)),.... eklindeki bir ar gz nne alnrsa, ilem yklemi arlrken hata oluursa CikisKodu ilgili hatay verirken hata ynetme yklemi olarak tanmladmz hata yklemi arlm olur. Hata ykleminden dnte ise trap yklemi baarsz olur. Metin modu ortamnda BREAK akken BREAK yaplrsa, yani Ctrl+Break tularna baslrsa, trap yklemi bunu yakalar ve CikisKodu deerini olarak 0 grntler. rnek: Almam olan bir dosyadan dolay hata mesaj yakalayan program aada verilmitir. include "c:\\vip\\include\\error.con" DOMAINS file = giris_dosyasi PREDICATES hata_yakalama(integer, file) satir_al(file, string) CLAUSES hata_yakalama(err_notopen, Dosya):-!, write(Dosya, " isimli dosya ak deil\n"), exit(1). hata_yakalama(Hata, Dosya):-!, write(Dosya, "adli dosyada",Hata, " hatasi ", '\n'), exit(1). satir_al(Dosya, Satir):readdevice(Eski),

120

readdevice(Dosya), readln(Satir), readdevice(Eski). GOAL trap(satir_al(giris_dosyasi, Ilk), Hata, hata_yakalama(Hata, giris_dosyasi)), write(Ilk). 8.10.3. errormsg(4) errormsg yklemi, Visual Prolog hata mesajlar dosyasyla ayn biimde olan dosyalara erimek iin kullanlabilir. Kullanm biimi: errormsg(DosyaAdi,HataNo,HataMesaji,YardimMesaji) / (i, i, o, o)/ Bu ilem iin aadaki program rnei kullanlabilir: PREDICATES hata(integer) ana_kisim /* .......... */ CLAUSES hata(0):-!. % Ctrl+Break tuuna baslnca bir ey yapma hata(H):errormsg(prolog.err, H, HataMesaji, _), write(\nSayin Kullanici, Programnzda, H, nolu , ErrorMsg, hatasi meydana geldi), write(\nDosyanizi, hata.txt, dosyasina yaziyorum), save(hata.txt). GOAL trap(ana_kisim, CikisKodu, hata(CikisKodu)). 8.10.4. Hatalarn Bildirilmesi Visual Prologdaki baz derleyici direktiflerini kullanarak, programlarnz iindeki run-time hatalar kontrol edilebilir. Bu direktifler u amalarla kullanlr: Tamsay tama(overflow) hatalarn kontrol edip etmeme durumu run-time hatalar hangi ayrnt dzeyinde verilecei Yn tamas(Stack overflow) kontroln yapma

121

Bu direktifler programn ba tarafnda verilebilecei gibi, VIP altrldktan sonra Compiler Options seeneiyle de verilebilir. 8.11. Hata Dzeyi Visual Prologun, run-time hatann olutuu yeri gstermeye yarayan ok gzel bir mekanizmas vardr. Meydana gelen hatann hangi dzeyde bildirileceini, hatann meydana geldii yeri, derleyicinin errorlevel direktifi belirler. Kullanm biimi yledir: errorlevel=n nnin alabilecei deerler 0, 1 veya 2 olabilir. Bu deerlere gre derleyicinin sunaca hata dzeyi unlar kapsar: 0 Bu durumda en kk ve en etkin hata mesaj verilir. Fakat hatann yeri kaydedilmez, sadece hatann numaras verilir. 1 Default olarak kabul edilen dzey budur. Hata meydana geldiinde hatann meydana geldii nokta, dosyann balangcndan itibaren byte trnden gsterilir. 2 Bu dzey seildiinde, 1 durumunda gsterilmeyen stack overflow, heap overflow, trail oveflow vs. gibi hatalar grlebilir. Burada da hatann meydana geldii yer bildirilir. Proje baznda alrken hata mesaj dzeylerini ayarlarken dikkatli olmak gerekir. Bir projede birden fazla dosya bulunaca iin, birbirine bal olan dosyalardaki hata dzeyleri farkl biimde ayarlanrsa, errorlevel=0 olan bir alt dosyada hata meydana gelirse ve ana dosyada errorlevel=1 veya 2 olursa, bu durumda hatann meydana geldii yeri tam olarak bulmak imkansz olur. 8.11.1. lasterror(4) lasterror, en son olan hatayla ilgili btn bilgiyi verir. Kullanm biimi: lasterror(HataNo,Modul,IncDosyasi,HataYeri) Burada Modul, hatann meydana geldii dosya ad, IncDosyasi ise include dosyasdr. Bellek tamas hatalarnn doru olarak alabilmek iin programn errorlevel=1 olarak derlenmesi gerekir. Sadece basit hatalarn mesajlar alnmas isteniyorsa errorlevel=1 yeterlidir.

122

8.11.2. Terim Okuyucudan Gelen Hatalar Grme consult veya readterm yklemleri arldnda okunacak satrda bir hata var ise, bu yklemlerin hata mesaj vererek duracaklar bilinmektedir. Hata nedenleri ise okunacak satrn uygun biimde hazrlanmam olmamasdr. rnein: Bir diziyi sonlandrmamak Symbol trnde bir karakter yerine integer bir karakter yazmak Yklem ad iin byk harfler kullanmak Sabit deerleri iinde yazmamak vs. readtermerror ve consulterror yklemlerini kullanarak readterm veya consult yklemlerinin okumaya alt dosyalarda ne tr hatalar meydana geldiini kontrol edebililir. consult ve readterm yklemlerinden gelen hatalar trap yklemi tarafndan yakalanrsa, consulterror ve readtermerror yklemlerini kullanarak hatann nedenini grmek ve yazmak mmkndr. 8.11.3. consulterror(3) consulterror, hatal yazmn bulunduu satrdaki hata hakknda bilgi verir. Kullanm biimi consulterror(Satir, HataYeri, DosyadakiYeri) Satir, hatann bulunduu satr, HataYeri hatann bulunduu nokta, 3. parametre ise hatal satrn bulunduu yer verilir. rnek: CONSTANTS yardim_dosyasi="prolog.hlp" hata_dosyasi="prolog.err" DOMAINS dom = a(integer) liste= integer* DATABASE - firat_dba p1(integer, string, char, real, dom, liste) PREDICATES

123

consult_hatalarini_ayiklama(string, integer) CLAUSES consult_hatalarini_ayiklama(Dosya, Hata):Hata>1400, Hata<1410, !, retractall(_, firat_dba), consulterror(Satir, Hatanin_Yeri,_), errormsg(hata_dosayasi, Hata, Mesaj, _), str_len(Bosluklar, Hatanin_Yeri), write(Dosya, " dosyasinin ", Satir, " satrnda ", Bosluklar, Mesaj, "meydana gelmistir"), exit(1). consult_hatalarini_ayiklama(Dosya, Hata):errormsg(hata_doyasi, Hata, Mesaj, _), write(Dosya, " dosyasi almaya alrken ", Mesaj, " hatas olutu"), exit(2). GOAL Dosya="test.dba", trap(consult(Dosya, firat_dba), Hata, consult_hatalarini_ayiklama(Dosya, Hata)), write("\n Tamam \n"). 8.11.4. readtermerror(2) readtermerror, readterm ykleminin okuduu satrdaki hatay verir. Kullanm biimi: readtermerror(Satir, HataYeri) 8.12. Break Kontrol (Sadece Metin Modunda) Visual Prologdaki break mekanizmasnn nasl altna bakalm. Genelde, break iin gerekli komutlar o anda alan program hemen durdurmazlar. Prologda, istisnai durumlar yneten bir birim vardr. Sinyal ile aktif edilen bu para bir flag yerletirir. Visual Prolog bu flag iki farkl durumda kontrol eder. Yazlan program, break-kontrol ak halde derlenirse, her yklem girildiinde break-flag durumu kontrol edilir. Break-kontrol seenei, VIP seeneklerinden iptal uygun direktif seilerek (Options/Compiler Directives/Run-time check) iptal edilebilir. Library rutinlerinin bazlar break-flag kontrol yaparlar.

124

8.12.1. break(1) break, bir program alrken break-flag kontrolnn yaplp yaplmayacan belirtir. Kullanm biimleri yledir. break(on), break(off) break(BreakDurumu) DOS tabanl pgogramlar iin break komutundan kaynaklanan k kodlar daima 0 olur. 8.12.2. breakpressed(1) break-flag kurulmusa, break(off) olsa veya program nobreak seeneiyle derlense bile, breakpressed yklemi baarl olur. Baarl olunca, yakalanan en son sinyale gre bir k kodu verir ve break-flag siler. 8.13. DOS Metin Modunda Kritik Hata Kontrol Bu blm sadece DOS metin modu ortamnda geerlidir. Dolaysyla VPI programlarna uygulanamaz. Visual Prologun DOS versiyonu hata durumlaryla ilgilenen baz rutinler ierir. Bir DOS hatas olduu zaman DOS, criticalerror rutinini arr. Visual Prologdaki sistem ise, run-time editr de bir dosya hatas bulduunda fileerror yklemini arr. Bu yklemler global olarak tanmlanr ve kendinize ait cmlecikler kullanrsanz, librarydeki rutinler yerine size ait rutinleri programa balar. Dolaysyla hatalar daha iyi kontrol etmek mmkndr. Bu durumda .EXE programlarnn bykl byk oranda azalr. criticalerror ve fileerror iin global deklerasyon include dosyasnda error.pre iinde hazr olarak bulunmaktadr. 8.13.1. criticalerror(4) Visual Prolog, bu rutini DOS kritik hatalaryla uramak iin tanmlar. criticalerror yklemi kullanlmak istenirse, ERROR.PRE dosyas programa dahil edilmelidir. Tanmlanmas yledir: global predicates criticalerror(HataNo, HataTuru, DiskNo, Eylem)

125

criticalerror yklemi daima baarl olmaldr. Bu yklem sadece .EXE dosyasndan alr ve DOS kritik hata interrupt tutucusuyla yer deitirir. Aadaki tabloda criticalerror ykleminin argmanlarnn ald deerler verilmitir.

126

Tablo 8.4. Criticalerror ykleminin argmanlarnn ald deerler


Argman HataNo Deer = 0 = 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8 = 9 = 10 = 11 = = = = = = = 0 1 2 0-25 0 1 2 Anlam Yazma korumal diskete yazma teebbs Bilinmeyen nite Src hazr deil Bilinmeyen komut Veri iinde CRC hatas Yanl src istei yap uzunluu Arama hatas Bilinmeyen medya tr Sektr bulunamad = 12 Yazcda kat bitmi Yazma hatas Okuma hatas Genel hata Karakter ara hatas Disk okuma hatas Disk yazma hatas A-Zye kadar src almay durdur lemi yeniden dene lemi iptal et (Tehlikeli olabilir ve tavsiye edilmez)

HataTr DiskNo Eylem

8.13.2. fileerror(2) Metin modundaki bir dosya eylemi baarsz olunca fileerror yklemi harekete geirilir. Kendinize ait fileerror yklemini tanmlarsanz, bu yklemin baarsz olmasna izin verilmez ve bu yklem sadece .EXE uygulamalarndan alr. fileerrorun ERROR.PRE dosyasndaki tanmlanmas yledir: global predicates fileerror(integer, string) (i, i) language c as _MNU_FileError Bu tanm tipi dorudur. Kaynak kod Prologda olsa bile language c mutlaka belirtilmelidir. 8.14. Dinamik Cut Prologdaki cut statiktir. Geleneksel cut ileminde, program ak ancak ! sembolne geldii zaman cut devreye girer ve sadece iinde bulunulan cmleleri etkiler. Dolaysyla bir cut komutunun etkisini baka bir ykleme aktarmak mmkn deildir. Normal cut komutunun dier bir dezavantaj da; yklemde cut komutunu takip eden cmlelerdeki geriye dn noktalarn ortadan kaldrmadan, bir alt hedefteki dier zmleri arama ihtimalini ortadan kaldrmann mmkn olmamasdr.

127

Visual Prologda dinamik kesme mekanizmasnda getbacktrack ve cutbacktrack yklemleri kullanlr. Bu mekanizma sayesinde bu iki dezavantaj ortadan kalkm olur. getbacktrack, geriye iz srme noktalarnn yn ierisinde en stteki pointeri verir. Bu noktann stnde kalan btn geriye dn noktalar silinebilir. Bu iki yklemin kullanm hakkndaki rnekler, aada verilmitir. 1. Elimizdeki veritabannda sahislarin isim ve aylk gelirleri var. Bu sahslarn arkadalarn kaydetmi durumdayz. database sahis(symbol, income) arkadas(symbol, symbol) Arkada olan veya az bir vergi deyen insanlarn listesini grmek iin aadaki cmlecikleri kullanabiliriz: sansli_insanlar(aradasi_var(P)):-sahis(P,_), arkadas(P,_). sansli_insanlar(zengindir(P)):-sahis(P, AylikGelir), not(zengin(AylikGelir)). Bir ahsn birden fazla arkada varsa, ilk cmlecik birden fazla zm getirir. Bu arada dinamik cut kullanabiliriz. sahsli_insanlar(arkadasi_var(P)):sahis(P,_), getbacktrack(BTOP), arkadas(P,_), cutbacktrack(BTOP). Geriye dn mekanizmas yaplrsa, arkada yklemi birden fazla zm sunabilir. Fakat cutbacktrack yklemi arlarak bu ihtimal ortadan kaldrlr. Dinamik cut kullanmann daha nemli avantaj, geriye dn pointerini baka bir ykleme geirmek ve cut komutunu artl olarak altrmaktr. Pointer pozitif tipte olup yine pozitif tipteki deikenlere aktarlabilir. rnek: Bir tua basncaya kadar ekrandan girilen rakamlar okuyan bir program, aada sunulmutur. PREDICATES sayi(integer) sayilari_yaz(integer) kullanici_komutu(unsigned) CLAUSES sayi(0). sayi(N):-sayi(N1), N=N1+1.

128

sayilari_yaz(N):- getbacktrack(BTOP), sayi(N), kullanici_komutu(BTOP). kullanici_komutu(BTOP):- keypressed, cutbacktrack(BTOP). kullanici_komutu(_). Derleyici, cmleleri determinism bakmndan kontrol eden yklemdeki cutbacktrack yklemini tanmaz. Yani check_term direktifini kullanrken nondeterministic cmle uyars alnabilir. Dinamik kesme kullanrken ok dikkatli olmak gerekir. nk programn tamamn tahrip etmek, program alamaz hale getirmek mmkndr. 8.15. Programlama Stilleri Visual Prologda program yazarken dikkat edilmesinde fayda olan baz temel zellikler vardr. Bu zellikler artk kural haline gelmitir. Etkili programlama yapabilmek iin u kurallara dikkat edilmelidir: Kural 1. Fazla yklem yerine daha fazla deiken kullann Bu kural programn okunabilirlii ile ters orantldr. Genelde Prologun dekleratif olan stili, dier konvansiyonel yaklamlara gre daha az verimlidir. rnein, bir listenin elemanlarn tersine eviren bir yklem yazmak iin aadaki program paras kullanlabilir: tersine_cevir(A, B):- tersine_cevir1([], A, B). tersine_cevir1(B, [], B). tersine_cevir1(A1, [U|A2], B):- tersine_cevir1([U|A1], A2, B). Kural 2. zm olmad zaman program almasnn etkili bir biimde bittiinden emin olun Yazdmz bir maksimum_deger yklemiyle bir listedeki tamsaylarn byk bir sayya kadar dzenli olarak arttn, daha sonra yine dzenli bir ekilde azaldn kontrol etmek istiyoruz. Bu yklemi kullanarak maksimum_deger([1, 2, 5, 7, 11, 8, 6, 4]) eklindeki bir sorgu baarl olur. Fakat maksimum_deger([1, 2, 3, 9, 6, 8, 5, 4, 3]) baarsz olur. Kural 3. Geriye z Srme mekanizmasn mmkn olduunca ok kullann. esitlik seklinde tanmlanan bir yklemin iki listenin elemanlarn karlatrmak iin kullanalm. Bunun iin: esitlik([], []). esitlik([U|X], [U|Y]):- esitlik(X, Y)

129

kullanmak gereksizdir. nk bunun yerine daha basit olan esitlik(X, X) kullanlabilir. Kural 4. Rekursiyon veya Tekrarlama Yerine Geriye z Srme Mekanizmasn Kullann Geriye z Srme mekanizmas bellek ihtiyacn azaltr. Bu yzden rekursiyon yerine repeat-fail kombinasyonunu kullanmak gerekir. Bu konu hakknda birka rnek verelim. Alt hedefleri tekrarl bir ekilde kullanmak iin genelde basla gibi bir yklem tanmlayp sonular hesaplamak gerekir. rnek: basla:readln(X), islem_yap(X, Y), write(Y), basla. Bu tr bir tanmlama gereksiz yere rekursiyon yapar. islem_yap(X,Y) nondeterministic ise sistem tarafndan gereksiz olan bu rekursiyon otomatik olarak ortadan kaldrlabilir. Bu durumda repeat...fail ikilisi kullanmak gerekir. Bunun iin yukardaki ilemleri yle yazmak mmkndr. basla:tekrar, readln(X), islem_yap(X, Y), write(Y), fail. fail komutu, islem_yap ykleminine geriye dn yapar, buradan da tekrar yklemine geer, bu yklem daima baarl olur. Burada nemli olan ey bu dngnn dna kmaktr. Genelde dng dna kmak iin belli artlar aranld iin, dng iine bu art yazmak mmkndr. Yani: basla:tekrar, readln(X), islem_yap(X, Y), write(Y), bitisi_kontrol_et(Y), !. 8.15. Cut Yklemini Yerletirmek check_determ direktifi, cut ykleminin nereye yerletirilmesi gerektii konusunda karar verirken ok faydaldr. Non-deterministic davran olan cmlecikleri deterministic hale getirip geriye dn engellemek iin cut kullanlmadr. Byle bir durumda genel bir kural olarak unu syleyebiliriz: cut komutunu, programn mantn bozmayacak ekilde, mmkn olduuca bir kuraln bana yakn

130

bir yere konulmaldr. Derleyici aadaki iki kural dikate alarak bir cmleciin deterministic veya non-deterministic olduuna ; 2. Cmlede cut yoksa ve cmlenin bandaki argmanlarla eleebilecek baka bir cmlecik varsa 3. Cmle gvdesinde non-deterministic baka bir ykleme ar varsa ve nondeterministic olan bu ardan sonra cut yoksa bulunarak karar verilir.

131

9. ZEL GELTRLM PROLOG RNEKLER

9.1. Kk bir Uzman Sistem rnei Bu rnekte, baz zellikleri hakknda kullancya soru sorarak 7 hayvandan biri bulunacaktr. Bu hayvanlar hakknda bilinen olgulardan hareketle geriye dn mekanizmas kullanlarak doru cevap bulunmaya allacaktr. DATABASE xpositif(symbol,symbol) xnegatif(symbol,symbol) PREDICATES nondeterm aranan_canli(symbol) nondeterm canli_turu(symbol) soru_sor(symbol,symbol,symbol) sakla(symbol,symbol,symbol) positif(symbol,symbol) negatif(symbol,symbol) olgulari_sil basla CLAUSES aranan_canli(cita):canli_turu(memelil), canli_turu(etobur), positif(sahiptir,sari_kahverengi_renklere), positif(sahiptir,siyah_benekler). aranan_canli(tiger):canli_turu(memeli), canli_turu(etobur), positif(sahiptir, sari_kahverengi_renkler), positif(sahiptir, siyah_seritli). aranan_canli(zurafa):canli_turu(tirnakli), positif(sahiptir,uzun_boyunlu),

132

positif(sahiptir,uzun_bacakli), positif(sahiptir, siyah_benekler). aranan_canli(zebra):canli_turu(tirnakli), positif(sahiptir,siyah_seritli). aranan_canli(devekusu):canli_turu(kus), negatif(eylem,ucar), positif(sahiptir,uzun_boyunlu), positif(sahiptir,uzun_bacakli), positif(sahiptir, siyah_beyaz_renk). aranan_canli(penguen):canli_turu(kus), negatif(eylem,ucar), positif(eylem,yuzer), positif(sahiptir,siyah_beyaz_renk). aranan_canli(albatros):canli_turu(kus),positif(eylem,iyi_ucar). canli_turu(memeli):positif(sahiptir,tuylu). canli_turu(memeli):positif(eylem,sut_verir). canli_turu(kus):positif(sahiptir,kus_tuyleri). canli_turu(kus):positif(eylem,ucar), positif(eylem,yumurtlar). canli_turu(etobur):positif(eylem,et_yer). canli_turu(etobur):positif(sahiptir,sivri_disleri), positif(sahiptir, pencelere), positif(sahiptir,patlak_gozler).

133

canli_turu(tirnakli):canli_turu(memeli), positif(sahiptir,toynaklar). canli_turu(tirnakli):canli_turu(memeli), positif(eylem,gevis_getirme). positif(X,Y):xpositif(X,Y),!. positif(X,Y):not(xnegatif(X,Y)), soru_sor(X,Y,evet). negatif(X,Y):xnegatif(X,Y),!. negatif(X,Y):not(xpositif(X,Y)), soru_sor(X,Y,hayir). soru_sor(X,Y,evet):-!, write(X," aranan canli:",Y,'\n'), readln(Cevap),nl, frontchar(Cevap,'e',_), sakla(X,Y,evet). soru_sor(X,Y,hayir):-!, write(X," aranan canli: ",Y,'\n'), readln(Cevap),nl, frontchar(Cevap,'h',_), sakla(X,Y,hayir). sakla(X,Y,evet):assertz(xpositif(X,Y)). sakla(X,Y,hayir):assertz(xnegatif(X,Y)). olgulari_sil:write("\n\nBitirmek icin space tusuna basiniz.\n"), retractall(_,dbasedom),readchar(_).

134

basla:aranan_canli(X),!, write("\n Aradiginiz canli bir ",X, "olabilir."), nl,nl,olgulari_sil. basla :write("\nAradiginiz canliyi bulmak mumkun degildir.\n\n"), olgulari_sil. GOAL basla. Veritabanndaki her hayvan, sahip olduu veya olmad baz zelliklerle tanmlanmtr. Kullancnn cevaplayaca sorular olumlu(A, B) veya olumsuz(A, B) eklindedir. Sorulan bir soruya evet veya hayr eklinde cevap aldktan sonra, verilen cevabn veritabanna eklenmesi gerekir. Bylece program karar verirken eski bilgileri kullanr. Burada olumlu ve olumsuz olmak zere sadece iki yklem kullanlmtr. database xpozitif(symbol, symbol) xnegatif(symbol, symbol) Bylece aradmz hayvann tyl deilse, xnegative(vardir, tuy) eklindeki olguyu kullandk. Pozitif ve negatif kurallar, kullancnn verdii cevabn nceden bilinip bilinmediini kontrol eder. pozitif(X,Y):xpozitif(X,Y),!. pozitif(X,Y):not(xnegatif(X,Y)), soru_sor(X,Y,evet). negatif(X,Y):xnegatif(X,Y),!. negatif(X,Y):not(xpozitif(X,Y)), soru_sor(X,Y,hayir). Pozitif ve negatif kurallarnn ikinci kural, kullancya yeni bir soru sormadan nce arada bir ztlk olup olmadn kontrol eder. Tanmladmz soru_sor yklemi kullancya soru sorar ve alnan cevaplar dzenler. Cevap e ile balarsa olumlu, h ile balarsa olumsuz olarak kabul edilir.

135

ask(X,Y,yes):-!, write(X," it ",Y,'\n'), readln(Reply),nl, frontchar(Reply,'y',_), remember(X,Y,yes). ask(X,Y,no):-!, write(X," it ",Y,'\n'), readln(Reply),nl, frontchar(Reply,'n',_), remember(X,Y,no). remember(X,Y,yes):-assertz(xpositive(X,Y)). remember(X,Y,no):-assertz(xnegative(X,Y)). clear_facts:-write("\n\nkmak retractall(_,dbasedom),readchar(_). 9.2. Basit bir yn problemi Trkiyedeki birka ehir arasndaki en uygun yolu bulmak iin bir program yapalm. Program bize iki ehir arasnda yol olup olmadn sorsun. Vereceimiz cevaba gre en uygun yolu bize gstersin. Burada geriye iz srme ve rekursiyon metotlarn kullanacaz. Elaz iin boluk tuuna basnz\n"),

anlurfa Mardin

Gaziantep DOMAINS sehir mesafe = symbol = integer

PREDICATES nondeterm yol(sehir,sehir,mesafe) nondeterm guzergah(sehir,sehir,mesafe) CLAUSES yol(mardin,sanliurfa,190). yol(gaziantep,mardin,320). yol(sanliurfa,gaziantep,146).

136

yol(sanliurfa,elazig,348). yol(gaziantep,elazig,540). guzergah(_1_Sehir,_2_Sehir,Mesafe):yol(_1_Sehir,_2_Sehi, Mesafe). guzergah(_1_Sehir,_2_Sehir,Mesafe):yol(_1_Sehir,X,Mesafe1), guzergah(X,_2_Sehir,Mesafe2), Mesafe=Mesafe1+Mesafe2, !. GOAL guzergah(sanliurfa,elazig, Toplam_Mesafe). Yol yklemi iin kullanlan her bir cmlede, bir ehirden dierine olan yolun km cinsinden deeri verilmitir. guzergah yklemi ise iki ehir arasnda yol olduunu gstermektedir. Gzergah takip eden bir srcnn mesafe parametresiyle gsterilen miktarda gidecei belirtilmitir. Burada gzergah yklemi rekursiv olarak tanmlanmtr. Gzergah, birinci cmlede olduu gibi sadece tek yol olabilir. Bu durumda toplam mesafe sadece iki ehir arasndaki yoldur. Bir ehirden dierine gittikten sonra ana hedefe gidiliyorsa, bu durumda toplam yol Mesafe1+Mesafe2 olur. 9.3. Hazine Avcs Labirent biimindeki dehliz ve maaralardan oluan bir yerde gizli bir hazine bulunsun. Ayn yerden tekrar gemeden, tehlikeye yakalanmadan giri noktasndan balayp emniyetli bir ekilde ktan gemek ve hazineyi almak iin hangi yolu takip etmeliyiz? nce hazinenin yerini gsteren haritaya bakalm.
Giri Bataklk denizkz

eme

haydut

gda

canavar hazine k

DOMAINS

137

oda odalarin_listesi PREDICATES

= symbol = oda*

nondeterm galeri(oda,oda) nondeterm komsu_oda(oda,oda) buralara_girmek_tehlikeli(odalarin_listesi) nondeterm git(oda,oda) nondeterm guzergah(oda,oda,odalarin_listesi) nondeterm eleman(oda,odalarin_listesi) CLAUSES galeri(giris,canavar). galeri(giris,cesme). galeri(cesme,bataklik). galeri(cesme,gida). galeri(cikis,hazine). galeri(cesme,denizkizi). galeri(haydut,hazine). galeri(cesme,haydut). galeri(gida,hazine). galeri(denizkizi,cikis). galeri(canavar,hazine). galeri(hazine,cikis). komsu_oda(X,Y):-galeri(X,Y). komsu_oda(X,Y):-galeri(Y,X). buralara_girmek_tehlikeli([canavar,haydut]). git(Baslama_noktasi,Bitis_noktasi):guzergah(Baslama_noktasi,Bitis_noktasi,[Baslama_noktasi]). git(_,_). guzergah(Oda,Oda,Gidilen_odalar):eleman(hazine,Gidilen_odalar), write(Gidilen_odalar),nl. guzergah(Oda,Cikis_yolu,Gidilen_odalar):komsu_oda(Oda,Sonraki_oda),

138

buralara_girmek_tehlikeli(Tehlikeli_odalar), not(eleman(Sonraki_Oda,Tehlikeli_odalar)), not(eleman(Sonraki_Oda,Gidilen_odalar)), guzergah(Sonraki_Oda,Cikis_yolu,[Sonraki_Oda|Gidilen_odalar]). eleman(X,[X|_]). eleman(X,[_|H]):-eleman (X,H). GOAL git(cikis, giris). Buradaki her dehliz bir olguyla temsil edilmitir. git ve guzergah yklemleri kurallar belirler. Sorgudan elde edeceimiz cevapta hazineyi alp emniyetli bir ekilde dar kmak iin gerekli gzergah belirtilecektir. Programdaki nemli bir zellik, rekursiv olarak tanml olan guzergah sayesinde gidilen odalarn kataloga alnmasdr. k odasna geldiiniz anda nc parametre o ana kadar ziyaret ettiiniz odalar listeler. Bu odalar arasnda hazine var ise, hedefe varld demektir. Eer listede hazine odas yoksa, Sonraki_oda seenei tehlikeli odalara gidilmeyecek ekilde geniletilir.

139

TARTIMA VE SONU Yapay Zeka kavram ortaya ktktan sonra, yurtdnda bu konuda ok sayda teorik alma, deiik disiplinlerde kullanlan birok uygulama program gerekletirilmitir. Bu programlar sayesinde, bir insan tarafndan yaplmas ok zaman alabilen ve hata oran olduka yksek olabilen durumlar ortadan kalkmtr. rnein Digital firmas yetkilileri, mterilerinin siparilerine gre yeni bir sistem dizayn yaparken, bu sistemde kullanlabilecek donanm seeneklerinin okluu, her bir parann birden fazla para ile uyumlu alabilmesi veya baz paralarn birbirleriyle hi uyumamas gibi durumlardan dolay, yaplan montajlarda byk oranda hatalarn ortaya ktn; ancak yazlan bir uzman sistem ve paralar hakkndaki gereklerden oluan bir bilgi veritaban ile bu durumun ortadan kalktn, ayrca ylda milyonlarca dolar tasarruf saladklarn belirtmilerdir. Bunun haricinde farkl alanlarda kullanlmak zere hazrlanan ve baarl bir ekilde alan ok sayda uzman sistem rnei vermek mmkndr. Tpta tehis ve tedavi planlamas amacyla bilgi tabanc sistemler, birok alanda (rnein Laboratuar, Onkoloji veya Kardiyoloji gibi) kullanm sahas bulmaktadr. Di tedavisi alannda bilgisayar kullanm daha ziyade sadece kayt amal kullanlmaktadr. Karlsruhedeki Di Hekimlii Akademisi ile Bremen niversitesi Yapay Zeka Laboratuar arasnda ibirlii yaplarak, bir yazlm gelitirilmitir. Bu alma, di doktorlar iin bilgi tabanl bir dkmantasyon ve karar verme sisteminin oluturulmasn salamaktadr. Sistemin kullanlmas halinde, di hekimlii ile ilgili tehis ve tedavi nerileri yaplabilmektedir. Trkiyede ise, bu alanda ok ciddi almalarn var olduunu sylemek ok zordur. Gebze Yksek Teknoloji Enstitsndeki Yapay Zeka Blmnde, askeri amal projeler zerinde almalar yrtlmektedir. Ayrca Bilkent ve Orta Dou Teknik niversitelerinde yrtlmekte olan TurkLang gibi byk projeler mevcuttur. Fakat bu almalarn ou Unix ortamnda yaplmakta olup, bireysel ve endstriyel kullanma ynelik deildir. Yapay Zeka ve bunun alt blmleri olarak kabul edilen Uzman Sistemler, Yapay Sinir Alar, Tabii Dil lenmesi gibi alanlarda program yapmak iin mantk dillerinin yan sra, Pascal, C++ gibi konvansiyonel programlama dilleri de kullanlmaktadr. Prolog (Programming in Logic) mantk dillerinden en popler olandr. nceleri daha

140

ok Unix, VAX gibi iletim sistemleriyle alan anaat bilgisayarlarda kullanlan Prolog, zamanla DOS, daha sonralar ise Windows ve dier iletim sistemlerine de aktarlmtr. Visual Prolog, ite bu aamalardan sonra karlan, oklu ortamlarda rahatlkla kullanlabilen bir mantk dilidir. Visual Prologun dier konvansiyonel dillerden ayrld baz zellikler unlardr: a) Visual Prolog prosedrel deil tamamen dekleratif bir yapya sahiptir. Yani zm aranan bir problemin nasl zleceini tanmlamak yerine, problemin kendisini tanmlamak yeterlidir. Kullanc tarafndan verilen gereklere dayanarak, Prologda var olan Inference Engine(Karar verme motoru) istenilen problem iin mmkn olan btn zmleri bulur. b) Visual Prologdaki Geriye z Srme mekanizmas, konvansiyonel dillerin hibirinde bulunmayan gl bir zelliktir. Bu zellik sayesinde konvansiyonel dillerdeki FOR..NEXT, DO..WHILE gibi dngler ortadan kalkar. Prolog, bu zellii sayesinde, zm aranan bir sorguya uygun btn zmleri kendiliinden bulur. Bu durum, dng komutlarnn neden olabilecei hatalar batan itibaren ortadan kaldrr. c) Visual Prologun dier bir zellii ise, nesneler arasndaki ilikilerin ok kolay bir ekilde tanmlanabilmesi, bu ilikilere dayal ilemler yapabilmesidir. rnein, kullanilir(Visual Prolog, uzman_sistemler) eklinde ifade edilebilen Visual Prolog dili uzman sistemlerde kullanlr cmlesini, konvansiyonel dillerle ifade etmek mmkn deildir. Visual Prolog ile uygulama Programlar yazarken, nesneler arasndaki ilikileri ifade etmek son derece kolay olmasna ramen, uygulamann sonular hakknda Trke bilgi vermek ve Trkede dzgn cmleler kurmak asndan baz zorluklar mevcuttur. Bunun temel nedeni, ngilizce ve Trke cmle yaplarnda elerin dizililerinde farkllklar bulunmasdr. Bu yzden, Trke ifade edilen bir cmlede, zne ve yklem arasnda akc bir iliki kurabilmek iin, eler arasndaki zelliklerin nceden veritabanna yklenmesi faydal olacaktr. Bu alma sayesinde, Prologun Trkeye uyarlanmasnda karlalan problemler detayl olarak ele alnm, problemlerin en doru ekilde nasl zmlenebilecei konusunda baz yazlmlar gelitirilmitir.

141

Visual Prolog kullanarak yapay zeka konusunda alma yapacaklar iin nemli birok ipular rneklerle verildii bu tez almas sayesinde, yapay zeka alannda Trke uygulamalarda nemli gelimeler salanabilecektir.

142

KAYNAKLAR

(1) STERLING; Leon; SHAPHIRO, Ehud; The Art of Prolog, Advanced Programming Techniques, The MIT Press, London, England, 1992. (2) CLOCKSIN, W.F, MELLISH, C.S, Programming in Prolog, Springer-Verlag Berlin Heidelberg, Germany, 1987. (3) OKEEFE, Richard A.; The Craft of Prolog, The MIT Press, London, England, 1990 (4) CASTILLO, E., ALVAREZ, E., Expert Systems: Uncertainity and Learning, Computational Mechanics Publications, Southampton, Boston, America, 1991 (5) GIARRATANO, JOSEPH. C, Expert Systems: Principles and Programming, PWS-KENT Publishing Company, Boston, America,1989. (6) IGNIZIO, JAMES. P., Introduction to Expert Systems, McGraw-Hill, Inc., America, 1991. (7) PDC, Visual Prolog Language Tutorial, Copenhagen, Denmark, 1996. (8) KU, M.; VAROL, A.; OUROL, Y.; VAROL, Y.: Verarbeitung von unsiherem Wissen mit Fuzzy-Prolog, Second Turkish-German Joint Computer Application Days, 15-16 October, Konya, 1998 (9) OUROL, Y.; VAROL, A.; KU, M.: Anforderungen und Lsungsanstze einer transferierbaren Entwicklungsumgebung fr die medizinische Wissenverarbeitung, Second Turkish-German Joint Computer Application Days, 1516 October, Konya, 1998. (10) VAROL, A.; VAROL, N.: ESTA le Bilgisayar Destekli Eitim, Beta Basm Yaym Datm A.., 299, 1996. (11) VAROL, A.; VAROL, N.: ESTA Bilgisayar Yazlm le Uzman Sistemlerin Hazrlanmas Teknikleri, Sleyman Demirel niversitesi, Makine Mhendislii Dergisi, Cilt 1, Say 9, 67-72, 1996.

143

(12) KU, M.; VAROL, A.; OUROL, Y.: Uzman Sistemin Diilik Alannda Kullanmna Ait Bir Uygulama, Endstri&Otomasyon, Aylk Elektrik, Elektronik, Makine, Bilgisayar ve Kontrol Sistemleri Dergisi, Say: 18, 1998 (13) KU, M.; VAROL, A.; OUROL, Y.: Uzman Sistemin Diilik Alannda Kullanmna Ait Bir Uygulama, Endstri&Otomasyon, Aylk Elektrik, Elektronik, Makine, Bilgisayar ve Kontrol Sistemleri Dergisi, Say: 18, 1998 (14) VAROL, A.; VAROL, N.: Uzman Sistemlerde ESTA Yazlmnn nemi, Biliim'96, 18-22 Eyll 1996 stanbul, Bildiriler Kitab, 289-294, 1996. (15) VAROL, A.; VAROL, N.: Uzman Sistem Hazrlanrken Hangi Kriterler Gz nnde Bulundurulmal, GAP 2. Mhendislik Kongresi, 21-23 Mays 1998, anlurfa, Bildiri Kitab, S: 559-566, 1998.

144

EKLLER ve TABLOLAR

ekil 6.1. Aile Fertlerinin ecere Olarak Gsterilmesi................................................83

ekil 6.2. ekil 6.1deki aa yapsnda Aaya-Doru-Arama metodunun uygulanmas.................................................................................................................85

ekil 6.3. Binary tarama yaps....................................................................................89

Tablo 3.1: Visual Prologda Tipler ve Alabilecekleri deerler....................................24

Tablo 7.2. Listelerin ba ve kuyruk halinde gsterilmeleri..........................................95

['a', 'b', 'c']....................................................................................................................95

'a'.................................................................................................................................95

['b', 'c'].........................................................................................................................95

[ 'a' ].............................................................................................................................95

'a'.................................................................................................................................95

[] /* Bo liste*/............................................................................................................95

[ ].................................................................................................................................95

Tanmsz......................................................................................................................95

Tanmsz......................................................................................................................95

145

[[1, 2, 3], [2, 3, 4], []].................................................................................................95

[1, 2, 3].......................................................................................................................95

[[2, 3, 4], []]................................................................................................................95

Tablo 7.3: Liste eletirme rnekleri11.......................................................................95

[X, Y, Z].....................................................................................................................95

[kedi, eti, yedi]............................................................................................................95

X=kedi, Y=eti, Z=yedi................................................................................................95

[7]................................................................................................................................95

[X | Y].........................................................................................................................95

X=7, Y=[]...................................................................................................................95

[1, 2, 3, 4]...................................................................................................................95

[X, Y | Z].....................................................................................................................95

X=1, Y=2, Z=[3,4]......................................................................................................95

[1, 2]............................................................................................................................95

[3 | X]..........................................................................................................................95

146

Yanl (Neden?)...........................................................................................................95

Tablo 8.4. Criticalerror ykleminin argmanlarnn ald deerler...........................127

147

You might also like