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).