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

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