DASAR-DASAR PROLOG
1. TUJUAN :
Mahasiswa diharapkan dapat menggunakan dasar-dasar pemrograman Prolog
2. MATERI
Fakta dan Relasi
Aturan
Pertanyaan (Query)
3. TEORI
ayah(slamet,amin).
Contoh lain :
Tini suka boneka Dalam Prolog : suka(tini,boneka)
Angga suka renang dan tenis suka(angga,renang) dan suka(angga,tenis).
Wanita(anita).
Informasi yang didapat dari fakta yang diketahui, maka dapat diambil kesimpulan
(jawaban) dari aturan tersebut yaitu Yuli suka apel.
Dalam Prolog, fakta diatas dituliskan sebagai :
Suka(tino,apel).
Suka(Yuli,Sesuatu) if suka(tina,Sesuatu).
3. Pertanyaan (Query)
Setelah memberikan data-data berupa fakta dan aturan, kita dapat mengajukan pertanyaan
berdasarkan fakta dan aturan yang ada. Misalkan :
Suka(tini,boneka).
Pertanyaan ini sesuai dengan fakta yang ada, maka Prolog akan memberikan jawaban :
Suka(tini,mobil-mobilan).
No
Pertanyaan diatas bersifat membuktikan terhadap fakta yang ada sehingga hanya ada 2
kemungkinan jawaban yaitu benar atau salah. Disamping itu, Prolog juga mampu
memberikan jawaban atas pertanyaan apakah, siapakah, dan lain-lain.
Misalkan :
Suka(tini,Apa).
Prolog akan mencoba mencari jawaban dari fakta yang ada dan akan memberikan
jawaban :
Apa = boneka
Suka(Siapa,boneka).
Siapa = tini
Latihan
1. Tuliskan pernyataan berikut ini dalam bahasa Prolog :
Andi mempunyai hobby bermain tennis.
Yuli berumur 25 tahun.
Dudung mempunyai seekor anjing Buldog.
Buah anggur berwarna ungu dan tumbuh merambat.
TEORI
Secara garis besar, program Turbo Prolog 2.0 terdiri dari 4 bagian utama yaitu :
DOMAINS
PREDICATES
GOAL
CLAUSES
1. Domains
Domains berisi deklarasi (pernyataan) tentang jenis data yang digunakan dalam fakta dan
aturan. Ada 6 buah “domain” standar yang dikenal dalam Turbo Prolog 2.0:
Integer Bilangan bulat dari -32.766 sampai 32.767.
Real Bilangan dari 1e-307 sampai 1e+308.
Char Karakter tunggal yang diapit dengan ‘ ’, terdiri atas huruf, angka atau
simbol khusus.
String Kumpulan karakter yang diapit dengan “ “,
Symbol Kumpulan karakter yang diakhiri dengan spasi dan harus diawali dengan
huruf kecil.
File Digunakan untuk operasi File
Disamping domain standar, pemrogram dapat pula mendefinisikan domain lain yang
terdiri dari domain standar.
2. Predicates (Predikat)
Predikat adalah nama simbolik untuk relasi.
Sebagai contoh :
Ayah(slamet,amin).
Ayah(symbol,symbol)
Dimana ayah adalah nama predikat sedangkan slamet dan amin adalah obyek yang
berjenis symbol, serta dituliskan tanpa diakhiri dengan tanda titik.
Dalam predikat, slamet dan amin disebut sebagai argumen. Sebuah predikat dapat tidak
memiliki atau memiliki argumen dengan jumlah bebas. Jumlah argumen suatu predikat
disebut aritas (arity).
Argumen dalam suatu predikat tidak harus dituliskan dengan domains standar tetapi dapat
dinyatakan dengan argumen lain, misalkan :
mulai
alamat(jalan,kota,kode_pos)
ulang_tahun(tanggal,bulan,tahun)
pilih_Nama_Penerbangan(maskapai,tujuan,jam_berangkat,lama_perjalanan)
Apabila argumen suatu predikat tidak dituliskan dalam domain standar, maka argumen
tersebut harus dinyatakan dalam bagian DOMAINS, begitu juga sebaliknya.
3. Clauses (Klausa)
Klausa berisi fakta dan aturan yang membentuk keseluruhan program. Bagian klausa ini
mirip dengan prosedur pada bahasa pemrograman yang lain. Bagian fakta umumnya
dituliskan sebelum bagian aturan dan fakta atau aturan yang mempunyai relasi yang sama
harus dituliskan berkelompok.
Contoh penulisan Klausa :
CLAUSES
ayah(slamet,amin).
ayah(slamet,anang).
ayah(amin,budi).
kakek(slamet,budi).
CLAUSES
ayah(slamet,amin).
ayah(slamet,anang).
ayah(slamet,budi).
kakek(amin,budi).
4. GOAL
Goal berisi pertanyaan yang kita ajukan kepada program Prolog. Dari bagian-bagian yang
terlah dituliskan sebelumnya, hanya bagian GOAL yang dituliskan menggunakan kata
tunggal karena hanya boleh ada sebuah goal. Goal ini dapat terdiri dari beberapa bagian
yang disebut subgoal. Hal perlu diingat bahwa, suatu pernyataan, baik fakta, relasi atau
goal dikatakan satu apabila diakhiri dengan tanda titik.
Latihan
Buatlah program dalam bahasa prolog menggunakan struktur pemrograman prolog dari
silisilah berikut :
slamet
amin anang
1. TUJUAN
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat menggunakan variabel
dan goal majemuk.
2. MATERI
a. Variabel
b. Goal Majemuk
3. TEORI
3.1. Variabel
Variabel yaitu besaran yang nilainya dapat berubah-ubah.
Misalnya :
Karena ayah Didi belum diketahui, maka dituliskan dalam suatu variabel, misalnya
variabel X dan dituliskan sebagai :
GOAL: ayah(X,didi)
X = anang
Program Prolog akan mencari padanan pertanyaan tersebut dengan fakta atau aturan yang
ada dan variabel X tersebut akan mendapatkan nilai dari konstanta suatu fakta/aturan
yang sepadan. Dari fakta-fakta yang ada, pertanyaan tersebut sepadan dengan :
Ayah(anang,didi)
Karena mempunyai relasi yang sama (yaitu ayah) dan obyek kedua yang sama (yaitu
didi). Dengan demikian, variabel X akan mendapatkan nilai anang (sesuai dengan obyek
yang pertama).
DOMAINS
merk, warna = symbol
harga = integer
PREDICATES
mbil(merk,warna,harga)
CLAUSES
mobil(toyota,putih,50).
mobil(mazda,merah,40).
mobil(honda,biru,55).
mobil(ford,merah,30).
mobil(bmw,biru,80).
mobil(holden,putih,30).
4. Latihan
a. Tulislah contoh program pada materi goal majemuk!
b. Editlah program tersebut, kompilasi dan eksekusilah!
c. Tuliskan perintah goal untuk mendapatkan informasi tentang merk mobil yang
harganya kurang dari 30 juta!
d. Tuliskan perintah goal untuk mednapatkan informasi tentang merk mobil yang
harganya diatas 30 juta dan warnanya biru!
5. Tugas
a. Buatlah program dalam bahasa prolog yang menggunakan goal majemuk!
MODUL IV
UNIFIKASI
1. TUJUAN
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat memahami unifikasi
dan proses pencarian jawaban pada bahasa prolog.
2. Materi
Unifikasi
Proses Pencarian Jawaban
3. TEORI
3.1. UNIFIKASI
Unifikasi adalah proses yang dilakukan oleh turbo prolog untuk mencari padanan antara
pernyataan yang terdapat pada aturan dengan fakta atau kepala aturan lain.
Syarat terjadinya unifikasi antara 2 pernyataan :
1. Mempunyai relasi yang sama.
2. Mempunyai jumlah argumen yang sama dan posisi argumen yang sama pula.
3. Argumen yang berpadanan harus mempunyai jenis data yang sama.
4. Semua pasangan argumen (pada data majemuk) harus juga berpadanan.
Misalnya :
Karena mempunyai jumlah argumen yang tidak sama, walaupun mempunyai nama relasi
yang sama.
GOAL: kakek(Kakek,budi).
Turbo Prolog akan mencari padanan goal diatas dengan fakta atau aturan, mulai dari yang
teratas sampai ditemukan fakta atau aturan yang sepadan yaitu :
Untuk membuktikan kebenaran pernyataan diatas, Turbo Prolog mencari padanan dengan
fakta yang ada mulai dari yang teratas, hingga ditemukan :
Ini berarti Variabel Ayah terikat menjadi amin. Karena subgoal yang pertama benar,
maka Turbo Prolog akan melanjutkan ke subgoal berikutnya dengan membawa serta
semua variabel yang telah terikat pada subgoal sebelumnya:
Pada aturan kakek, hanya nilai variabel Kakek yang dityeruskan sedangkan nilai variabel
Ayah tidak diperlukan.
Kakek = slamet
4. LATIHAN
DOMAINS
nama = symbol
PREDICATES
ayah(nama,nama)
ibu(nama,nama)
nenek(nama,nama)
kakek(nama,nama)
saudara_kandung(nama,nama)
saudara_sepupu(nama,nama)
CLAUSES
/* F A K T A */
/* Orang Tua */
ayah(slamet,amin).
ayah(slamet,anang).
ayah(amin,budi).
ayah(amin,badu).
ayah(anang,didi).
ayah(anang,dadi).
ayah(santoso,bu_amin).
ayah(supardi,bu_anang).
ibu(bu_slamet,amin).
ibu(bu_slamet,anang).
ibu(bu_amin,budi).
ibu(bu_amin,badu).
ibu(bu_anang,didi).
ibu(bu_anang,dadi).
ibu(bu_santoso,bu_amin).
ibu(bu_supardi,bu_anang).
/* ATURAN */
kakek(Kakek,Cucu) :-
ayah(Ayah,Cucu),
ayah(Kakek,Ayah).
kakek(Kakek,Cucu) :-
ibu(ibu,Cucu),
ayah(Kakek,ibu).
5. TUGAS
Dari contoh program pohon keluarga, tambahkan aturan-aturan untuk mendapatkan:
Nenek dan Cucu
Saudara Kandung
Saudara Sepupu
MODUL V
TRACE DAN RUNUT BALIK (BACKTRACKING)
1. TUJUAN
Setelah mengikuti praktikum ini mahasiswa dapat mengetahui alur langkah-langkah
yang ditempuh oleh Bahasa Prolog.
2. MATERI
Trace
Runut balik (backtracking)
3. TEORI
3.1. Trace
Untuk mengetahuia alur langkah-langkah yang ditempuh oleh Turbo Prolog dalam
mencari jawaban dapat menggunakan modus TRACE. Disamping itu, kita dapat pula
mengetahui hasil setiap langkah tersebut.
Caranya dengan menambahkan perintah trace sebelum bagian DOMAINS.
trace
DOMAINS
nama = symbol
Kemudian program dikompilasi ulang. Pada saat program dieksekusi, kita harus
menekan F10 pada setiap langkah dan hasilnya dapat dilihat di jendela Trace.
4. LATIHAN
Buatlah program berikut :
trace
DOMAINS
orang, kue, rasa = symbol
PREDICATES
kue(kue)
rasa(kue,rasa)
suka(orang,kue)
CLAUSES
kue(martabak).
kue(bolu).
rasa(martabak,gurih).
rasa(bolu,manis).
suka(andi,Kue) :-
kue(Kue), rasa(Kue,manis).
suka(andi,Apa)
Lakukan Trace dan Amati apa yang dilakukan oleh prolog dengan Goal tersebut!
5. TUGAS
Buatlah program prolog seperti pada latihan diatas untuk kesukaan terhadap buah-
buah dan ciri-ciri suatu buah!
Lakukan trace untuk melihat runut balik dari program tersebut!
MODUL VI
MASUKAN DAN KELUARAN
1. TUJUAN
Setelah mengikuti praktikum ini mahasiswa dapat menggunakan predikat jadi yang ada
pada Turbo Prolog 2.0 dan dapat menggunakan jendela (window).
2. MATERI
a. Predikat Keluaran
b. Predikat Masukan
c. Predikat Not
d. Jendela (window)
3. TEORI
Turbo Prolog 2.0 telah dilengkapi dengan predikat jadi dalam jumlah cukup banyak yang
mencakup berbagai macam fungsi. Predikat jadi (standar) ini tidak dapat diubah-ubah
oleh pemrogram dan nama predikat jadi tidak boleh digunakan sebagai nama predikat
yang dibuat oleh pemrogram (reserved word).
Dalam menggunakan predikat jadi, pemrogram hanya menuliskan variabel sesuai dengan
argumen predikat tersebut.
a. Write
Digunakan untuk menuliskan konstanta atau isi variabel ke piranti keluaran yang
dikenali saat itu. Bentuk umum predikat write adalah:
write(E1,E2,E3,…,En) – (i,i,…,i)
dimana E1, E2, E3,…,En adalah konstanta (karakter atau string) atau variabel.
Variabel yang akan dituliskan isinya harus variabel terikat (bound variabel) dan
predikat write selalu benar.
tes :-
write(“Saya sedang belajar Prolog.”),
write(“Teman Saya belajar Basic”).
Bagaimana caranya agar kalimat yang kedua dituliskan pada baris berikutnya? Turbo
Prolog 2.0 mempunyai predikat jadi nl (new line).
tes :-
write(“Saya sedang belajar Prolog.”),nl,
write(“Teman Saya belajar Basic”).
Disamping itu untuk menuliskan baris baru dapat pula menggunakan perintah garis
miring balik (backslash), yaitu \n, yang dituliskan bersama-sama di dalam tanda kutip
(tunggal maupun rangkap).
Klausanya dapat dituliskan sebagai berikut:
tes :-
write(“Saya sedang belajar Prolog.\nl”),
write(“Teman Saya belajar Basic”).
b. Writef
Predikat writef mempunyai fungsi yang hampir sama dengan predikat write, hanya
hasilnya mempunyai format seperti yang diinginkan. Bentuk umum predikat writef
adalah:
write(format,E1,E2,E3,…,En) – (i,i,…,i)
Macam-macam format f:
f : bilangan real dalam notasi desimal
e : bilangan real dalam notasi ekponensial
g : bilangan real dalam bentuk paling sederhana
d : karakter atau bilangan bulat dalam bilangan desimal
u : kaarakter atau bilangan bulat dalam bilangan bulat positif
x : karakter atau bilangan bulat dalam bilangan heksadesimal
c : karakter atau bilangan bulat sebagai karakter
s : string
MODUL VII
PERBANDINGAN DAN OPERASI ARITMATIKA
1. TUJUAN
Setelah mengikuti praktikum ini, mahasiswa diharapkan dapat menggunakan fungsi-
fungsi operator perbandingan dan operator aritmatika pada prolog.
2. MATERI
Operator Perbandingan
Operator Sama dengan
Operasi Aritmatika
Fungsi Matematika
3. TEORI
3.1 Perbandingan
Operator Perbandingan berfungsi untuk membandingkan nilai suatu variabel terikat
atau suatu obyek. Variabel atau obyek yang dibandingkan disebut operand. Kedua
operand yang dibandingkan haruslah sudah terikat dengan nilai tertentu (baik variabel
maupun obyek), kecuali operator sama dengan.
PREDICATES
tes
CLAUSES
tes :-
x = 6 + 4,
write(x).
Bila program tersebut dikompilasi dan dieksekusi, akan memberikan hasil:
Goal: tes
10
True
Hasilnya sama dengan bahasa lainnya. Tetapi tambahkanlah contoh program di atas
dengan beberapa pernyataan:
PREDICATES
tes
CLAUSES
tes :-
x = 6 + 4,
write(x),nl,
x = 6 – 4,
write(x),nl.
Goal: tes
10
False
Pada bagian yang pertama, variabel X terikat dengan nilai 10, kemudian variabel X
yang sudah terikat dengan nilai 10 dibandingkan dengan nilai 6 – 4 dan tentu saja hal
ini akan menghasilkan kondisi salah (False).
Turbo prolog 2.0 juga memiliki 2 buah predikat jadi yang berfungsi untuk
menghasilkan bilangan acak, yaitu :
random(X): menghasilkan X yang merupakan bilangan real secara acak antara
0 dan 1 ( 0 <= X < 1).
random(X,Y): menghasilkan Y yang merupakan bilangan bulat secara acak
antara 0 dan X ( 0<= Y < X ).
4. LATIHAN
Berikut adalah program untuk mencari solusi akar persamaan kuadrat yang
berbentuk:
AX2 + BX + C
Solusi akar persamaan kuadrat tersebut didapat dengan menghitung terlebih dahulu
deksriminannya yaitu:
D = B2 - 4 * A * C
Bila :
D < 0, maka tidak ada solusi.
D = 0, maka ada 2 buah akar yang sama yaitu X = -B/(2 * A)
D > 0, maka ada 2 buah akar yang tidak sama yaitu:
X1 = ( -B + D) / (2 * A)
X2 = ( -B - D) / (2 * A)
Program lengkapnya :
DOMAINS
A,B,C,D = real
PREDICATES
solusi(A,B,C)
jawaban(A,B,D)
GOAL
makewindow(1,7,7,”SOLUSI AKAR PERSAMAAN KUADRAT”,5,5,15,70),
write(“ Masukkan koefisien persaman kuadrat \n”),
write(“ A = “), readreal(A),
write(“ B = “), readreal(B),
write(“ C = “), readreal(C), nl,
solusi(A,B,C).
CLAUSES
Solusi(A,B,C) :-
D = B*B - 4*A*C,
writef(“Solusi akar persamaan kuadrat %2*X*X +”,A),
writef(“ %2*X + %2 = 0 adalah : “,B,C),nl,
jawaban(A,B,D),nl.
/* Diskriman < 0 */
jawaban(_,_,D) :-
D < 0,
Write(“ Tidak Ada Jawaban ”),!.
/* Diskriman = 0 */
jawaban(A,B,D) :-
D = 0,
X= -B/(2*A),
Write(“ Ada dua akar yang sama yaitu X = ”,X),!.
/* Diskriman > 0 */
jawaban(A,B,D) :-
D > 0,
X1 = (-B + sqrt(D))/(2*A),
X2 = (-B - sqrt(D))/(2*A),
write(“ X1 = ”,X1),nl,
write(“ X2 = ”,X2).
5. TUGAS
a. Buatlah program yang menghasilkan tabel harga sinus, cosinus dan tangen mulai
dari 0 derajat sampai 360 derajat dengan selang 15 derajat!
b. Buatlah program tebak-tebakan bilangan bulat antara 1 sampai dengan 10 dengan
menggunakan predikat Random!
MODUL VIII
PENGENDALIAN ALUR
(PREDIKAT FAIL DAN PREDIKAT CUT)
1. TUJUAN :
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat menggunakan predikat
fail dan predikat cut.
2. MATERI
Predikat Fail
Predikat Cut
3. TEORI
Turbo Prolog 2.0 dilengkapi dengan 2 buah predikat standar yang digunakan untuk
mengendalikan jalannya runut balik, yaitu predikat fail dan predikat cut (dituliskan
dengan !).
2 = 3 (apakah 2 = 3) ?
Misalkan:
Ada 4 buah klausa yang terdiri dari 2 jenis yaitu x dan y.
x:- a,b,!,c,d.
x:- e.
y:- r,x,s.
y:- t.
Bila kondisi gagal ditemui pada subgoal a atau b, maka Turbo Prolog 2.0 akan dapat
melakukan runut balik pada subgoal a atau b. Bila tidak ditemui kemungkinan jawaban
yang lain, maka Turbo Prolog 2.0 akan melanjutkan ke klausa x berikutnya yang terdiri
dari subgoal e.
Bila subgoal a dan b benar, Turbo Prolog 2.0 akan mengeksekusi predikat cut yang selalu
benar. Kemudian Turbo Prolog 2.0 melanjutkan ke subgoal c. Bila turbo Prolog 2.0
menemui kondisi gagal, maka Turbo Prolog 2.0 hanya dapat melakukan runut balik pada
subgoal c dan tidak dapat melakukan runut balik ke subgoal a, b atau ke x yang lain
karena dihalangi oleh predikat cut yang berfungsi sebagai pagar.
4. LATIHAN
a. Buatlah program berikut yang merupakan penggunaan dari predikat fail!
DOMAINS
kota, propinsi = string
PREDICATES
ibu_kota(kota,propinsi)
tampil
CLAUSES
ibu_kota("Surabaya","Jawa Timur").
ibu_kota("Semarang","Jawa Tengah).
ibu_kota("Bandung","Jawa Barat").
ibut_kota("Palembang","Sumatera Selatan").
tampil :-
ibu_kota(Kota,Propinsi),
write(Kota," adalah ibu kota ",Propinsi,"\n"),
fail.
Edit, kompilasi dan eksekusilah program tersebut serta cobalah beberapa goal
yang mungkin!
DOMAINS
kota, propinsi = string
PREDICATES
ibu_kota(kota,propinsi)
tampil
cek(kota)
CLAUSES
ibu_kota("Surabaya","Jawa Timur").
ibu_kota("Semarang","Jawa Tengah).
ibu_kota("Bandung","Jawa Barat").
ibut_kota("Palembang","Sumatera Selatan").
tampil :-
ibu_kota(Kota,Propinsi),
write(Kota," adalah ibu kota ",Propinsi,"\n"),
fail.
tampil.
cek("Semarang") :-!,
fail.
cek(_).
Edit, kompilasi dan eksekusilah program tersebut serta cobalah beberapa goal
yang mungkin!
5. TUGAS
a. Buatlah program penggunaan predikat dan cut pada latihan dengan
menemptakan GOAL di dalam program (goal internal)!
b. Tambahkan pada program tersebut beberapa fakta lainnya!
MODUL IX
PENGENDALIAN ALUR
(REKURSI)
1. TUJUAN:
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat membuat program
rekursi.
2. MATERI
Rekursi
Rekursi Ekor
Cara mengatasi masalah pada rekursi
Penggunaan Variabel pada rekursi
Predikat Repeat
3. TEORI
3.1 Rekursi
Dalam bahasa komputer prosedural (Basic, Pascal atau C), rekursi adalah suatu prosedur
yang mengandung prosedur itu sendiri. Dalam Turbo Prolog 2.0 didefinisikan sebagai
suatu klausa yang salah satu subgoalnya adalah klausa itu sendiri.
Misalkan program untuk menghitung faktorial suatu bilangan (dalam matematika,
faktorial dilambangkan dengan !).
1! =1
3! =3x2x1 =6
5! = 5 x 4 x 3 x 2 x 1 = 120
Perumusan untuk mendapatkan nilai faktorial suatu bilangan dituliskan sebagai berikut:
DOMAINS
angka = integer
hasil = real
PREDICATES
faktorial(angka,hasil)
CLAUSES
faktorial(1,1) :-!.
faktorial(X,FaktY) :-
Y = X - 1,
faktorial(Y,FaktY),
FaktX = X * FaktY.
Bila dimasukkan:
GOAL: faktorial(3,Hasil)
Berarti nilai X = 3 dan faktorial akan memanggil dirinya sendiri dengan X = 2. Bila nilai
X telah mencapai 1, maka klausa yang pertama menjadi benar sehingga:
Faktorial(Y,FaktY) - faktorial(1,1)
FaktX = X * FaktY.
Setelah didapatkan hasil faktorial(1,1), maka berarti nilai FaktY = 1, dan Turbo prolog
2.0 memanggil nilai X sebelumnya yaitu X = 2 sehingga:
FaktX = 3 * 2 = 6
Karena tidak ada lagi nilai X yang disimpan di stack frame maka nilai 6 diteruskan ke
variabel Hasil.
DOMAINS
angka = integer
PREDICATES
deret(angka)
CLAUSES
deret(N) :-
write(N," "),
NN = N + 1,
deret(NN).
Ada beberapa hal yang menyebabkan rekursi ekor tidak akan terjadi, yaitu:
a. Bila subgoal yang memanggil dirinya sendiri tidak terletak di
bagian akhir.
Contoh :
deret(N) :-
write(N," "),
NN = N + 1,
deret(NN),
nl.
b. Bila masih ada klausa yang sama lainnya belum dicoba pada saat
rekursi terjadi (terdapat titik runut balik).
Contoh :
deret2(N) :-
write(N," "),
NN = N + 1,
deret2(NN).
deret2(N) :-
N < 0,
Write(“ N adalah bilangan negatif”).
deret3(N) :-
write(N," "),
NN = N + 1,
Cek(NN),
Deret3(NN).
cek(X) :- X >= 0
cek(X):- X < 0
deret3(N) :-
write(N," "),
NN = N + 1,
Cek(NN),!,
Deret3(NN).
cek(X) :- X >= 0
cek(X):- X < 0
Begitu pula program deret2 dapat diperbaiki dengan menambahkan predikat cut.
deret2(N) :-
N >= 0,!,
write(N," "),
NN = N + 1,
deret2(NN).
deret2(N) :-
Write(“ N adalah bilangan negatif”).
Sedangkan pada contoh program deret1 tidak dapat diperbaiki lagi sehingga satu-satunya
cara adalah dengan mengubah susunan program tersebut sehingga predikat yang
memanggil dirinya sendiri berada pada paling akhir klausa tersebut.
N = N + 1
Dimana nilai N yang sama digantikan dengan nilai N yang baru. Dalam Turbo Prolog 2.0
hal ini tidak dapat diperkenankan karena selama suatu variabel masih terikat dengan nilai
tertentu, maka variabel tersebut tidak bisa digunakan untuk memuat nilai yang lain dan
operasinya hanya bersifat pemadanan.
4. LATIHAN
Edit, Kompilasi dan eksekusi program deret dengan menggunakan rekursi ekor
berikut:
/* Program deret menggunakan rekursi ekor */
DOMAINS
angka = integer
PREDICATES
deret(angka,angka,angka)
GOAL
makewindow(1,13,9,"REKURSI",5,10,15,60),
write(" Program ini akan menghasilkan deret hitung \n"),
write("\n Angka awal : "),readint(Awal),
write("\n Angka akhir: "),readint(Akhir),
write("\n Selang : "),readint(Selang),
write("\n\n"),
deret(Awal,AKhir,Selang).
CLAUSES
deret(AKhir,AKhir,_).
deret(Awal,Akhir,Selang) :-
write(Awal," "),
Bil = Awal + Selang,
deret(Bil,AKhir,Selang).
5. TUGAS
1. TUJUAN:
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat membuat program
menggunakan predikat Repeat.
2. MATERI
Predikat Repeat
3. TEORI
Predikat repeat digunakan untuk memaksa program agar mencari kemungkinan jawaban
yang lain melalui runut balik. Predikat repeat bukanlah predikat jadi sehingga bila kita
akan menggunkannya, kita harus mendefinisikanny di dalam program dan kita bisa
menggunakan kata sembarang, misalnya ulang,
repeat.
repeat :-
repeat.
Dengan struktur seperti diatas, program akan selalu mencatat adanya titik runut balik
pada klausa tersebut.
Predikat repeat selalu benar. Bila salah satu subgoal dalam suatu klausa yang
mengandung predikat repeat mendapatkan kondisi gagal, maka program akan selalu
melakukan runut balik ke predikat repeat, setelah runut balik ke subgoal sesudahnya
telah selesai dilakukan. Dengan menggunakan predikat repeat, program kita bisa berulang
tanpa batas dan biasanya digunakan dalam program yang alurnya selalu kembali ke menu
utama.
Sebagai gambaran, bandingkanlah dua program logon pada Latihan sehingga Anda dapat
mengerti penggunaan predikat repeat.
4. LATIHAN
Bandingkan dua program logon dibawah ini, dalam program logon ini Anda diminta
untuk menuliskan nama Anda dan kata sandi (password). Bila kata sandi yang Anda
tuliskan cocok dengan yang sudah dicantumkan dalam program, maka Anda boleh
meneruskan ke bagian program berikutnya!
/* Program Logon */
DOMAINS
nama,password = symbol
PREDICATES
logon
masukkan_nama(nama,password)
pemakai(nama,password)
GOAL
logon.
CLAUSE
pemakai(anto,bodor).
pemakai(nano,superman).
pemakai(toto,aneh).
logon :-
makewindow(1,13,2,"LOGON",5,10,10,60),
clearwindow,
masukkan_nama(_,_),
write("Anda diperkenankan menggunakan komputer ini")
logon :-
write("Maaf, password anda tidak tidak termasuk dalam \n"),
write("daftar pemakai komputer ini").
masukkan_nama(Nama,Password) :-
write("Masukkan Nama Anda = "),readln(Nama),nl,
write("Masukkan Password Anda = "),readln(Password),
pemakai(Nama,Password).
2. Menggunajan repeat:
DOMAINS
nama,password = symbol
PREDICATES
logon
masukkan_nama(nama,password)
pemakai(nama,password)
repeat
GOAL
logon.
CLAUSE
pemakai(anto,bodor).
pemakai(nano,superman).
pemakai(toto,aneh).
logon :-
makewindow(1,13,2,"LOGON",5,10,10,60),
clearwindow,
masukkan_nama(_,_),
write("Anda diperkenankan menggunakan komputer ini").
logon :-
write("Maaf, password anda tidak tidak termasuk dalam \n"),
write("daftar pemakai komputer ini \n"),
write("Silahkan Mencoba lagi \n\n"),
masukkan_nama(_,_),
write("Anda diperkenankan menggunakan komputer ini").
masukkan_nama(Nama,Password) :-
write("Masukkan Nama Anda = "),readln(Nama),nl,
write("Masukkan Password Anda = "),readln(Password),
pemakai(Nama,Password).
repeat.
repeat :-
repeat.
5. TUGAS
Buatlah program logon tersebut diatas dengan menggunakan metoda
rekursi!
MODUL XI
STRUKTUR DATA
(OBYEK TUNGGAL DAN OBYEK MAJEMUK)
1. TUJUAN :
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat menggunakan obyek
tunggal dan obyek majemuk dalam prolog.
2. MATERI
Obyek Tunggal
Obyek Majemuk
3. TEORI
3.1.1 Variabel
Penulisan nama variabel harus didahului dengan huruf besar (A-Z) atau garis
bawah (_). Variabel yang hanya terdiri dari garis bawah menyatakan variabel tak
bernama, yang berarti kita dapat tidak menghiraukan nilai variabel tersebut.
3.1.2 Konstanta
Konstanta terdiri dari karakter, bilangan dan atom. Nilai dari data tersebut sama
dengan yang tertulis. Jadi konstanta 5 menyatakan bilangan 5, konstanta apa saja
menyatakan simbol apa saja.
a. Karakter
Karakter mempunyai jenis char, yang terdiri dari karakter ASCII yang dapat
dicetak ataupun yang tidak dapat. Karakter yang dapat dicetak adalah ASCII
20H – FFH yang terdiri dari bilangan 0-9, huruf besar A-Z, huruf kecil a-z,
tanda baca dan karakter khusus (ASCII 80H – FFH).
tanggal(10,”Nopember”,2005)
Bagian depan obyek majemuk adalah nama obyek tersebut dan disebut functor sedangkan
bagian-bagiannya disebut argumen. Functor tidak mencerminkan suatu operasi tertentu
tetapi hanya sekedar sebuah nama.
Argumen suatu obyek data majemuk dapat merupakan obyek majemuk pula tanpa suatu
batasan sehingga struktur obyek data majemuk mirip dengan struktur pohon yang dapat
bercabang-cabang. Misalnya, sebuah data pribadi yang terdiri dari nama, alamat, tanggal
lahir dan pekerjaan dapat dituliskan sebagai:
data_pribadi(nama,alamat,tgl_lahir,pekerjaan)
alamat = alamat(jalan,kota,kode_pos)
tgl_lahir = tgl_lahir(tanggal,bulan,tahun)
Argumen obyek majemuk tidak harus mempunyai jenis data yang sama. Misalkan,
tanggal didefinisikan sebagai integer, bulan sebagai string, dan lain-lain.
tanggal(10,”Nopember”,2005)
berpadanan dengan variable bebas X, maka variable X akan terikat dengan nilai
tanggal(10,”Nopember”,2005). Ini berarti Anda dapat mengganggap suatu obyek
data majemuk sebagai suatu obyek data tunggal. Bila data di atas berpadanan
dengan:
tanggal(Tanggal,Bulan,Tahun)
maka variable Tanggal akan terikat dengan 10, Bulan dengan “Nopember”, Tahun
dengan 2005 tanpa menyertakan functor data tersebut. Ini berarti Anda
mengambil bagian-bagian obyek data majemuk tersebut secara terpisah.
Syarat suatu obyek data majemuk dapat berpadanan dengan obyek data majemuk
yang lain adalah nama functor dan jumlah argument harus tepat sama. Misalnya:
Alamat(Jalan,Kota)
data_pribadi(nama,alamat,tgl_lahir,pekerjaan)
nama, alamat, tgl_lahir dan pekerjaan harus dituliskan dalam bagian DOMAINS.
Karena alamat dan tgl_lahir merupakan obyek majemuk, maka argumen-
argumennya juga harus dinyatakan.
DOMAINS
alamat = alamat(jalan,kota,kode_pos)
tgl_lahir = tgl_lahir(tanggal,bulan,tahun)
tanggal,tahun = integer
nama,jalan,kota,kode_pos,bulan,pekerjaan = string
4. LATIHAN
DOMAINS
alamat = alamat(jalan,kota,kode_pos)
tgl_lahir = tgl_lahir(tanggal,bulan,tahun)
tanggal, tahun = integer
nama,jalan,kota,kode_pos,bulan,pekerjaan = string
PREDICATES
data_pribadi(nama,alamat,tgl_lahir,pekerjaan)
CLAUSES
Editlah program berikut di atas dan cobalah beberapa Goal berikut ini serta
perhatikan penggunaan variable tak bernama!
5. TUGAS
Lengkapilah program data pribadi berikut dengan fakta-fakta dan aturan-aturan!
DOMAINS
alamat = alamat(jalan,kota,kode_pos)
tgl_lahir = tgl_lahir(tanggal,bulan,tahun)
tanggal, tahun = integer
nama,jalan,kota,kode_pos,bulan,pekerjaan = string
lama = real
PREDICATES
data_pribadi(nama,alamat,tgl_lahir,pekerjaan)
lama_tinggal(nama,lama)
penduduk(nama,alamat)
menu(nomer)
pilihan(nomer)
GOAL
menu(Nomer),
pilihan(Nomer).
CLAUSES
…………………
…………………
………………..
………………..
………………..
………………..
menu(Nomer) :-
makewindow(1,13,1,”DATA PRIBADI”,3,0,20,80),
write(“1. Data pribadi semua orang \n”),
write(“2. Data orang yang tinggal di kota tertentu \n”),
write(“3. Data orang yang mempunyai pekerjaan tertentu”),nl,
write(“4. Data orang yang telah menjadi penduduk \n\n”),
write(‘Masukkan pilihan anda (1,2,3,4) : “),
readint(Nomer).
Pilihan ……….
………………….
………………….
MODUL XII
STRUKTUR DATA
( LIST )
1. TUJUAN:
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat menggunakan list
dalam Turbo Prolog 2.0.
2. MATERI
List
Menyatakan List
Operasi List
3. TEORI
List adalah kumpulan data yang terurut dan jumlahnya tak tentu. List mirip dengan array
pada bahasa Pascal atau C, tapi perbedaannya, jumlah data pada array tertentu sedangkan
pada list tak tentu. List dituliskan dengan kurung siku dan tiap anggotanya dipisahkan
dengan koma. Misalkan list yang terdiri dari angka 1, 2 dan 3 dituliskan:
[1,2,3]
Anggota list disebut elemen dan elemen suatu list dapat merupakan list yang lain.
List terdiri atas kepala(“head”) dan ekor(“tail”). Kepala merupakan elemen pertama dari
list sedangkan ekor adalah list sisanya. Jadi sebenarnya, list adalah suatu obyek majemuk
yang bersifat rekursif (pengulangan). Oleh sebab itu, list selalu dioperasikan dengan
metode rekursi.
Sebagai contoh:
DOMAINS
list_angka = integer*
Domain di atas menyatakan suatu list yang elemennya terdiri dari bilangan bulat.
Untuk menyatakan suatu list yang elemen-elemennya terdiri dari list yang lain,
misalkan:
[[1,2],[3,4,5],[6,7,8,9]]
DOMAINS
list_angka = integer*
list_total = list_angka*
List tidak dapat berdiri sendiri tetapi merupakan bagian dari data yang lain atau
setingkat dengan data tunggal dan data majemuk.
tulis_list([]) :-!.
cacah([],0) :-!.
cacah([_:E],Cacahan) :-
cacah(E,Cacah_Ekor),
Cacahan = Cacah_Ekor + 1.
Contoh:
anggota(Nama,[Nama:_]).
anggota(Nama,[_:Ekor]) :-
Anggota(Nama,Ekor).
Contoh:
gabung([],L,L).
gabung([X:L1],L2,[X:L3] :-
gabung(L1,L2,L3).
Contoh:
CLAUSES
elemen_n([Kepala:_],1,Kepala) :-!.
elemen_n([_:Ekor],N,Nama) :-
NN = N – 1,
elemen_n(Ekor,NN,Nama).
Contoh:
CLAUSES
list_balik(Awal,Hasil) :-
balik(Awal,[],Hasil).
balik([],Hasil,Hasil) :-!
balik([Kepala:Ekor],List,Hasil) :-
balik(Ekor,[Kepala:List],Hasil).
Cara yang bias ditempuh adalah dengan mengumpulkan semua data umur menjadi
satu terlebih dahulu menjadi sebuah data tunggal dalam bentuk list kemudian baru
dihitung nilai rata-ratanya.
Turbo Prolog 2.0 dilengkapi dengan predikat jadi findall untuk melakukan hal di atas
dan mempunyai format:
findall(NamaVariabel,<predikat>,ListHasil)
dimana:
Nama variable menyatakan argument mana dalam predikat tersebut yang
hasilnya dikumpulkan.
<predikat> menyatakan predikat yang data-datanya akan dikumpulkan.
Argumen yang tidak diperlukan dapat dituliskan dengan menggunakan
variable tak bernama.
ListHasil adalah variable tempat menyimpan nilai-nilai yang telah
dikumpulkan melalui runut balik.
DOMAINS
elemen = s(symbol);i(integer);c(char);t(string);](list)
list = elemen*
4. LATIHAN
Editlah program berikut dan cobalah beberapa Goal !
1. Menuliskan elemen suatu list:
DOMAINS
list = integer*
PREDICATES
tulis_list(list)
CLAUSES
tulis_list([]) :-!.
DOMAINS
list = integer*
cacahan = integer
PREDICATES
cacah(list,cacahan)
CLAUSES
cacah([],0) :-!.
cacah([_:E],Cacahan) :-
cacah(E,Cacah_Ekor),
Cacahan = Cacah_Ekor + 1.
3. Keanggotaan suatu list:
DOMAINS
nama = string
list_nama = nama*
PREDICATES
anggota(nama,list_nama)
CLAUSES
anggota(Nama,[Nama:_]).
anggota(Nama,[_:Ekor]) :-
Anggota(Nama,Ekor).
DOMAINS
List_integer = integer*
PREDICATES
Gabung(list_integer,list_integer,list_integer)
CLAUSES
gabung([],L,L).
gabung([X:L1],L2,[X:L3] :-
gabung(L1,L2,L3).
DOMAINS
Nama = symbol
List_nama = nama*
Nomer = integer
PREDICATES
Elemen_n(list_nama,nomer,nama)
CLAUSES
elemen_n([Kepala:_],1,Kepala) :-!.
elemen_n([_:Ekor],N,Nama) :-
NN = N – 1,
elemen_n(Ekor,NN,Nama).
6. Membalik urutan elemen suatu list:
DOMAINS
Angka = integer
List_angka = angka*
PREDICATES
List_balik(list_angka,list_angka)
Balik(list_angka,list_angka,list_angka)
CLAUSES
list_balik(Awal,Hasil) :-
balik(Awal,[],Hasil).
balik([],Hasil,Hasil) :-!
balik([Kepala:Ekor],List,Hasil) :-
balik(Ekor,[Kepala:List],Hasil).
PREDICATES
data(nama,umur)
jumlah(list_umur,jml,jml)
GOAL
findall(Umur,data(_,Umur),ListUmur,
jumlah(ListUmur,Jml,N),
Rata_rata = Jml/N,
write("Umur rata-rata = ",Rata_rata).
CLAUSES
data("Bonce",18).
data("Donny",20).
data("Adi",21).
data("Dono",220).
jumlah([],0,0).
jumlah([H:T],Jml,N) :-
jumlah(T,Jml1,N1),
Jml = H + Jml1,
N = 1 + N1.
8. List Majemuk:
DOMAINS
clist = l(list);s(symbol);i(integer);c(char);t(string);
list = clist*
PREDICATES
gabung(list,list,list)
GOAL
gabung([s(saya),i(5),c('*'],[t("Anda"),i(10)],Jawaban,
write(Jawaban).
CLAUSES
gabung([],L,L).
gabung([X:L1],L2,[X:L3]) :-
gabung(L1,L2,L3).
5. TUGAS
Buatlah program dalam Turbo Prolog 2.0 yang menggunakan struktur data list untuk:
a. Menuliskan elemen suatu list
b. Menghitung jumlah elemen
c. Keanggotaan suatu list
d. Gabungan dua buah list
e. Membalik urutan elemen suatu list
f. Mendapatkan semua solusi sekaligus
g. List Majemuk:
MODUL XIII
STRUKTUR DATA REKURSIF
1. TUJUAN
Setelah mengikuti praktikum ini mahasiswa diharpkan dapat menggunakan struktur
data rekursif.
2. MATERI
Membaca Isi Data Tree
Membuat Tree
3. TEORI
Pada bagian ini, hanya aturan yang dapat melakukan rekursi. Tetapi sebenarnya data
pun dapat bersifat rekursif. Ini berarti, struktur data tersebut mengandung struktur
data yang sama dengan dirinya sendiri. Sifat rekursif ini juga dimiliki oleh list yang
sudah pernah dipelajari sebelumnya. Struktur data rekursif ini disebut struktur data
pohon (tree).
Sebagai bahan pembahasan, digunakan kembali silsilah keluarga berikut ini:
slamet
amin anang
Kalau ditinjau per titik, maka struktur keluarga tersebut dapat dikatakan sebagai
berikut:
Struktur data pohon seperti di atas dapat dinyatakan dalam Turbo Prolog sebagai:
DOMAINS
nama = string
datatree = tree(nama,datatree,datatree).
Dengan deklarasi seperti di atas, terlihat bahwa struktur tree tersebut tidak terbatas.
Padahal ini tidak benar. Titik budi, badu, didi dan dadi tidak mempunyai cabang lagi.
Oleh sebab itu, dalam mendeklarasikan suatu struktur tree harus diberi penutup
dengan mendeklarasikan suatu keadaan nol (kosong).
DOMAINS
nama = string
datatree = tree(nama,datatree,datatree);kosong
tree(slamet,
tree(amin,
tree(budi,kosong,kosong),
tree(badu,kosong,kosong)),
tree(anang,
tree(didi,kosong,kosong),
tree(dadi,kosong,kosong)))
tree(slamet,
tree(amin,tree(budi,kosong,kosong),tree(badu,kosong,kosong)),
tree(anang,tree(didi,kosong,kosong),tree(dadi,kosong,kosong)))
baca(kosong).
baca(tree(X,Y,Z)):-
a. Membuat Tree
Cara untuk membuat sebuah tree baru dari sebuah data N adalah dengan
menambahkan tree kosong di sebelah kiri dan sebelah kanan data tersebut. Hal ini
dapat dituliskan dengan:
Membuat_tree(N,tree(N,kosong,kosong)).
Untuk membangun sebuah struktur data tree yang lengkap, maka masing-masing tree
tersebut digabungkan. Ada 2 macam penggabungan yaitu penggabungan di sebelah
kiri dan di sebelah kanan.
Untuk menggabungkan sebuah tree X di sebelah kiri tree A dapat dituliskan sebagai:
sisip_kiri(X,tree(A,_,B),tree(A,X,B)).
Misalkan, Anda ingin menggabungkan tree yang terdiri dari budi di sebelah kiri tree
yang terdiri dari amin untuk membentuk struktur yang baru. Untuk melakukan ini,
dapat dituliskan:
sisip_kiri(budi,kosong,kosong),
tree(amin,kosong,kosong),T)
tree(amin,tree(budi,kosong,kosong),kosong).
sisip_kanan(Y,tree(A,B,_),tree(A,B,Y)).
tree(amin,tree(budi,kosong,kosong),tree(badu,kosong,kosong).
4. LATIHAN
Editlah program berikut:
1. Program struktur data tree
DOMAINS
nama = symbol
datatree= tree(nama,datatree,datatree); kosong
PREDICATES
cetak_semua_data(datatree)
CLAUSES
cetak_semua_data(kosong). /* Bila tidak ada data, stop */
cetak_semua_data(tree(X,Y,Z)) :-
write(X),nl,
cetak_semua_data(Y),
cetak_semua_data(Z).
GOAL
cetak_semua_data(tree(slamet,
tree(amin,
tree(budi,kosong,kosong),
tree(badu,kosong,kosong),
tree(anang,
tree(didi,kosong,kosong),
tree(dadi,kosong,kosong)))).
DOMAINS
nama = symbol
datatree= tree(nama,datatree,datatree); kosong
PREDICATES
membuat_tree(nama,datatree)
sisip_kiri(datatree,datatree,datatree)
sisip_kanan(datatree,datatree,datatree)
CLAUSES
membuat_tree(A,tree(A,kosong,kosong)).
sisip_kiri(X,tree(A,_,B),tree(A,X,B)).
sisip_kanan(Y,tree(A,B,_),tree(A,B,Y)).
GOAL
makewindow(1,7,7,"DATA TREE",0,0,15,00),
membuat_tree(budi,Budi),
membuat_tree(badu,Badu),
membuat_tree(didi,Didi),
membuat_tree(dadi,Dadi),
membuat_tree(amin,Amin),
membuat_tree(anang,Anang),
membuat_tree(slamet,Slamet),
sisip_kiri(Budi,Amin,Amn1),
sisip_kanan(Badu,Amn,Amn1),
sisip_kiri(Didi,Anang,Ang),
sisip_kanan(Dadi,Ang,Ang1),
sisip_kiri(Amn1,Slamet,Slm),
sisip_kanan(Ang1,Slm,Slm1),
write(Slm1).
5. TUGAS
a. Buatlah program dengan untuk mencetak semua data dari gambar silsilah berikut!
Edi
Joni Rudi