Prolog Recursion Lesson

  • View
    90

  • Download
    0

Embed Size (px)

Text of Prolog Recursion Lesson

RecursionProlog Dersleri - 3.HaftaTekrarlama ve rekrsiyonProsedr 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.

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.

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.

rnekPREDICATESnondeterm ulke_adi(symbol)ulke_adlarini_yazCLAUSESulke_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).

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.

TrkiyeKazakistanAzerbaycanAmerika4 SolutionsEer ulke_adlarini_yaz yklemi fail komutundan sonra yazlmam olsayd, cevap yine ayn olurdu fakat yes yerine no satr grntlenirdi.

nceki ve Sonraki Eylemler Bir hedef iin gerekli olan btn zmleri salayan bir program, zm yapmadan ve yaptktan sonra baka eyler de yapabilir. rnein1. Yaanacak gzel yerler2. 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. ikinci 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:PREDICATESnondeterm ulke_adi(symbol)ulke_adlarini_yazCLAUSESulke_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 http://alikoker.name.tr76komutlarnn baka bir i yapmamas ok nemlidir. Son fail komutundan sonra programn ikinci cmlecie geii salanmaldr.

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:PREDICATESnondeterm tekrarnondeterm karakteri_ekrana_yazCLAUSEStekrar.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 yaz4. 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.

Rekursif Prosedrler (A)Kendisini arabilen prosedre rekursif prosedr diyoruz.Tekrarlama ilemin yapmann dier bir yolu da rekursiyondur.Rekursif prosedrler yaptklar ilerin saysn, toplamn veya ilmelerin ara sonularn saklayabilir ve bunlar bir dngden dierine rahatlkla aktarabilirler.rnek: N saysnn faktryelini (N!) hesaplamak Standart SistemBalang deeri 1 olan bir return deikeni olutur.1 den N e kadar bir dng olutur.return deerini dngnn indisi ile arparak return deikenine ata.Sonu return deikenidir.

Rekursif SistemKural 1: N says 0 ise sonu 1 dir.Kural 2: N says 0 den byk ise sonu N-1 faktryeldir ((N-1)!).

rnek Kod factorial(0,1).

factorial(N,F) :- N>0, N1 is N-1, factorial(N1,F1), F is N * F1.Ama ??Faktriyel kuraln N=6 olacak ekilde arlrsa, faktriyel kendini N=5 iin arlacaktr. Bu durumda N deki 6 deeri nereye gitti ?

Bilgisayar kendi iinde her arldnda bu prosedr tekrardan kopyalar yani ilemler bitene kadar N deernin faktryelini hesaplayacak bir sr prosedr alm olur.Rekursif Prosedrlerin AvantajlarMantksal olarak iterasyondan ok daha basittir.Listeleri ilemede ok yaygn olarak kullanlr.Rekursiyon ilemi zellikle probleme ierisinde dallanmalarn mevcut olduu, yani bir problemin zmnn bir alt probleme bal olduu durumlarda ok faydaldr.Sondan Rekursion OptimizasyonuRekursiyon 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 ilemini bitirdikten sonra aran kald yerden devam edebilir. Ama dallanma ok fazla olursa hafzaya kaydettikleri de fazla olacandan bu bir hafza imesine bile neden olabilir.Yani biz 6! i hesaplamak isterken otamatik olarak 5! , 4! , 3! , 2! , 1! , 0! i de hesaplam oluyoruz ve bu hesaplamalar iin ekstradan hafzaya bunlar atm oluyoruz.

Peki bunun iin ne yapmal?Bir prosedrn, baka bir prosedr kendisinin en son adm olarak ardn dnelim. arlan prosedr grevini yaptktan sonra, ary yapan prosedrn yapmas gereken baka bir ey kalmaz. ary yapan prosedrn kendisinin 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.

Sondan Rekursiyonun KullanmPrologda bir prosedrn baka bir prosedr kendisinin en son adm olarak armas bu prosedr sondan rekursiyon yapacaktr. Bu da bu prosedrn geriye dn yapmas olasln kaldrr. (Yani heryede kullanamayz.)######yanisayac(Sayi):-write(Sayi), nl,yeni_sayi=Sayi+1,sayac(Yeni_sayi).Sondan Rekursiyonu EngellemeEngellemek iin :Baka prosedr son admda armamak.Baka bir alternatif brakmak. (Bu ne midir? *)

*Bu u oluyor. Prosedr yazdktan sonra baka bir durum belirtmek yani.

factorial(N,F) :- N>0, N1 is N-1, factorial(N1,F1), F is N * F1.factorial(0,1).

Rekursiyonda Cut KullanmRekursif Prosedrleri altrrken baz noktalarda durdurmamz gerekir. bunun iin iinde bir koul yazarak bu prosedr durdurabiliriz.sayac(Sayi):- Sayi>=0,!, /*Burada say 0 dan kk olma durumunda bo bir sonu dndrr*/Sayi1,M is N-1,move(M,X,Z,Y),move(1,X,Y,_),move(M,Z,Y,X).

Recursive Data Structuresrecursive_exmp.pl%A(B(D,E),C(F,G))

ABCDEFG%Depth First Searchingtree_exmp.pl%DOMAINSagac_yapisi=agac(string, agac_yapisi, agac_yapisi); bos_dal%PREDICATESagaci_tara(agac_yapisi)%CLAUSESagaci_tara(bos_dal).agaci_tara(agac(Isim, Sol, Sag)):-write(Isim, '\n'),agaci_tara(Sol), agaci_tara(Sag).%GOALagaci_tara(agac("Emine", agac("Ali", agac("Hasan", bos_dal, bos_dal),agac("Fatma", bos_dal, bos_dal)), agac("Ayse", agac("Fuat", bos_dal, bos_dal),agac("Leyla", bos_dal, bos_dal)))).

swipl -s tree.exmp.pl ?-agaci_tara(agac("Emine", agac("Ali", agac("Hasan", bos_dal, bos_dal),agac("Fatma", bos_dal, bos_dal)), agac("Ayse", agac("Fuat", bos_dal, bos_dal),agac("Leyla", bos_dal, bos_dal)))).EmineAliHasanFatmaAyseFuatLeylayes?-aa oluturmak#sAa biiminde bir yap oluturmann bir yolu operatrlerden ve argmanlardan oluan i ie gemeli bir yap yazmaktr.agac_olustur(Sayi, agac(Sayi, bos_dal, bos_dal))

# Eer Sayi bir say ise, agac(Sayi,

Recommended

View more >