Looping? Apa itu looping?
Looping adalah pengeksekusian berulang dari instruksi himpunan atau deret hingga beberapa kali sampai kondisi yang diberikan dieksekusi. Dalam prolog tidak terdapat fasilitas looping, akan tetapi dapat diakali dengan pemberian evaluasi pada deret secara berulang. Contohnya ;pemberian rekursi(memanggil method di atasnya), membangun predikat, serta variasi dan kombinasi dari contoh-contoh-contoh tersebut.
A. 6.1 Looping dengan angka yang tetap
Contoh 1:
loop(0).
loop(N):-N>0,write('The value is: '),write(N),nl,
M is N-1,loop(M).
Penjelasan :
Loop akan didefinisikan pada loop itu sendiri. Klausa yang kedua “'to loop from N” akan berfungsi mencetak nilai N kemudian akan dikurangi 1 untuk menghasilkan nilai M. Dan pada saat nilai M=0, maka tidak akan dijalankan proses dan proses rekursi berhenti. Dan hasilnya seperti ini
?- loop(6).
The value is: 6
The value is: 5
The value is: 4
The value is: 3
The value is: 2
The value is: 1
yes
Contoh 2:
Contoh 2
.
/* output integers from First to Last inclusive */
output_values(Last,Last):- write(Last),nl,
write('end of example'),nl.
output_values(First,Last):-First=\=Last,write(First),
nl,N is First+1,output_values(N,Last).
Di sini output_values mempunyai dua argument, yang dapat dibaca ‘'output the
integers from First to Last inclusive'’. Dan looping akan berhenti ketika dua argument tersebut sama.
Outputnya akan
?- output_values(5,12).
56789
10
11
12
end of example
yes
Contoh 3
Mendefinisikan sebuah predikat untuk menemukan jumlah bilangan integer dari 1. Prosesnya adalah jika dimulai dari angka 1 maka akan ditambah 2, ditambah 3, sampai 100, dst.
Jumlah dari ke-100 bilangan integer adalah jumlah dari ke-99 bilangan integer ditambah 100.
…………………………………………………………………………….
Jumlah dari ke-3 bilangan integr pertama adlah jumlah dari bilangan kedua bilangan integer pertama ditambah 3.
Jumlah dari ke-2 bilangan integer pertama adalah jumlah dari bilangan integer pertama ditambah 1.
Jumlah dari ke-1 bilangan integer pertama adalah 1.
Contoh ::
/* sum the integers from 1 to N (the first argument)
inclusive */
sumto(1,1).
sumto(N,S):-N>1,N1 is N-1,sumto(N1,S1),S is S1+N.
?- sumto(100,N).
N = 5050
?- sumto(1,1).
yes
Note : Menngunakan variable tambahan N1 akan bisa menentukan nilai N-1. Jika penulisan sumto(N1,S1) diganti dengan sumto(N-1,S1) tidak akan bisa berjalan karena N-1 adalah sebuah term bukan nilai numeric.
Contoh 4
Mendefinisikan sebuah predikat untuk menghasilkan kuadrat dari ke-N bilangan integer pertama, baris demi baris. Pertama harus memanggil secara rekursiv seperti berikut
Untuk menghasilkan kuadrat dari ke-N bilangan integer, maka harus mnegeluarka output dari kuadrat ke-N-1 bilangan integer dan output N2
……………………………………………………………………………………….
- Untuk menghasilkan kuadrat dari ke-3 bilangan integer, maka harus mnegeluarkan output dari kuadrat ke-2 bilangan integer dan output 32
- Untuk menghasilkan kuadrat dari ke-2 bilangan integer, maka harus mnegeluarkan output dari kuadrat ke-1 bilangan integer dan output 22
- Untuk menghasilkan kuadrat dari ke-1 bilangan integer, maka outputnya adalah 1.
Sama seperti contoh sebelumnya , proses akan berhenti pada bilangan 1
/* output the first N squares, one per line */
writesquares(1):-write(1),nl.
writesquares(N):-N>1,N1 is N-1,writesquares(N1),
Nsq is N*N,write(Nsq),nl.
?- writesquares(6).
149
16
25
36
yes
Contoh 5
Progaram berikut menampilkan 6 term pertama dari file yang spesifik dan menulis ke output yang sesuai
read_six(Infile):-seeing(S),see(Infile),
process_terms(6),seen,see(S).
process_terms(0).
process_terms(N):-N>0,read(X),write(X),nl,N1 is N-1,
process_terms(N1).
6,2 Looping Kondisi Apakah PuasBanyak bahasa memiliki sebuah 'sampai loop' yang memungkinkan sebuah set instruksi yang akan 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.
Contoh pertama di bawah ini menunjukkan penggunaan istilah rekursi untuk membaca dimasukkan oleh pengguna dari keyboard dan output mereka ke layar, sampai akhir dijumpai.
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).
?- 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 pemisahan operator; / 2 yang disebutkan dalam Pasal di atas 4,4
program dapat ditulis ulang sebagai satu klausa.
loop:-write('Type end to end'),read(Word),
write('Input was '),write(Word),nl,
(Word=end;loop).
The 'memisahkan tujuan' (Firman = akhir; loop) digantikan jika Firman variabel terikat untuk
akhir atom. Jika tidak, sistem berusaha untuk memenuhi tujuan loop rekursif.
?- loop.
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
6.2.2 Menggunakan 'ulangi' Predicate
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 ulangi. Nama predikat ini benar-benar sebuah ironi. Tujuan tidak mengulangi mengulangi apa pun; itu hanya berhasil setiap kali disebut. Nilai besar mengulang adalah bahwa hal itu juga berhasil (sebanyak yang diperlukan) pada kemunduran. Efek ini, seperti untuk tujuan lainnya berhasil, 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. Program ini berulang kali mendorong pengguna untuk memasukkan istilah sampai entah ya atau tidak dimasukkan. Ini adalah alternatif dari program rekursif ditampilkan di bagian akhir bagian sebelumnya. Dalam hal ini masih diperdebatkan apakah menggunakan mengulang adalah perbaikan menggunakan rekursi, tetapi contoh adalah termasuk untuk tujuan ilustrasi.
get_answer(Ans):-
write('Enter answer to question'),nl,
repeat,write('answer yes or no'),read(Ans),
valid(Ans),write('Answer is '),write(Ans),nl.
valid(yes). valid(no).
Pertama lima gol 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 (Jawaban) adalah puas, efektif menciptakan lingkaran antara mengulangi dan valid (Jawaban).
?- get_answer(X).
Enter answer to question
answer yes or no: unsure.
answer yes or no: possibly.
answer yes or no: no.
answer is no
X = no
6,3 Backtracking dengan Kegagalan
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.
6.3.1 Pencarian Database
Misalkan database berisi klausa seperti
dog(fido).
dog(fred).
dog(jonathan).
alldogs:-dog(X),write(X),write(' is a dog'),nl,fail.
alldogs.
?- alldogs.
fido is a dog
fred is a dog
jonathan is a dog
no
6.3.2 Multiple Mencari Solusi
Backtracking dengan kegagalan juga dapat digunakan untuk mencari semua cara untuk memuaskan tujuan. Misalkan sebuah predikat findroute (Town1, Town2, Route) menemukan sebuah rute Route antara dua kota Town1 dan Town2. Rincian predikat ini tidak relevan
di sini. Ini dapat diasumsikan bahwa Town1 dan Town2 adalah atom dan bahwa rute ini adalah daftar. Backtracking dengan kegagalan kemudian dapat digunakan untuk mencari semua kemungkinan rute antara Town1 dan Town2 dan menulis masing-masing satu di baris terpisah, sebagai berikut:
find_all_routes(Town1,Town2):-
findroute(Town1,Town2,Route),
write('Possible route: '),write(Route),nl,fail.
find_all_routes(_,_).
0 komentar:
Posting Komentar