Anda di halaman 1dari 53

PERTEMUAN I

DASAR-DASAR PROLOG

1. TUJUAN :
Mahasiswa diharapkan dapat menggunakan dasar-dasar pemrograman Prolog

2. MATERI
 Fakta dan Relasi
 Aturan
 Pertanyaan (Query)

3. TEORI

1. Fakta dan Relasi


Bahasa pemrograman prolog terdiri dari kumpulan data-data obyek yang merupakan
suatu fakta. Karena fakta menunjukkan suatu keadaan atau situasi nyata maka fakta selalu
benar (True).
Dalam Prolog, fakta dapat dibedakan menjadi 2 macam, yaitu :
 Menunjukkan relasi
 Menunjukkan milik/sifat

Sebagai contoh, sebuah fakta mengatakan :

Slamet adalah ayah Amin

Dalam bahasa Prolog, hal ini dituliskan sebagai :

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

Sedangkan sebuah fakta :

Anita adalah seorang wanita

Dapat dituliskan dalam Prolog sebagai :

Wanita(anita).

Hal ini menunjukkan bahwa Anita bersifat sebagai seorang wanita.


2. Aturan (Rules)
Aturan adalah suatu pernyataan yang menunjukkan bagaimana fakta-fakta berinteraksi
satu dengan yang lain untuk membentuk suatu kesimpulan. Sebuah aturan dinyatakan
sebgai kalimat bersyarat. Misalnya, ada sebuah fakta :

Tino suka apel

Dan ada sebuah aturan yang berbunyi :

Yuli suka sesuatu yang disukai Tino

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

Sedangkan aturan tersebut dapat dinyatakan juga sebagai :

Yuli suka sesuatu jika Tino suka sesuatu itu juga

Dan ini dituliskan sebagai :

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 :

Apakah Tini suka boneka?

Dalam Prolog, pertanyaan ini dituliskan sebagai :

Suka(tini,boneka).

Pertanyaan ini sesuai dengan fakta yang ada, maka Prolog akan memberikan jawaban :

Yes (yang berarti benar)

Sedangkan jika diberikan pertanyaan :

Suka(tini,mobil-mobilan).

Maka Prolog akan menjawab :

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 :

Apakah yang disukai oleh Tini?

Dalam Prolog, pertanyaan ini dituliskan sebagai :

Suka(tini,Apa).

Prolog akan mencoba mencari jawaban dari fakta yang ada dan akan memberikan
jawaban :

Apa = boneka

Bila kita mengajukan pertanyaan :

Siapakah yang suka boneka?

Dalam Prolog dituliskan :

Suka(Siapa,boneka).

Prolog akan memberikan jawaban :

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.

2. Ada sebuah pernyataan berbunyi :


Arman akan pergi menonton film jika punya uang dan hari cerah.
Tuliskan pernyataan tersebut dalam bahasa Prolog.
Apa yang terjadi kalau ternyata hari itu hujan turun?

3. Tuliskan aturan berikut ini dalam bahasa Prolog.


 Seseorang dikatakan mempunyai sakit tifus apabila ia mempunyai gejala-gejala:
demam, sakit perut, badan lemas.
 Seseorang dapat didakwa sebagai pembunuh apabila ia dicurigai, sidik jarinya
ditemukan di tempat kejadian dan ia tidak mempunyai alibi(alasan untuk
menyangkal tuduhan).
MODUL II
STRUKTUR PROGRAM PROLOG

Tujuan : Mahasiswa dapat menggunakan bahasa struktur pemrograman Prolog.

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

Predikat dari fakta tersebut dituliskan sebagai :

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

Syarat-syarat penulisan nama predikat :


 Harus diawali dengan huruf kecil dan dapat diikuti dengan huruf, bilangan atau garis
bawah.
 Panjang nama predikat maksimum 250 karakter.
 Tidak diperbolehkan menggunakan spasi, tanda minus, tanda bintang dan garis
miring.

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

Contoh penulisan klausa yang salah :

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.

Ada 2 jenis goal, yaitu :


 Goal eksternal Goal yang diberikan melalui compiler terpadu Turbo Prolog (di luar
program) dan dituliskan dalam jendela Dialog.
 Goal internal Goal yang dituliskan sekaligus dalam program sehingga setiap kali
program tersebut dieksekusi, kita tidak perlu lagi menuliskan goal
yang anda inginkan.

Latihan
Buatlah program dalam bahasa prolog menggunakan struktur pemrograman prolog dari
silisilah berikut :

slamet

amin anang

badu budi didi dadi


MODUL III
VARIABEL DAN GOAL MAJEMUK

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 :

Siapakah ayah Didi?

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

3.2. Goal Majemuk


Kita dapat menuliskan Goal yang terdiri dari lebih satu pernyataan. Bagian goal tersebut
disebut sub goal. Contoh berikut ini adalah program yang memuat daftar merk mobil
dengan warna dan harga tertentu. Untuk memudahkan, harga dituliskan dalam jutaan.

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 :

Ayah(Ayah,amin) dengan ayah(slamet,amin)

Contoh berikut ini tidak akan terjadi unifikasi :

Ayah(slamet) dengan ayah(slamet,amin)

Karena mempunyai jumlah argumen yang tidak sama, walaupun mempunyai nama relasi
yang sama.

3.2. PROSES PENCARIAN JAWABAN


Proses pencarian jawaban dalam Turbo Prolog dilakukan dengan cara pemadanan.
Bagaimana caranya Turbo Prolog mendapatkan jawaban dari Goal yang kita berikan?
Kita tinjau kembali suatu Goal:

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 :

Kakek(Kakek,budi) ----- kakek(Kakek,Cucu)


Variabel Cucu akan terikat menjadi budi dan Turbo Prolog akan mencari nilai variabel
Kakek dengan membuktikan apakah semua pernyataan (subgoal) di dalam aturan tersebut
benar.
Pernyataan yang pertama:

Ayah(Ayah,Cucu) ----- ayah(Ayah,budi)

Untuk membuktikan kebenaran pernyataan diatas, Turbo Prolog mencari padanan dengan
fakta yang ada mulai dari yang teratas, hingga ditemukan :

ayah(Ayah,budi) ----- ayah(amin,budi)

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:

ayah(Kakek,Ayah) ----- ayah(slamet,amin)

Prolog akan mencari padanan kembali dan akhirnya menemukan:

ayah(Kakek,amin) ----- ayah(slamet,amin)

sehingga variabel Kakek terikat menjadi slamet.

Pada aturan kakek, hanya nilai variabel Kakek yang dityeruskan sedangkan nilai variabel
Ayah tidak diperlukan.

kakek(Kakek,budi) ----- kakek(slamet,budi)

Berarti jawaban akhir adalah:

Kakek = slamet

4. LATIHAN

Tulislah program dalam bahasa Prolog berikut ini :

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 adalah kakek Cucu */

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.

3.2. Runut Balik (Backtracking)


Dalam mencari jawaban suatu persoalan, seringkali kita tidak menemukan jawaban
yang kita inginkan. Tentu saja kita berusaha untuk mencoba kemungkinan jawaban
yang lain dengan kembali ke awal dan mengikuti kembali cara (prosedur) yang sama
dengan sebelumnya. Cara runut balik ini kita lakukan berulang kali sampai jawaban
yang kita inginkan dapat ditemukan atau sampai semua kemungkinan jawaban telah
habis dicoba. Begitu pula dengan Turbo Prolog, Ia melakukan cara yang sama dalam
mencari jawaban suatu persoalan. Apabila terdapat beberapa kemungkinan jawaban,
Turbo Prolog akan mencoba kemungkinan jawaban tersebut satu per satu sampai
jawaban didapatkan atau sampai semua kemungkianan jawaban dicoba.

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

/* Andi suka kue yang rasanya manis */

suka(andi,Kue) :-
kue(Kue), rasa(Kue,manis).

 Lakukan proses runut balik dengan memasukkan GOAL:

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.

Ada 2 fungsi argumen predikat jadi :


Untuk meneruskan nilai yang ditentukan dalam program ke predikat jadi untuk diolah
(input). Variabel dalam predikat tersebut harus variabel terikat.
Untuk meneruskan nilai yang didapat oleh predikat jadi ke dalam program (output).
Variabel dalam predikat tersebut harus variabel bebas.

3.1. Predikat Keluaran


Turbo Prolog 2.0 mempunyai 3 buah predikat keluaran, yaitu: write, writef dan
writedevice. Bila belum diubah (default), maka sebagai piranti (device) keluaran adalah
layar monitor (screen).

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.

Contoh sebuah klausa:

tes :-
write(“Saya sedang belajar Prolog.”),
write(“Teman Saya belajar Basic”).

Akan menghasilkan tampilan di layar monitor:

Saya sedang belajar Prolog. 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”).

Dan akan menghasilkan tampilan:

Saya sedang belajar Prolog.


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)

dengan variabel format mempunyai bentuk: %-m.pf.


-- : menghasilkan tulisan rapat kiri.
m : menunjukkan lebar tulisan minimum (optional)
p : menunjukkan jumlah angka desimal (optional)
f : format lain yang diinginkan (optional)

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.

Operator perbandingan yang dikenal di Turbo Prolog 2.0:


Simbol Arti
= Sama dengan
< Kurang dari
<= Kurang dari atau sama dengan
> Lebih dari
>= Lebih dari atau sama dengan
<> atau >< Tidak sama dengan

3.2 Operator Sama Dengan


Operator sama dengan (‘=’) mempunyai arti yang sedikit berbeda dengan bahasa
lainnya. Ada 2 buah fungsi yang dapat dilakukan oleh operator sama dengan, yaitu
sebagai operator perbandingan dan sebagai tanda permuatan suatu harga.
Perhatikan contoh berikut ini :

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.

Bila program tersebut dikompilasi dan dieksekusi, akan memberikan hasil:

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

3.3. Operasi Arirmatika


Pernyataan arirmatika terdiri dari operand (bilangan atau variabel), operator dan tanda
kurung (bila diperlukan).
Ada 6 buah operator aritmatika, yaitu :
+ : operator penjumlahan
- : operator penngurangan
* : operator perkalian
/ : operator pembagian
div : operator hasil bagi bulat
mod : operator sis hasil bagi

3.4. Fungsi Matematika


Disamping mempunyai kemampuan dalam perhitungan aritmatika, Turbo Prolog 2.0
juga dilengkapi dengan predikat jadi yang merupakan fungsi matematika (fungsi
aljabar, trigonometri, logaritma).
Fungsi-fungsi tersebut dapat dilihat pada tabel berikut ini:
Fungsi Arti
abs(X) Harga mutlak dari X
cos(X) Cosinus X (radian)
sin(X) Sinus X (radian)
tan(X) Tangen X (radian)
arctan(X) Arctangen X (X dalam real) dan hasilnya dalam radian
exp(X) Bilangan e (2.18) pangkat X
ln(X) Logaritma X dengan bilangan dasar e
log(X) Logaritma X dengan bilangan dasar 10
sqrt(X) Akar kuadrat X
round(X) Pembulatan X ke integer terdekat
trunc(X) Hilangkan angka desimal

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

3.1 Predikat Fail


Turbo prolog 2.0 akan melakukan runut balik apabila menemui kondisi gagal (gagal
dalam mencari jawaban dari suatu subgoal). Hal ini bisa dilakukan dengan menggunakan
predikat standar fail.
Predikat fail mempunyai sifat tidak pernah benar. Sifat ini dapat diidentikan dengan suatu
kesamaan aritmatika:

2 = 3 (apakah 2 = 3) ?

Sehingga sebenarnya predikat fail dapat digantikan dengan pernyataan aritmatika


tersebut.
Apabila dalam suatu klausa terdapat fail, maka predikat (subgoal) sesudah predikat fail
tidak akan pernah dieksekusi oleh Turbo Prolog 2.0.

3.2 Predikat Cut ( ! )


Predikat cut ( ! ) digunakan untuk menghalangi terjadinya runut balik. Predikat cut selalu
benar dan bila predikat cut telah dilewati maka tidak akan mungkin untuk melakukan
runut balik ke subgoal sebelum predikat cut dalam klausa yang sedang dieksekusi.

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!

/* Program Penggunaan 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!

b. Buatlah program berikut yang merupakan penggunaan dari predikat cut!

/* Program Penggunaan Predikat cut */

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

Faktorial dari bilangan N dapat dirumuskan sebagai:


 Bila N adalah 1, maka faktorialnya sama dengan 1.
 Bila Tidak, carilah faktorial dari N-1 dan kemudian kalikan dengan N.

Perumusan untuk mendapatkan nilai faktorial suatu bilangan dituliskan sebagai berikut:

/* Contoh program faktorial dengan menggunakan rekursi */

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)

Dan eksekusi dilanjutkan pada subgoal

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.

3.2. Rekursi Ekor


Metode rekursi memiliki suatu kelemahan, yaitu menghabiskan banyak lokasi memori
untuk menyimpan stack frame, apalagi bila rekursi harus dilakukan banyak sekali.
Memori komputer hanya dapat menampung paling banyak 4000 stack frame. Itu berarti
hanya dapat menampung paling banyak 4000 kali pengulangan.
Untuk mengatasi masalah ini, digunakan metode rekursi ekor (tail recursion). Pada
rekursi ekor, tidak diperlukan lagi penyimpanan informasi di stack frame karena pada
waktu memanggil dirinya sendiri, informasi tersebut telah diikutsertakan juga dalam
bentuk variabel.

Syarat penggunaan metode rekursi ekor:


Subgoal yang memanggil dirinya sendiri diletakkan pada bagian akhir klausa tersebut.
Tidak ada titik runut balik di dalam klausa tersebut.

Berikut ini adalah program untuk menghasilkan deret dengan pertambahan 1.

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

c. Bila di dalam klausa tersebut terdapat subgoal yang mempunyai


beberapa alternatif jawaban (yang memungkinkan terjadinya runut balik).

deret3(N) :-
write(N," "),
NN = N + 1,
Cek(NN),
Deret3(NN).

cek(X) :- X >= 0
cek(X):- X < 0

3.3 Cara Mengatasi Masalah Pada Rekursi Ekor.


Masalah yang terjadi pada rekursi ekor yang menyebabkan tidak terjadinya rekursi ekor
dapat diatasi dengan menggunakan predikat cut (!). Predikat cut menyebabkan Turbo
Prolog 2.0 tidak dapat melakukan runut balik ke subgoal sebelumnya.
Dengan demikian Turbo Prolog 2.0 sudah tidak melihat adanya kemungkinan lain yang
dapat dicoba sehingga rekursi yang terjadi benar-benar merupakan rekursi ekor yang
tidak menghabiskan memori.

Contoh program deret3 dapat diperbaiki dengan menambahkan predikat cut.

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.

3.4 Penggunaan Variabel pada Rekursi


Perhatikan contoh program deret, dalam contoh tersebut digunakan variabel baru NN.
Lain halnya dalam bahasa bersifat prosedural, pernyataan tersebut dapat dituliskan
dengan :

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

 Buatlah program faktorial dengan menggunakan


rekursi ekor!
MODUL X
PREDIKAT REPEAT

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!

1. Tidak menggunakan predikat repeat:

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

/* Program Logon menggunakan predikat 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 Obyek Tunggal


Obyek tunggal terdiri dari Variabel dan Konstanta.

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

Ada 2 cara menyatakan suatu konstanta:


 Dengan menuliskan secara langsung:
‘a’ ‘A’
‘@’ ‘[‘
‘1’ ‘J’

 Dengan didahului karakter escape (\):


Bila kita ingin menyatakan karakter yang sudah mempunyai arti
(digunakan) oleh Turbo Prolog 2.0, misalnya:
‘\”’ : tanda petik ganda
‘\\’ : garis miring balik
‘\’’ : tanda petik tunggal
b. Bilangan
Ada 2 jenis data yang menyatakan bilangan yaitu integer(bilangan bulat) dan
real (bilangan nyata). Bilangan integer dapat menyatakan bilangan antara
-32.768 sampai +32.767 sedangkan bilangan real dapat menyatakan bilangan
antara + 1.E-308 sampai + 1.E+308 (10-308 sampai 10308).
c. Atom
Ada 2 jenis data yang menyatakan atom, yaitu symbol dan string. Kedua jenis
data ini dapat saling dipertukarkan. Artinya, Anda dapat menuliskan sebagai
atom symbol untuk domains string dan sebaliknya Anda dapat menuliskan
sebagai atom string untuk domains symbol.

Perbedaan antara symbol dan string adalah:


 Symbol diawali dengan huruf kecil dan hanya terdiri dari satu kumpulan
karakter, contoh:
Saya, a, makanan_kecil, kota_surabaya
 String diapit oleh tanda petik ganda dan dapat berisi karakter apa saja,
contoh:
“Kota Surabaya”, “Saya”, “Jl. Serayu No. 20”

3.2 Obyek Majemuk


Dalam obyek data majemuk, Anda dapat menyatakan beberapa informasi data sebagai
suatu data tunggal. Misalnya, Anda ingin menyatakan data tanggal 10 Nopember 2005.
Hal ini dapat dituliskan sebagai:

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)

Dengan alamat dan tgl_lahir merupakan obyek data majemum juga.

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.

3.2.1 Unifikasi pada Obyek Data Majemuk


Dalam proses unifikasi, obyek majemuk dapat berpadanan dengan variable
tunggal atau dengan obyek majemuk. Misalnya:

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(“Jl. Banteng 10”,”Jakarta”,”10110”)

Tidak akan berpadanan dengan:

Alamat(Jalan,Kota)

3.2.2 Menyatakan Domain Obyek Data Majemuk


Sama halnya seperti onyek data tunggal, dalam program, obyek data majemuk
juga harus dinyatakan di bagian DOMAINS. Yang dituliskan pada bagian ini
adalah semua argument baik argument yang berupa data majemuk maupun
argumen yang merupakan data tunggal. Misalnya:

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

3.2.3 Deklarasi Domain Majemuk


Argumen sebuah predikat mungkin mempunyai domain yang berbeda. Untuk ini,
Anda tidak bisa menyatakan domain tersebut secara langsung berupa domain
standar(integer, char atau string) tetapi harus melalui functor.
Misalkan, argument sebuah predikat yang menyatakan harga barang dapat
mempunyai domain integer, real atau string. Ketiga macam domain tersebut harus
dideklarasi untuk masing-masing predikat dengan domain yang berbeda.

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

data_pribadi("Andi",alamat("Jl. Singosari 101","Bandung","40113"),


tgl_lahir(20,"Oktober",1980),"Mahasiswa").

data_pribadi("Amran",alamat("Jl. Gajahmada 123","Palembang","30123"),


tgl_lahir(27,"Maret",1981),"Sekretaris").

--- Tambahkan fakta-fakta sebanyak 10 data ---

 Editlah program berikut di atas dan cobalah beberapa Goal berikut ini serta
perhatikan penggunaan variable tak bernama!

 Tampilkan data pribadi seseorang (misalnya Andi)!


 Siapakah yang tinggal di kota tertentu (misalnya Bandung)!
 Sipa dan dimana alamat orang-orang yang lahir pada bulan tertentu (misalnya
bulan Januari)!
 Sipakah yang tinggal di Kota X dan mempunyai pekerjaan sebagai Y!

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

data_pribadi("Andi",alamat("Jl. Singosari 101","Bandung","40113"),


tgl_lahir(20,"Oktober",1980),"Mahasiswa").

data_pribadi("Amran",alamat("Jl. Gajahmada 123","Palembang","30123"),


tgl_lahir(27,"Maret",1981),"Sekretaris").

…………………

…………………

/* Lama tinggal dalam tahun */

………………..

………………..

/* Seseorang dikatakan menjadi penduduk, apabila sudah tinggal di kota


tersebut lebih dari 2 tahun */

………………..

………………..

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:

Kepala dari [1,2,3] adalah 1


Ekor dari [1,2,3] adalah [2,3]

Misalkan sebuah list yang hanya terdiri dari 1 elemen:

Kepala dari [a] adalah a


Ekor dari [a] adalah [] (list kosong)

3.1 Menyatakan List


List harus dinyatakan dalam bagian DOMAINS dan dituliskan dengan tanda bintang
(*).

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.

3.2 Operasi List


a. Menuliskan Elemen List
Perumusan:
Untuk menuliskan elemen suatu list, tuliskan kepalanya (sebagai elemen tunggal)
kemudian tuliskan ekornya(berupa list yang lain).
Contoh:

tulis_list([]) :-!.

tulis_list([K:E]) :- /*K : kepala, E : ekor */


write(K), nl,
tulis_list(E).

b. Menghitung Jumlah Elemen


Perumusan:
Jumlah elemen dari [] sama dengan 0. Jumlah elemen suatu list sama dengan 1
ditambah jumlah elemen ekornya.
Contoh:

cacah([],0) :-!.

cacah([_:E],Cacahan) :-
cacah(E,Cacah_Ekor),
Cacahan = Cacah_Ekor + 1.

c. Keanggotaan Suatu List


Aturan digunakan untuk memeriksa apakah suatu konstanta (bilangan,karakter
atau atom) terdapat dalam suatu list.
Perumusan:
Suatu Nama adalah anggota dari list:
 Bila Nama merupakan kepala dari list tersebut.
 Atau Nama adalah anggota dari list tersebut.

Contoh:
anggota(Nama,[Nama:_]).

anggota(Nama,[_:Ekor]) :-
Anggota(Nama,Ekor).

d. Gabungan Dua Buah List


Perumusan:
List3 adalah gabungan dari List1 dan List2:
 Bila List1 kosong maka List3 sama dengan List2.
 Bila tidak ada list kosong, maka Anda dapat membentuk List3 dengan cara
menjadikan kepala List1 sebagai Kepala List3 dan ekor List3 merupakan
gabungan dari ekor List1 dan List2.

Contoh:

gabung([],L,L).

gabung([X:L1],L2,[X:L3] :-
gabung(L1,L2,L3).

e. Mencari Elemen ke N dalam Suatu List


Perumusan:
 Bila N = 1, maka Elemen tersebut sama dengan Kepala List
tersebut.
 Bila tidak, ambillah sejumlah N-1 elemen terdepan, maka
Kepala list sisanya adalah elemen yang dicari.

Contoh:

CLAUSES

elemen_n([Kepala:_],1,Kepala) :-!.

elemen_n([_:Ekor],N,Nama) :-
NN = N – 1,
elemen_n(Ekor,NN,Nama).

f. Membalik Urutan Elemen Suatu List


Perumusan:
Letakkan Kepala ditempat Ekor List yang dibalik hingga elemen yang terakhir.

Contoh:

CLAUSES
list_balik(Awal,Hasil) :-
balik(Awal,[],Hasil).

balik([],Hasil,Hasil) :-!

balik([Kepala:Ekor],List,Hasil) :-
balik(Ekor,[Kepala:List],Hasil).

3.3 Mendapatkan Semua Solusi Sekaligus


Misalkan terdapat data pribadi yang berisi data umur. Kemudian Anda ingin
menghitung umur rata-rata dari orang-orang tersebut. Anda tidak dapat melakukan
dengan cara sebagai berikut:
Ambil data umur.
Jumlahkan dengan jumlah umur sebelumnya.
Lakukan rekursi ekor ke ambil data umur.
Bila semua data sudah dihitung, keluar dari klausa.
Karena dalam melakukan rekursi ekor, tidak boleh ada titik runut balik di dalamnya.

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.

3.4 List Majemuk


Seperti yang telah dijelaskan bahwa elemen-elemen dalam suatu list haruslah
mempunyai jenis data yang sama. Misalkan: [1,3,6.5,”Anda”] merupakan pernyataan
yang salah.
Tetapi dengan cara khusus masih dapat menangani list yang mempunyai elemen
dengan jenis data yang berbeda-beda (list majemuk). Caranya yaitu dengan
menggunakan functor karena domains dapat mengandung lebih dari satu jenis data
sebagai argument terhadap functor.
Contoh berikut bagaimana menyatakan domain dari suatu list yang dapat terdiri dari
integer, symbol,karakter,string atau list yang lain dengan jenis data yang bermacam-
macam pula.

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([]) :-!.

tulis_list([K:E]) :- /*K : kepala, E : ekor */


write(K), nl,
tulis_list(E).

2. Menghitung jumlah elemen:

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

4. Gabungan dua buah list:

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

5. Mencari elemen ke N dalam suatu list:

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

7. Mendapatkan semua solusi sekaligus:


DOMAINS
jml,umur = integer
list_umur = integer*
nama = string

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

badu budi didi dadi

Kalau ditinjau per titik, maka struktur keluarga tersebut dapat dikatakan sebagai
berikut:

Titik slamet terdiri dari 2 data yaitu amin dan anang.


Titik amin terdiri dari 2 data yaitu badu dan budi.
Titik anang terdiri dari 2 data yaitu didi dan dadi.
Titik budi, badu, didi dan dadi terdiri dari 0 data.

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

Silsilah keluarga tersebut dapat dituliskan sebagai:

tree(slamet,
tree(amin,
tree(budi,kosong,kosong),
tree(badu,kosong,kosong)),

tree(anang,
tree(didi,kosong,kosong),
tree(dadi,kosong,kosong)))

Untuk lebih menghemat tempat, dapat pula dituliskan:

tree(slamet,
tree(amin,tree(budi,kosong,kosong),tree(badu,kosong,kosong)),
tree(anang,tree(didi,kosong,kosong),tree(dadi,kosong,kosong)))

3.1 Membaca Isi Data Tree


Salah satu operasi yang sangat sering dilakukan terhadap suatu struktur data
adalah membaca data tersebut. Setelah data dibaca, maka data tersebut dapat diolah,
misalkan untuk mencari data tertentu, menghapus, mengurutkan, dan lain-lain. Pada
struktur data tree, hal ini disebut traversing tree.

Cara yang digunakan adalah:


Bila tree tersebut kosong, jangan mengerjakan sesuatu.
Bila tidak, baca titik(node), kemudian lanjutkan membaca tree sebelah kiri, kemudian
tree sebelah kanan. Cara yang digunakan untuk membaca tree sebelah kiri adalah
sama dengan membaca tree setingkat diatasnya.

Dalam prolog cara diatas dapat dituliskan sebagai:

baca(kosong).
baca(tree(X,Y,Z)):-

kerjakan sesuatu pada X,


baca(Y),
baca(Z).
Cara tersebut disebut dept-first search karena mencari sejauh mungkin (sampai habis)
pada satu cabang, kemudian baru melanjutkan ke cabang lain.

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)

dan tree T akan berisi:

tree(amin,tree(budi,kosong,kosong),kosong).

Sedangkan untuk menggabungkan sebuah tree Y di sebelah kanan tree A, dapat


dituliskan sebagai:

sisip_kanan(Y,tree(A,B,_),tree(A,B,Y)).

Misalkan tree yang mengandung badu digabungkan dengan tree T:

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

2. Program membuat struktur data tree

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 dari masing-masing data tunggal */

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

/* menyisipkan tree mulai 1 tingkat dari bawah */

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

Dono Doni Arman Ardi

danang deni Eko Badu

b. Buatlah program untuk menyisipkan data pada struktur tree diatas!


MODUL XIV
SISTEM PAKAR
(EXPERT SYSTEM)

Anda mungkin juga menyukai