Sabtu, 10 November 2012

LOOPING IN PROLOG


Kebanyakan bahasa pemrograman konvensional memiliki fasilitas perulangan yang memungkinkan instruksi yang akan dieksekusi berulang-ulang tetap baik beberapa kali atau sampai kondisi tertentu terpenuhi. Prolog sebenarnya tidak memiliki fasilitas perulangan. Namun, efek yang sama dapat diperoleh yang memungkinkan seorang urutan tujuan untuk dievaluasi berulang kali. Hal ini dapat dilakukan dalam berbagai cara, menggunakan backtracking, rekursi, built-in predikat, atau kombinasi dari semuanya. Mari kita bahas semuanya satu persatu setelah ini.

Looping a Fixed Number of Times

Tidak ada fasilitas looping tersedia dalam Prolog. Tetapi efek yang sama dapat diperoleh dengan menggunakan rekursi, seperti ditunjukkan dalam contoh program di bawah ini.

Contoh 1
Keluaran program berikut bilangan bulat dari nilai tertentu ke 1.













Predikat loop didefinisikan dalam istilah itu sendiri. Kalimat kedua dapat dianggap sebagai: 'untuk loop dari N, pertama menulis nilai N, kemudian kurangi satu untuk memberikan M, kemudian loop dari M '. Proses ini jelas harus dihentikan dan ini dicapai oleh klausa pertama: 'ketika argumen adalah nol, tidak melakukan apa-apa'. Saat tidak ada yang dikerjakan, barulah program itu berhenti. Klausa pertama dapat dianggap sebagai suatu kondisi untuk menghentikan rekursi.





















Perhatikan penggunaan dua hasil M. M adalah N-1. Dan ketika mencapai nilai 0, maka program sudah tidak bekerja lagi. Inilah akhir dari loop. Sekilas seperti perulangan for yang ada di bahasa pemrograman java. 

Contoh 2
Program berikutnya keluaran bilangan bulat dari batas awal dan batas akhir.















Di sini output_values memiliki dua argumen, yang dapat dibaca sebagai 'output bilangan bulat dari First to Last inklusif '. Loop berakhir ketika kedua argumen sama. Lebih mudahnya, loop berakhir ketika loop telah mencapai batas akhir yang telah dimasukkan.



Looping Until a Condition Is Satisfied

Banyak bahasa memiliki sebuah instruksi dieksekusi berulang kali sampai kondisi tertentu terpenuhi. Sekali
lagi, tidak ada fasilitas seperti tersedia secara langsung di Prolog, tetapi efek yang sama dapat diperoleh
dengan beberapa cara.

Rekursi
Contoh di bawah ini menunjukkan penggunaan istilah rekursi untuk membaca dimasukkan oleh pengguna 
dari keyboard dan output mereka ke layar, sampai akhir dijumpai.


























Menggunakan Predicate 'repeat'
Meskipun sering dapat digunakan untuk efek yang besar, rekursi tidak selalu yang paling mudah. Cara untuk 
menyediakan jenis perulangan yang diperlukan dalam program Prolog. Metode lain yang sering digunakan 
adalah berdasarkan pada built-in predikat repeat. Efek ini adalah untuk mengubah urutan mengevaluasi  
tujuan dari "kanan ke kiri '(yaitu backtracking) kembali ke' kiri-ke-kanan '. Ini dapat digunakan untuk 
menciptakan efek perulangan, seperti ditunjukkan pada contoh di bawah ini.













Pertama lima hasil dalam tubuh get_answer akan selalu berhasil. Mengevaluasi tujuan kelima: read (Jawaban)
akan meminta pengguna untuk memasukkan istilah. Jika istilah input apa tapi ya atau tidak, mengatakan tidak 
yakin, tujuan berikut berlaku (Jawaban) akan gagal. Prolog kemudian akan mundur ke baca (Jawaban) dan 
menulis ( 'jawaban ya atau tidak "), baik yang adalah unresatisfiable, yaitu akan selalu gagal pada 
kemunduran. Backtracking akan mencapai predikat ulangi dan berhasil, menyebabkan evaluasi untuk 
melangkah maju (kiri-ke-kanan) lagi, dengan menulis ( 'jawaban ya atau tidak ") dan baca (Jawaban) 
keduanya berhasil, diikuti oleh evaluasi lebih lanjut yang berlaku (Jawaban). Tergantung pada nilai Jawaban, 
yaitu input pengguna, yang berlaku (Jawaban) tujuan akan baik gagal, dalam hal Prolog akan mundur sejauh 
yang berulang, seperti sebelumnya, atau akan berhasil dalam hal mana tiga gol terakhir menulis ( 'Jawaban 
ini'), menulis (Jawaban) dan nl semua akan berhasil. Dampak keseluruhan adalah bahwa dua tujuan menulis ( 
'jawaban ya atau tidak ") dan baca (Jawaban) disebut berulang kali sampai kondisi mengakhiri valid adalah 
puas, efektif menciptakan lingkaran antara repepat dan valid.
















Backtracking with Failure

Seperti namanya, predikat gagal selalu gagal, apakah pada 'standar' evaluasi kiri-ke-kanan atau pada 
kemunduran. Keuntungan dapat diambil dari ini, dikombinasikan dengan otomatis Prolog backtracking, 
untuk pencarian melalui database untuk menemukan semua klausa dengan properti tertentu.
Pencarian Database, Misalkan database berisi klausa seperti :











Memanggil alldogs akan menyebabkan anjing (X) untuk dicocokkan dengan database. Awalnya X akan 
terikat untuk fido dan "fido is dog" akan jadi keluaran. Itu tujuan akhir klausa pertama dari predikat alldogs 
kemudian akan menyebabkan evaluasi untuk gagal. Prolog akan mundur atas nl dan dua tujuan menulis 
hingga mencapai anjing (X). Tujuan ini akan berhasil untuk kedua kalinya menyebabkan X untuk terikat 
untuk fred.
Proses ini akan berlanjut sampai fido, fred dan jonathan semua telah keluar, dan ketika terjadi evaluasi,  akan 
kembali gagal. Kali ini panggilan untuk anjing (X) juga akan gagal karena Tidak ada anjing lebih lanjut dalam 
database. Hal ini akan menyebabkan klausa pertama untuk alldogs gagal dan Prolog untuk memeriksa 
klausul kedua alldogs. Ini berhasil dan evaluasi akan berhenti. Efeknya adalah untuk loop melalui database 
menemukan semua kemungkinan nilai dari X yang memenuhi tujuan anjing (X).














































Tidak ada komentar:

Posting Komentar