Assalamu’alaikum Wr. Wb. (alfie mode: ON)
Ehm….ehm (margo mode: ON)
Sedang dikejar-kejar deadline nih (kaya pernah dengar) ….anyway…selamat berjumpa dalam Pembelajaran kali ini. Tema nya adalah Looping…
Langsung saja masuk ke materi pembahasan:
Bismillah….
Hampir semua bahasa pemrograman memiliki fasilitas looping, demikian juga dengan prolog. Dengan looping maka instruksi-instruksi yang ada akan dieksekusi hingga beberapa kali / mencapai batas yang ditentukan.
1. Looping a Fixed Number of Times
Contoh 1:
loop(0).
loop(N):-N>0,write(‘The value is: ‘),write(N),nl,
M is N-1,loop(M).
Predikat loop menandakan instruksi diatas adalah perintah looping. Kemudian klausa dibawahnya berarti lakukan loop dari N, cetak (tulis) nilainya. Kemudian klausa yang berikutnya berarti kurangi N dengan 1 akan sama dengan M, kemudian lakukan looping dari M.
Kemudian kita buka dengan prolog:
?- 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:
/* 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).
Output disini memiliki dua argument, yang dibaca sebagai “hasil keluaran yang berupa integer dari pertama hingga terakhir”. Loop berakhir jika keduana (First, Last) memiliki nilai yang sama. Hasil dalm prolog:
?- output_values(5,12).
56789
10
11
12
end of example
yes
Contoh 3:
Tentukan sebuah predikat untuk menemukan jumlah bilangan bulat dari 1 sampai N (katakanlah untuk N = 100).
Adalah wajar untuk memikirkan secara prosedural ini, yaitu mulai dengan 1, kemudian tambahkan 2, kemudian tambahkan 3, kemudian tambahkan 4, …, kemudian tambahkan 100. Namun proses ini lebih mudah program jika reexpressed declaratively dalam hal itu sendiri.
Jumlah dari 100 bilangan bulat yang pertama adalah jumlah dari 99 bilangan bulat yang pertama, ditambah 100.
Jumlah dari 99 bilangan bulat yang pertama adalah jumlah dari 98 bilangan bulat yang pertama, ditambah 99.
Jumlah dari 98 bilangan bulat yang pertama adalah jumlah dari 97 bilangan bulat yang pertama, ditambah 98.
… … … … … … … … … … … … … … … … … … … … … … … … … … … … ….
Jumlah dari 3 bilangan bulat pertama adalah jumlah dari 2 bilangan bulat pertama, ditambah 3.
Jumlah dari 2 bilangan bulat pertama adalah jumlah dari 1 bilangan bulat pertama, ditambah 2.
Jumlah 1 bilangan bulat pertama adalah satu.
Ada dua kasus yang berbeda untuk mempertimbangkan:
general case: ‘jumlah N bilangan bulat adalah jumlah dari N-1 bilangan bulat, ditambah N.
terminating case:’ jumlah 1 bilangan bulat pertama adalah 1 ‘. Ini mengarah langsung ke definisi rekursif.
/* 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
Contoh 4:
Program berikut ini membaca 6 istilah pertama dari file tertentu dan mencetak arus keluaran mereka. Ini menggunakan metode ‘menghitung mundur’, dengan cara yang sama untuk Contoh 1.
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).
2. Looping hingga Sebuah Kondisi Tercapai/ Terpenuhi
Hampir semua bahasa pemrograman memiliki “until loop”, yang menyebabkan sekumpulan instruksi dieksekusi hingga kondisi yang ditentukan terpenuhi.
a.Rekursi
Contoh pertama di bawah ini menunjukkan penggunaan istilah rekursi untuk membaca masukkan dari keyboard dan output mereka ke layar, sampai “end” terpenuhi.
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
b. Menggunakan Predikat repeat
Nama predikat ini benar-benar sebuah ironi (misnomer). Tujuan repeat tidak mengulang apa-apa; itu hanya berhasil setiap kali disebut. Nilai besar ulangi adalah bahwa ia juga berhasil (sebanyak yang diperlukan) dalam backtracking. Efek dari ini, seperti untuk tujuan lainnya, adalah untuk mengubah urutan dengan mengevaluasi goal 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.
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).
Cek dalam prolog:
?- 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
3. Backtracking menggunakan “failure”.
- Pencarian Database Prolog.
Contoh 1:
Database nya terdiri dari:
dog(fido).dog(fred).
dog(jonathan).
Dengan rules:
alldogs:-dog(X),write(X),write(‘ is a dog’),nl,fail.
alldogs.
Kita cek dalam prolog:
?- alldogs.
fido is a dog
fred is a dog
jonathan is a dog
yes
Contoh 2:
Program berikutnya dirancang untuk mencari database yang berisi klausul yang mewakili nama, umur, tempat tinggal dan pekerjaan dari sejumlah orang. Jika database berisi lima klausa:
person(john,smith,45,london,doctor).
person(martin,williams,33,birmingham,teacher).
person(henry,smith,26,manchester,plumber).
person(jane,wilson,62,london,teacher).
person(mary,smith,29,glasgow,surveyor).
Kemudian kita berikan predikat:
allteachers:-person(Forename,Surname,_,_,teacher),
write(Forename),write(‘ ‘),write(Surname),nl,
fail.
allteachers.
Kita cek menggunakan Prolog:
allteachers:-person(Forename,Surname,_,_,teacher),
write(Forename),write(‘ ‘),write(Surname),nl,
fail.
allteachers.
Semoga pembahasan kali ini cukup membantu…
Kemudian pembahasan soal akan kami muat dalam page yang berbeda…biar lebih mudah untuk dibaca..
Wassalam…
ganbatee !! (artinya semangatttt: novan.red)