1 / 25

Pengendalian Alur

Pengendalian Alur. Fail Cut Rekursi. Fail.

aelwen
Download Presentation

Pengendalian Alur

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Pengendalian Alur

  2. Fail • Cut • Rekursi

  3. Fail • Turbo prolog 2.0 akanmelakukanrunutbalikapabilamenemuikondisigagal (gagaldalammencarijawabandarisuatusubgoal). Hal inibisadilakukandenganmenggunakanpredikatstandarfail.Predikatfail mempunyaisifattidakpernahbenarApabiladalamsuatuklausaterdapat fail, makapredikat (subgoal) sesudahpredikat fail tidakakanpernahdieksekusioleh Turbo Prolog 2.0.

  4. cut • Predikat cut ( ! ) digunakanuntukmenghalangiterjadinyarunutbalik. Predikat cut selalubenardanbilapredikat cut telahdilewatimakatidakakanmungkinuntukmelakukanrunutbalikkesubgoalsebelumpredikat cut dalamklausayang sedangdieksekusi.

  5. Misalkan: Ada 4 buah klausa yang terdiri dari 2 jenis yaitu x dan y. x:- a,b,!,c,d. x:- e. y:- r,x,s. y:- t. • Bilakondisigagalditemuipadasubgoal a atau b, maka Turbo Prolog 2.0 akandapatmelakukanrunutbalikpadasubgoal a atau b. Bilatidakditemuikemungkinanjawaban yang lain, maka Turbo Prolog 2.0 akanmelanjutkankeklausa x berikutnya yang terdiridarisubgoal e. • Bilasubgoal a dan b benar, Turbo Prolog 2.0 akanmengeksekusipredikat cut yang selalubenar. Kemudian Turbo Prolog 2.0 melanjutkankesubgoal c. Bila turbo Prolog 2.0 menemuikondisigagal, maka Turbo Prolog 2.0 hanyadapatmelakukanrunutbalikpadasubgoal c dantidakdapatmelakukanrunutbalikkesubgoal a, b atauke x yang lain karenadihalangiolehpredikat cut yang berfungsisebagaipagar.

  6. Contoh program predikat fail DOMAINS kota, propinsi = string PREDICATES ibu_kota(kota,propinsi) tampil CLAUSES ibu_kota("Surabaya","Jawa Timur"). ibu_kota("Semarang","Jawa Tengah). ibu_kota("Bandung","Jawa Barat"). ibut_kota("Palembang","Sumatera Selatan"). tampil :- ibu_kota(Kota,Propinsi), write(Kota," adalah ibu kota ",Propinsi,"\n"), fail.

  7. Contoh program predikat cut DOMAINS kota, propinsi = string PREDICATES ibu_kota(kota,propinsi) tampil cek(kota) CLAUSES ibu_kota("Surabaya","Jawa Timur"). ibu_kota("Semarang","Jawa Tengah). ibu_kota("Bandung","Jawa Barat"). ibut_kota("Palembang","Sumatera Selatan"). tampil :- ibu_kota(Kota,Propinsi), write(Kota," adalah ibu kota ",Propinsi,"\n"), fail. tampil. cek("Semarang") :-!, fail. cek(_).

  8. Rekursi • Dalam bahasa komputer prosedural (Basic, Pascal atau C), rekursi adalah suatu prosedur yang mengandung prosedur itu sendiri. Dalam Turbo Prolog 2.0 didefinisikan sebagai suatu klausa yang salah satu subgoalnya adalah klausa itu sendiri.

  9. Contoh program faktorial DOMAINS angka = integer hasil = real PREDICATES faktorial(angka,hasil) CLAUSES faktorial(1,1) :-!. faktorial(X,FaktY) :- Y = X - 1, faktorial(Y,FaktY), FaktX = X * FaktY.

  10. Rekursi ekor • Metode rekursi memiliki suatu kelemahan, yaitu menghabiskan banyak lokasi memori untuk menyimpan stackframe, apalagi bila rekursi harus dilakukan banyak sekali. Memori komputer hanya dapat menampung paling banyak 4000 stackframe. Itu berarti hanya dapat menampung paling banyak 4000 kali pengulangan. • Untuk mengatasi masalah ini, digunakan metode rekursi ekor (tailrecursion). Pada rekursi ekor, tidak diperlukan lagi penyimpanan informasi di stackframe karena pada waktu memanggil dirinya sendiri, informasi tersebut telah diikutsertakan juga dalam bentuk variabel. • Syaratpenggunaanmetoderekursiekor: • Subgoal yang memanggildirinyasendiridiletakkanpadabagianakhirklausatersebut. • Tidakadatitikrunutbalik di dalamklausatersebut.

  11. program untukmenghasilkanderetdenganpertambahan 1 DOMAINS angka = integer PREDICATES deret(angka) CLAUSES deret(N) :- write(N," "), NN = N + 1, deret(NN).

  12. Penyebab rekursi ekor tidak terjadi • Bila subgoal yang memanggil dirinya sendiri tidak terletak di bagian akhir. Contoh : deret(N) :- write(N," "), NN = N + 1, deret(NN), nl.

  13. Bila masih ada klausa yang sama lainnya belum dicoba pada saat rekursi terjadi (terdapat titik runut balik). Contoh : deret2(N) :- write(N," "), NN = N + 1, deret2(NN). deret2(N) :- N < 0, Write(“ N adalah bilangan negatif”).

  14. Bila di dalam klausa tersebut terdapat subgoal yang mempunyai beberapa alternatif jawaban (yang memungkinkan terjadinya runut balik). deret3(N) :- write(N," "), NN = N + 1, Cek(NN), Deret3(NN). cek(X) :- X >= 0 cek(X):- X < 0

  15. Mengatasi masalah rekursi ekor • Masalah yang terjadipadarekursiekor yang menyebabkantidakterjadinyarekursiekordapatdiatasidenganmenggunakanpredikat cut (!). Predikat cut menyebabkan Turbo Prolog 2.0 tidakdapatmelakukanrunutbalikkesubgoalsebelumnya. • Dengandemikian Turbo Prolog 2.0 sudahtidakmelihatadanyakemungkinan lain yang dapatdicobasehinggarekursi yang terjadibenar-benarmerupakanrekursiekor yang tidakmenghabiskanmemori.

  16. program deret3 dapatdiperbaikidenganmenambahkanpredikat cut deret3(N) :- write(N," "), NN = N + 1, Cek(NN),!, Deret3(NN). cek(X) :- X >= 0 cek(X):- X < 0

  17. program deret2 dapatdiperbaikidenganmenambahkanpredikat cut deret2(N) :- N >= 0,!, write(N," "), NN = N + 1, deret2(NN). deret2(N) :- Write(“ N adalah bilangan negatif”).

  18. Program deretmenggunakanrekursiekor DOMAINS angka = integer PREDICATES deret(angka,angka,angka) GOAL makewindow(1,13,9,"REKURSI",5,10,15,60), write(" Program iniakanmenghasilkanderethitung \n"), write("\n Angkaawal : "),readint(Awal), write("\n Angkaakhir : "),readint(Akhir), write("\n Selang : "),readint(Selang), write("\n\n"), deret(Awal,AKhir,Selang).

  19. CLAUSES deret(AKhir,AKhir,_). deret(Awal,Akhir,Selang) :- write(Awal," "), Bil = Awal + Selang, deret(Bil,AKhir,Selang).

  20. Repeat • Predikat repeat digunakan untuk memaksa program agar mencari kemungkinan jawaban yang lain melalui runut balik. Predikat repeat bukanlah predikat jadi sehingga bila kita akan menggunkannya, kita harus mendefinisikanny di dalam program dan kita bisa menggunakan kata sembarang, misalnya ulang, repeat. repeat :- repeat. • Dengan struktur seperti diatas, program akan selalu mencatat adanya titik runut balik pada klausa tersebut.

  21. Predikat repeat selalu benar. Bila salah satu subgoal dalam suatu klausa yang mengandung predikat repeat mendapatkan kondisi gagal, maka program akan selalu melakukan runut balik ke predikat repeat, setelah runut balik ke subgoal sesudahnya telah selesai dilakukan. Dengan menggunakan predikat repeat, program kita bisa berulang tanpa batas dan biasanya digunakan dalam program yang alurnya selalu kembali ke menu utama.

  22. Program LogonTidakmenggunakanpredikat repeat DOMAINS nama,password = symbol PREDICATES logon masukkan_nama(nama,password) pemakai(nama,password) GOAL logon. CLAUSE pemakai(anto,bodor). pemakai(nano,superman). pemakai(toto,aneh).

  23. logon :- makewindow(1,13,2,"LOGON",5,10,10,60), clearwindow, masukkan_nama(_,_), write("Anda diperkenankan menggunakan komputer ini") logon :- write("Maaf, password anda tidak tidak termasuk dalam \n"), write("daftar pemakai komputer ini"). masukkan_nama(Nama,Password) :- write("Masukkan Nama Anda = "),readln(Nama),nl, write("Masukkan Password Anda = "),readln(Password), pemakai(Nama,Password).

  24. Program Logon menggunakanpredikat repeat DOMAINS nama,password = symbol PREDICATES logon masukkan_nama(nama,password) pemakai(nama,password) repeat GOAL logon. CLAUSE pemakai(anto,bodor). pemakai(nano,superman). pemakai(toto,aneh).

  25. logon :- makewindow(1,13,2,"LOGON",5,10,10,60), clearwindow, masukkan_nama(_,_), write("Anda diperkenankan menggunakan komputer ini"). logon :- write("Maaf, password anda tidak tidak termasuk dalam \n"), write("daftar pemakai komputer ini \n"), write("Silahkan Mencoba lagi \n\n"), masukkan_nama(_,_), write("Anda diperkenankan menggunakan komputer ini"). masukkan_nama(Nama,Password) :- write("Masukkan Nama Anda = "),readln(Nama),nl, write("Masukkan Password Anda = "),readln(Password), pemakai(Nama,Password). repeat. repeat :- repeat.

More Related