Professional Documents
Culture Documents
PENDAHULUAN PROLOG singkatan dari PROgramming in LOGic. Bahasa Prolog merupakan bahasa generasi kelima, dibangun atas dasar pemrograman alamiah dan logika. Dari segi teori, pembangunan gagasan pemrograman dengan logika (programming in logic) yang pertama adalah Kowalski di Edinburgh. Kemudian didemonstrasikan secara eksperimental oleh Maarten van Emden juga di Edinburgh, dan diwujudkan oleh Alain Colmerauer (seorang profesor di Universitas Aix, Marseilles, Perancis) dan Philippe Roussel dengan berhasil membuat interpreter Prolog yang pertama bersama kelompoknya the Groupe d'Intelligence Artificielle (GIA) tahun 1972. Kelahiran Prolog sendiri diawali kelika Alain Colmerauer dengan sekelompok peneliti menghadapi masalah penerjemahan bahasa dengan komputer di Montreal. Hal ini akibat hasil karya Noam Chomsky dalam ilmu bahasa alami dengan bahasa komputer. 1. FAKTA Fakta adalah suatu kenyataan atau kebenaran yang diketahui. Fakta menyatakan hubungan (relasi) antara dua obyek atau lebih. Fakta dapat juga menunjukkan sifat suatu obyek. Obyek dapat berupa benda, manusia, hewan, tumbuhan, atau suatu kejadian/peristiwa. Bentuk Umum penulisan fakta di Turbo Prolog: relasi/sifat(argumen/obyek). Penulisan fakta harus diakhiri dengan tanda titik (.). Contoh:
pedas(cabe). orangtua(ahmad,hasan).
Orangtua dan pedas disebut relasi/sifat. Nama relasi, orangtua, disebut juga predikat. Yang berada di dalam [cabe, ahmad, dan hasan] menggambarkan obyek dan
seperti kurung disebut argumen. Predikat boleh tanpa argumen. Jadi predikat dapat dapat dikatakan sebagai nama suatu relasi dan menentukan jenis obyek yang terlibat. Suatu unsur, obyek nyata atau konstanta yang tidak tersusun dari obyek lain disebut atom. Jadi cabe, ahmad, dan hasan merupakan atom-atom.
Page 1 of 12
ARTIFICIAL_INTELLIGENCE_D3
Misalkan terdapat fakta berupa relasi yang diberikan dengan representasi jaringan semantik berikut:
punya istri Siti punya anak
Ahma d
Nani
Iwan
Gani
Dari gambar jaringan semantic di atas, kita bisa mengungkapkan hubungan keluarga dengan satu relasi, misalnya orangtua(X,Y); dan dibaca X adalah orang tua Y. Hubungan ini dituliskan dalam bahasa Prolog:
orangtua(ahmad,wahyu). orangtua(siti,wahyu). orangtua(wahyu,nani). orangtua(wahyu,iwan). orangtua(nani,gani). orangtua(iwan,gina).
Selain relasi orangtua, dapat juga ditentukan realsi lain seperti anak(Y,Z), kakek(Z,S), cucu(L,M), adik(K,L), dan sebagainya. Sehingga diperoleh:
anak(wahyu,ahmad). kakek(ahmad,nani).
Contoh fakta yang berupa sifat: Gula berasa manis Dinyatakan dalam Prolog:
manis(gula).
punya anak
Gina
punya anak
Page 2 of 12
ARTIFICIAL_INTELLIGENCE_D3
2. Aturan Misalkan kita ingin agar bisa menanyakan relasi kakek atau anak dari relasi orangtua tadi, sementara sudah terlanjur menyusun fakta seperti di atas. Mungkin terlintas di fikiran kita untuk membuat saja relasi anak dan kakek sebagai berikut:
anak(wahyu,ahmad). anak(wahyu,siti). anak(nani,wahyu). anak(iwan,wahyu). anak(gani,nani). anak(gina,iwan). kakek(ahmad,nani). kakek(wahyu,gani). kakek(wahyu,gina).
Dengan dmk kita mempunyai 3 jenis predikat untuk menyatakan diagram keluarga itu. Relasi anak disusun terbalik dari fakta untuk relasi orangtua, dan fakta untuk relasi kakek dilacak dari relasi yang ada. Maka kita dapat mengajukan pertanyaan seperti: Siapa anak ahmad? Yang dalam prolog ditulis,
Goal: anak(X,ahmad)
harus huruf besar (karena merupakan variabel), tidak perlu diakhiri dengan tanda titik.
X
Cara penulisan fakta baru seperti itu tentu saja membosankan dan tidak sangkil, apalagi jika kita menghendaki lebih banyak relasi baru ditambah fakta yang ada sangat banyak. Untuk itu digunakan cara lain yaitu dengan membuat aturan, sehingga dapat memperbesar kemampuan program atau meningkatkan daya nalar program, disamping sangat sederhana dan mudah.
Page 3 of 12
ARTIFICIAL_INTELLIGENCE_D3
Untuk membuat suatu aturan kita hanya perlu suatu rumusan logika sebagai berikut. Fakta yang ada memperlihatkan realsi orangtua, maka jika kita ingin menyatakan relasi anak atau kakek, kita harus merumuskan apa hubungan antara orangtua dan anak, juga antara orangtua dan kakek. Secara logika, A anak B, jika B orangtua A Dan A kakek C, jika A orangtua B dan B orangtua C. Jadi, di sini kita mencari rumusan anak dan kakek dengan relasi yang ada yaitu orangtua. Dalam relasi orangtua, aturan relasi untuk anak dalam Prolog ditulis sebagai berikut:
anak(X,Y) if orangtua(X,Y).
Kata if dapat diganti dengan tanda bagi dan minus ( :-), sehingga menjadi:
anak(Y,X) :- orangtua(X,Y).
Dalam aturan di atas ada relasi baru yang perlu ditambahkan, yaitu laki_laki(X), untuk memastikan bahwa X bukan seorang nenek. Kata and dapat diganti dengan tanda koma (,), sehingga menjadi:
kakek(X,Z) :- laki_laki(X), orangtua(X,Y), orangtua(Y,Z).
Klausa (clause) adalah suatu frase (ungkapan) atau susunan kata yang dalam Prolog bisa berupa fakta atau aturan yang
Page 4 of 12
ARTIFICIAL_INTELLIGENCE_D3
diakhiri dengan titik. Klausa dapat merupakan rangkaian upaklausa-upa-klausa dengan and (konjungsi), or (disjungsi) atau if (implikasi). Contoh penggunaan disjungsi dalam suatu aturan berikut:
orangtua(X,Y) :- ibu(X,Y) or ayah(X,Y).
Kata or dapat diganti dengan tanda titik koma (;), sehingga menjadi:
orangtua(X,Y) :- ibu(X,Y); ayah(X,Y).
3. Variabel Argumen suatu predikat dapat berupa konstanta (atom) atau variabel atau bahkan obyek lain. Atom disebut juga obyek nyata (concrete) sedangkan variabel disebut juga obyek umum (general). Suatu atom, variabel atau obyek lain dalam prolog disebut term. Jadi, argumen selalu berupa term. Dalam Prolog terdapat 2 variabel, yaitu: a. Variabel bernama. Yaitu variabel yang diberi nama, seperti: X, Orang, dan sebagainya. Karakter pertama variabel harus huruf besar (capital) atau garis bawah/underscore (_). Jika tidak, Prolog akan menganggap sebagai simbol atau konstanta. Karakter pertama variabel tidak boleh bilangan. Nama variabel juga tidak boleh mengandung suatu karakter khusus, seperti: + (tambah), (kurang), / (bagi), * (kali) dan sebagainya. Contoh pemberian nama variabel yang benar:
Orang Nama_Orang _orang Proyek_01 _Kota
Untuk memudahkan pembacaan program, sebaiknya nama variabel menunjukkan (mengandung) arti yang ditunjuknya. Misalnya:
PendapatanPerKapita GolonganRuangJabatan
Page 5 of 12
ARTIFICIAL_INTELLIGENCE_D3
Dalam mencari jawaban, Prolog melakukan pemadanan (unifikasi). Pada saat pemadanan, variabel akan mendapatkan nilai. Variabel yang belum mendapatkan nilai disebut variabel bebas (free variable) dan variabel yang sudah terikat dengan suatu nilai disebut variabel terikat (bound variable). Keterikatan ini bersifat sementara dan disebut juga instantiasi. Secara sederhana, instantiasi berarti berarti proses pengambilan fakta contoh (instance) dari sekumpulan fakta yang ada dan mengikatkan nilai variabel pada argumen yang sesuai secara sementara (selama belum ada lacak balik). Pada Prolog, keterikatan variabel hanya berlaku pada satu tahap pencarian jawaban. Nilai suatu variabel tidak dapat dimanfaatkan klausa lain tanpa adanya pemadanan dengan variabel yang dipakai klausa lain tersebut. b. Variabel tak bernama (anonymuous variable) Variabel tak bernama dilambangkan dengan tanda garis bawah/underscore (_). Variabel ini digunakan untuk suatu nilai yang diabaikan. Jadi, variabel ini tidak pernah akan terikat. Jika dipadankan dengan suatu nilai, variabel ini tidak pernah menyebabkan kegagalan, atau selalu sepadan (match).
Contoh:
direktur(heru, keuangan). direktur(joko, produksi). direktur(syarif, umum). direktur(didin, operasional).
Jika ingin menanyakan siapa saja yang jadi direktur, dengan mengabaikan direktoratnya, dalam Prolog ditulis:
direktur(Orang,_).
hal
itu?
Bagaimana
pula
hasil
Page 6 of 12
ARTIFICIAL_INTELLIGENCE_D3
Varibel ini juga bisa dipakai untuk menyatakan kata setiap/semua, seperti: setiap orang mempunyai nama, dalam Prolog ditulis:
memiliki(_,nama).
4. Match Match atau serasi/sepadan dalam Prolog mengandung beberapa arti dalam perbandingan fakta, yakni: a. Struktur fakta yang sama/identik
orangtua(ali,husein) sepadan/identik orangtua(ali,husein).
dengan
dengan
orangtua(ali,husein).
Di sini, X akan terikat dengan husein bila X masih bebas. Jika X sudah terikat, misalnya dengan husein, maka kedua klausa di atas masih match. Ttp jika sudah terikat dengan nilai lain, tidak akan match atau gagal (fail).
dengan
orangtua(Y,husein).
Kedua variabel X dan Y masih bebas, maka akan terjadi penyatuan,n yakni jika nanti Y mendapat nilai, maka nilai itu pula yang dikandung X, demikian pula sebaliknya. Keterikatan ini disebut pula dengan freesharing variables, yakni keduanya masih bebas dan merupakan satu variabel. 5. Struktur Program Lazimnya, struktur program Turbo Prolog terdiri dari beberapa bagian pokok:
-
Bagian lain dari struktur program Turbo Prolog: Constants, Global dan petunjuk compiler.
Database,
Page 7 of 12
ARTIFICIAL_INTELLIGENCE_D3
Domains
Bagian domain berisi deklarasi tipe/jenis data, jadi seperti deklarasi type dalam Pascal. Di bagian ini, kita menyatan jenis suatu variable atau argument. Contoh:
Domains NamaOrang Alamat PanjangSisi LuasLingkaran L_alamat = = = = = symbol string integer real alamat*
Deklarasi L_alamat = alamat* menyatakan bahwa L_alamat merupakan list dari alamat. Jika ada dua domain sejenis, maka cara menulisakannya dipisahkan dengan tanda koma (,). Contoh: Alamat, Jabatan = string Deklarasi domain di atas digunakan untuk predikat misalnya
data(NamaOrang,Alamat)
Domain dalam suatu predikat adalah milik argument pada posisi yang ditempati domain dalam predikat tersebut. Deklarasi domain membedakan suatu domain buatan (yang dideklarasikan) dari domain buatan yang lain, meskipun berasal dari domain standar yang sama. Jika kita tidak menggunakan domains sendiri, kita hanya boleh menggunakan domain standar, seperti:
data(string,string)
Domain standar (baku) Turbo Prolog adalah sebagai berikut: a. symbol Berupa rangkaian huruf asalkan karakter pertama berupa huruf kecil, angka, dan garis bawah serta tidak mengandung spasi/karakter khusus. b. string Rangkaian karakter yang diapit dalam tanda petik ganda (). Panjang maksimum sebuah string adalah 255 karakter. Jika string tersebut dari file atau terkandung dalam program, bisa mencapai 64 kByte. Contoh suatu string:
Fakultas Ilmu Komputer UNIKU
c. integer Bilangan bulat : -32.768 sampai dengan 32.767. Bilangan bulat basis 16 (hexadecimal) diawali dengan tanda dolar ($).
Page 8 of 12
ARTIFICIAL_INTELLIGENCE_D3
d. real Bilangan riil : 1 x 10-307 sampai dengan 1 x 10-308 (1e-307 sampai dengan 1e-308). Jika bilangan bulat diberikan pada argument riil, maka akan langsung diubah ke riil.
Predicates
Predikat harus dideklarasikan pada bagian Predicates dan mendefinisikannya dalam bagian Clauses. Jika tidak, Turbo Prolog tidak akan mengenalnya. Nama predikat harus diawali dengan huruf, boleh huruf besar (tidak dianjurkan) atau huruf kecil, selebihnya bisa huruf, angka, atau garis bawah. Nama predikat tidak boleh mengandung spasi, tanda minus, asterisk atau garis miring. Deklarasi predikat dalam bagian Predicates harus juga disertai argument jika memang berargumen. Jumlah argument dalam predikat disebut aritas (arity). Satu predikat boleh memiliki aritas yang berbeda asal harus dikelompokkan dalam bagian clausesnya.
anggota(Nama) anggota(Nama,Alamat)
Jenis argument suatu predikat boleh memiliki domain yang berbeda, seperti:
anggota(nomor,alamat) anggota(nomor,nama)
Predikat yang sudah didefinisikan berargumen X dengan domain Xd tidak dapat mengalihkan nilai (nilai X) untuk argument predikat lain dengan domain Yd meskipun Xd dan Yd berdomain standar sama.
Domains anggota = string nama = string nomor = integer Predicates menu(nomor,nama) tulis(anggota) clauses menu(No,Nm):-tulis(Nm),
Program ini salah karena Nm dalam predikat menu berdomain nama, sedangkan dalam predikat tulis berdomain anggota. Untuk itu salah satu predikat harus berdomain lebih dari satu, menjadi seperti:
menu(nomor,nama) menu(nomor,anggota)
Bagian predikat harus ada selama kita membutuhkan predikat bukan standar.
Page 9 of 12
ARTIFICIAL_INTELLIGENCE_D3
Clauses
Merupakan inti program Turbo Prolog. Boleh juga tanpa Clauses tapi tentunya goal hanya terdiri dari predikat standar. Jika ada bagian Clauses harus ada bagian Predicates begitu juga sebaliknya. Sekumpulan klausa dari predikat yang sama harus disatukan (dikelompokkan) dalam bagian Clauses dan disebur prosedur (procedure). Bila melakukan pemanggilan klausa atau matching, Turbo Prolog melacaknya dari atas ke bawah. Jika Prolog menemukan bandingan atau kalusa yang match, Prolog mencatat tempat ditemukannya. Dengan demikian, urutan prosedur harus benar untuk menjaga agar Turbo Prolog dapat mencari jawaban dengan benar dan juga menentukan kecepatan eksekusi program.
Goal
Goal dalam Turbo Prolog ada dua macam: a. Goal eksternal (external goal) Merupakan goal yang diketikkan langsung pada prompt Goal: di jendela Dialog pada compiler terpadu Turbo Prolog. b. Goal internal (internal goal) Goal ini diketikkan pada bagian Goal di dalam program Turbo Prolog. Hakekatnya goal ini sama seperti tubuh suatu kalusa atau dalam hal ini aturan, yang hanya terdiri dari satu atau lebih upa-goal, tanpa kepala, karenanya tidak menggunakan if (:-). Cara menuliskan goal contoh:
Goal write(Tulis kalimat apa saja, kemudian Enter\n), readln(X), write(X),
Prolog selalu berusaha agar goal bisa tercapai, dan sebaliknya kita pun berusaha agar program berhenti dalam keadaan berhasil.
Komentar
Komentar satu baris digunakan tanda persen (%). Sedangkan untuk komentar yang lebih dari satu baris digunakan paduan tanda garis miring (/) dan asterisk (*). Contoh:
% % ini komentar satu baris, baris pertama ini komentar satu baris, baris kedua
Page 10 of 12
ARTIFICIAL_INTELLIGENCE_D3
/* * * * * /* */
akhir komentar */ ini komentar bersarang (nested) /* komentar dalam komentar adalah seperti ini */
Dengan goal internal ini, sekali goal tercapai, Prolog tidak mencari alternative jawaban yang lain, berbeda dengan goal eksternal yang selalu berusaha mencari jawaban lain sampai habis (jika goal yang diajukan berupa fakta). Bagian constants disediakan untuk mendeklarasikan nilai konstanta yang biasanya dipakai berulang-ulang. Dibagian ini kita memberi nama secara simbolik pada suatu konstanta dengan format: nama_simbolik = definisi_konstanta Dalam constants, harus ada satu deklarasi dalam satu baris. constants part_1 pi = $3D8 = 3.141592653
seratus = (10 * (10-1) + 10) Beberapa kendala dalam penggunaan konstanta: 1. Definisi konstanta tidak boleh memanggil dirinya, misalnya: Sistem tidak bersifat case sensitive. Jika nama konstanta no_ini = 2 * no_ini / 2
2.
digunakan dalam klausa, huruf pertamanya harus huruf kecil (dalam deklarasi boleh menggunakan huruf besar) untuk menghindari kekeliruan antara nama konstanta dengan nama peubah.
3.
4.
Boleh ada lebih dari satu bagian constants di dalam program, Nama konstanta bersifat global dan hanya dapat sekali
Page 11 of 12
ARTIFICIAL_INTELLIGENCE_D3
Page 12 of 12