Selasa, 08 Desember 2009

Looping in Prolog

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.

Don't Worry..

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

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: '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.

?- 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

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.

/* 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 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.

?- output_values(5,12).
56789
10
11
12
end of example

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

6.2.1 Rekursi
Contoh 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


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

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

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

Prolog 6.3.1 Pencarian Database

Misalkan database berisi klausa seperti

dog(fido).
dog(fred).
dog(jonathan).

Setiap klausa anjing dapat diproses pada gilirannya menggunakan predikat alldogs didefinisikan di bawah.

alldogs:-dog(X),write(X),write(' is a dog'),nl,fail.
alldogs.

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

?- alldogs.
fido is a dog
fred is a dog
jonathan is a dog
yes

Catatan pentingnya klausa kedua dari predikat alldogs. Hal ini ada untuk memastikan bahwa, setelah database telah digeledah, tujuan berhasil. Dengan hanya
baris pertama, setiap panggilan ke alldogs akhirnya akan gagal.

?- 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(_,_).


Practical Exercise 6
(1) Define a predicate to output the values of the squares of the integers from N1 to
N2 inclusive and test it with N1 = 6 and N2 = 12.
(2) Define and test a predicate to read in a series of characters input by the user and
output all of those before the first new line or ? character.
(3) Using the person clauses given in Section 6.3.1, find the professions of all
those over 40.



Answer Practical Exercise 6
(1) Kita mengetik di notepad untuk di eksekusi oleh prolog seperti di bawah ini.



 Kemudian dalam prolog, kita consult file di atas. Dan masukkan kata kunci seperti di bawah ini.



(2) Kita mengetik di notepad untuk di eksekusi oleh prolog seperti di bawah ini.
 


Untuk mendapakan hasilnya, kita bisa mengetes dengan dua contoh di bawah ini.



 







(3)  Kita mengetik di notepad untuk di eksekusi oleh prolog seperti di bawah ini.



Kemudian kita bisa mencetak keluarannya dengan hanya menulis find. seperti di bawah ini.



Semoga bermanfaat....
See ya..

Tidak ada komentar:

Posting Komentar