Prolog alias bahasa pemrograman logika atau bisa disebut juga bahasa non-procedural. Bahasa pemrograman ini diluncurkan pada tahun 1972 oleh Alain Colmerauer dan Robert Kowalski dalam rangka menciptakan logika sebagai rangkaian perintah untuk dijalankan oleh komputer. Nama PROLOG sendiri berasal dari bahasa Perancis, Programmation en logique (pemrograman logika). Dalam perkembangannya, Prolog sudah dikombinasikan dalam berbagai bahasa pemrograman, terutama fungsional programing.
Ciri-ciri bahasa prolog :
- Bahasa pemrograman yang non sequential
- Bahasa pemrograman yang deklaratif
- Simbolik
- Berdasarkan first order logic
Kesederhanaan Prolog dibanding bahasa lain adalah :
- Sintaksnya sangat sedikit sekali
- Secara teoritis tidak ada tipe data, tetapi bilangan bulat terpisah.
- Semantik sangat jelas dan terdefinisi secara matematis.
Suatu program prolog tidak memiliki struktur seperti deklarasi, dan lain-lainnya. Seluruh atom ditangani secara sama, yang ada hanyalah clause.
Ada berbagai macam aplikasi untuk menjalankan bahasa prolog. Dalam perkuliahan kami, kami menggunakan SWI Prolog. SWI-Prolog menawarkan Software Gratis komprehensif lingkungan Prolog, berlisensi di bawah GNU Lesser Public License. Bersama dengan XPCE toolkit grafis, pengembangan dimulai pada tahun 1987 dan telah didorong oleh kebutuhan untuk aplikasi dunia nyata. Akhir-akhir ini SWI-Prolog secara luas digunakan dalam penelitian dan pendidikan serta untuk aplikasi komersial.
Cara menginstal SWI prolog yakni :
- Klik 2 kali pada installer.
- Akan muncul license agreement seperti berikut. Pilih "I Agree" saja.
- Lalu muncul jendela untuk memilih komponen yang ingin diinstall seperti berikut. Klik next saja.
- Pilih folder untuk menyimpan aplikasi ini lalu klik next.
- pilih install.
- Instalasi diproses.
- Setelah instalasi selesai, akan muncul jendela seperti berikut. Kemudian klik finish.
Prolog menyelesaikan permasalahan secara deduktif atau menurunkan kesimpulan sebagai jawaban berdasarkan fakta
(fact) dan aturan
(rule) dengan pencarian dari atas ke bawah.
Fakta, Aturan dan Pertanyaan
Simbol
Ekspresi Prolog terdiri dari simbol-simbol kebenaran-fungsional berikut, yang memiliki interpretasi yang sama seperti dalam predikat kalkulus.
Bahasa Inggris | Kalkulus Predikat | PROLOG |
dan | ^ | , |
atau | v | ; |
jika | -> | : - |
tidak | ~ | tidak |
Variabel dan Nama
Variabel dimulai dengan huruf besar. Nama predikat, nama fungsi, dan nama-nama untuk benda harus dimulai dengan huruf kecil. Aturan untuk membentuk nama-nama adalah sama seperti untuk kalkulus predikat.
Fakta
Fakta adalah ekspresi predikat yang membuat pernyataan deklaratif tentang masalah domain. Setiap kali variabel terjadi dalam ekspresi Prolog, itu dianggap
universal dikuantifikasi. Perhatikan bahwa semua kalimat Prolog harus diakhiri dengan periode.
Aturan
aturan adalah ekspresi predikat yang menggunakan implikasi logis (:-) untuk menggambarkan hubungan antara fakta. Jadi aturan Prolog mengambil bentuk
left_hand_side: - right_hand_side.
Kalimat ini diartikan sebagai:
left_hand_side jika right_hand_side. left_hand_side Hal ini dibatasi untuk
satu, positif, literal, yang berarti harus terdiri dari sebuah ekspresi atom positif. Hal ini tidak dapat ditiadakan dan tidak dapat berisi connectives logis.
Notasi ini dikenal sebagai
klausa Horn. Dalam logika klausa Horn, sisi kiri klausa adalah kesimpulan, dan harus satu positif literal. Sisi kanan berisi tempat. Kalkulus Tanduk klausa setara dengan kalkulus predikat urutan pertama.
Contoh aturan yang berlaku:
Contoh aturan tidak valid:
Pertanyaan
Penafsir Prolog menanggapi
pertanyaan tentang fakta dan aturan terwakili dalam database-nya. Database diasumsikan untuk mewakili apa yang benar tentang domain masalah tertentu. Dalam membuat query Anda meminta Prolog apakah ia dapat membuktikan bahwa permintaan Anda benar. Jika demikian, itu menjawab "ya" dan menampilkan
binding variabel apapun yang dibuat dalam datang dengan jawabannya. Jika gagal untuk membuktikan query benar, maka jawaban "Tidak".Setiap kali Anda menjalankan interpreter Prolog, ia akan
meminta Anda
dengan? -. Misalnya, fakta-fakta berikut tentang sebuah keluarga fiktif.
Kami mendapatkan hasil berikut ketika kita membuat pertanyaan tentang database ini. (Saya telah menambahkan komentar, tertutup dalam /*..*/, untuk menafsirkan setiap query.)
universal. Ditutup Juru Prolog mengasumsikan bahwa database adalah dunia tertutup - yaitu, jika tidak dapat membuktikan sesuatu itu benar, itu menganggap bahwa itu adalah palsu. Hal ini juga dikenal sebagai negasi sebagai gagal - yaitu, ada sesuatu yang salah jika PROLOG tidak dapat membuktikan benar mengingat fakta-fakta dan aturan dalam database-nya. Dalam hal ini, di sumur bisa (di dunia nyata), bahwa Paulus adalah ayah dari Maria, tapi karena ini tidak dapat dibuktikan diberikan database keluarga saat ini, Prolog menyimpulkan bahwa itu adalah palsu. Jadi PROLOG mengasumsikan bahwa database-nya berisi pengetahuan lengkap dari domain ini adalah mulai bertanya tentang.
Prosedur pembuktian Prolog
Dalam menanggapi pertanyaan, interpreter Prolog menggunakan pencarian
backtracking, serupa dengan yang kita pelajari dalam Bab 3 dari Luger. Untuk melihat bagaimana ini bekerja, mari kita tambahkan aturan berikut ke database kami:
parent_of (X, Y): - father_of (X, Y). / * Peraturan # 1 * /
parent_of (X, Y): - mother_of (X, Y). / * Aturan # 2 * /
Dan mari kita menelusuri bagaimana PROLOG akan proses query. Misalkan fakta dan aturan database ini disusun dalam urutan yang mereka masukan. Jejak ini mengasumsikan Anda tahu bagaimana
unifikasibekerja.
? - Parent_of (jane, mary).
parent_of (jane, mary) / * Prolog dimulai di sini dan pencarian
untuk pencocokan fakta atau aturan. * /
parent_of (X, Y) / * Prolog menyatukan query dengan aturan # 1
menggunakan {jane / X, mary / Y}, memberikan
parent_of (jane, mary): - father_of (jane, mary) * /
father_of (jane, mary) / * Prolog menggantikan LHS dengan RHS dan pencarian. * /
/ * Ini gagal untuk mencocokkan father_of (joe, paul) dan
dan father_of (joe, mary), jadi ini GAGAL. * /
/ * Prolog BACKTRACKS dengan aturan lain # 2 dan
menyatukan dengan {jane / X, mary / Y}, sehingga cocok
parent_of (jane, mary): - mother_of (jane, mary) * /
mother_of (jane, mary) / * Prolog menggantikan LHS dengan RHS dan pencarian. * /
YES. / * Prolog menemukan kecocokan dengan literal dan begitu berhasil.
Berikut jejak query ini menggunakan Prolog's
jejak predikat:
| -? Jejak, parent_of (jane, mary).
{Debugger pertama akan merayap - semuanya menunjukkan (trace)}
1 1 Call: parent_of (jane, mary)?
2 2 Call: father_of (jane, mary)?
2 2 Gagal: father_of (jane, mary)?
2 2 Call: mother_of (jane, mary)?
2 2 Keluar: mother_of (jane, mary)?
1 1 Keluar: parent_of (jane, mary)?
ya
{Trace}
|? -
Latihan
- Tambah laki-laki () aturan yang mencakup semua ayah sebagai laki-laki.
- Tambahkan wanita () aturan yang mencakup semua ibu sebagai perempuan.
- Tambahkan aturan berikut ke database keluarga:
son_of (X, Y)
daughter_of (X, Y)
sibling_of (X, Y)
brother_of (X, Y)
sister_of (X, Y)
- Mengingat penambahan aturan sibling_of, dan dengan asumsi urutan di atas untuk fakta dan aturan, menunjukkan PROLOG jejak untuk sibling_of query (paul, mary).