Kebanyakan bahasa pemrograman konvensional memiliki fasilitas perulangan yang memungkinkan set instruksi yang akan dieksekusi berulang-ulang tetap baik beberapa kali atau sampai kondisi tertentu terpenuhi. Prolog tidak memiliki fasilitas perulangan, efek yang sama dapat diperoleh yang memungkinkan urutan tujuan untuk dievaluasi berulang kali. Hal ini dapat dilakukan dalam berbagai cara, menggunakan pengecekan mundur (backtracking), rekursi, built-in predikat, atau kombinasi dari semuanya.
Looping Angka Tetap Beberapa kali
Banyak bahasa pemrograman menyediakan ‘for loops’ yang memungkinkan satu set instruksi akan dieksekusi tetap beberapa kali. Tidak ada fasilitas tersebut tersedia dalam Prolog (langsung), 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.
loop(0).
loop(N):-N>0,write(‘The value is: ‘),write(N),nl,
M is N-1,loop(M).
Predikat loop didefinisikan dalam istilah itu sendiri. Kalimat kedua dapat dianggap sebagai: ‘for 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 (dan karenanya berhenti) ‘. Klausa pertama dapat dianggap sebagai suatu kondisi untuk menghentikan rekursi.
? – Loop (6).
Nilai adalah: 6
Nilai adalah: 5
Nilai adalah: 4
Nilai adalah: 3
Nilai adalah: 2
Nilai adalah: 1
yes
Looping sampai sebuah kondisi terpenuhi
Prolog tidak mempunyai instruksi khusus untuk mengeksekusi secara berulang sampai menemukan kondisi yang ditentukan.
Rekursi
Contoh program berikut menunjukkan penggunaan rekursi untuk membaca term yang dimasukkan user melalui keyboard dan menampilkannya ke layar, hingga kata ‘end’ dimasukkan.
Source file
go:-loop(start). /* start is a dummy value used to get
the looping process started.*/
loop(end).
loop(X):-X\=end,write(‘Type end to end’),read(Word),
write(‘Input was ‘),write(Word),nl,loop(Word).
Atau dengan menggunakan operator disjungsi
loop:-write(‘Type end to end’),read(Word),
write(‘Input was ‘),write(Word),nl,
(Word=end;loop).
Tampilan prolog
?- go.
Type end to end: university.
Input was university
Type end to end: of.
Input was of
Type end to end: portsmouth.
Input was portsmouth
Type end to end: end.
Input was end
yes
Menggunakan predikat ‘repeat’
Selain dengan rekursi, metode lain yang bisa digunakan adalah dengan predikat ‘repeat’. Namun, tidak seperti namanya, ‘repeat’ (mengulang) tidak mengulang sesuatu. Dia hanya mengulang satu proses saja sampai suatu kondisi yang ditentukan terpenuhi.
Contoh program:
get_married(Ans):-
write(‘Pertanyaan : Mau nikah sama saya?’),nl,
repeat,write(‘Jawablah dengan mau atau ngga_nolak: ‘),read(Ans),
valid(Ans),nl,write(‘Hore !! dia ‘),write(Ans),write(‘ nikah sama saya’),nl.
valid(mau). valid(ngga_nolak).
Ouputnya adalah
1 ?- get_married(X).
Pertanyaan : Mau nikah sama saya?
Jawablah dengan mau atau ngga_nolak: ngga.
Jawablah dengan mau atau ngga_nolak: pikir-pikir.
Jawablah dengan mau atau ngga_nolak: mau_deh.
Jawablah dengan mau atau ngga_nolak: mau.
Hore !! dia mau nikah sama saya
X = mau
Klausa “Jawablah dengan mau atau ngga_nolak” akan selalu keluar hingga user menjawab ‘mau’ atau ‘ngga_nolak’.
Pengecekan mundur dengan fungsi “failure”.
Sesuai dengan namanya, predikat ‘fail’ selalu gagal, baik dalam evaluasi standar dari kiri ke kanan maupun dalam pengecekan mundur.
Mencari database prolog
Predikat ‘fail’ berfungsi untuk melakukan perulangan (looping) sampai menemukan semua klausa dengan sifat-sifat tertentu yang berada dalam database. Contoh:
Database prolog:
dog(fido).
dog(fred).
dog(jonathan).
alldogs:-dog(X),write(X),write(‘ is a dog’),nl,fail./*syntax*/
Alldogs.
Outputnya adalah:
?- alldogs.
fido is a dog
fred is a dog
jonathan is a dog
yes
Menemukan beragam solusi
Pengecekan mundur menggunakan ‘failure’ juga dapat digunakan untuk mencari semua cara dalam mencapai suatu tujuan. Misalkan sebuah predikat ‘carirute(kota1,kota2,rute), maka pengecekan mundur menggunakan ‘failure’ dapat digunakan untuk menentukan semua rute yang memungkinkan dari dua kota tersebut dan ditulis dalam baris yang berbeda.