- Prolog menyusun program dengan satu clause dan model data yang berpusat pada term, sehingga bahkan dengan tata bahasa kecil pun dapat mengekspresikan relasi yang bisa dihitung
- Pendekatan deklaratif menuliskan apa yang berlaku alih-alih prosedur eksekusi, sehingga relasi yang sama dapat digunakan untuk komputasi, generasi, dan kueri sekaligus
- Prolog murni berbasis Horn clause dan resolution, sehingga dampak penambahan constraint dan penambahan clause terhadap himpunan solusi dapat diprediksi secara logis
- Program itu sendiri adalah term Prolog, sehingga mudah membaca, menganalisis, dan mentransformasikan program lain, serta memungkinkan pembuatan bahasa spesifik domain lewat penulisan ulang pada waktu kompilasi
- Berkat dinamika runtime dan mekanisme implisit seperti pencarian, unifikasi, dan propagasi constraint, Prolog dapat digunakan secara luas mulai dari pemrosesan bahasa, basis data, verifikasi, hingga optimasi
Bahasa kecil yang terdiri dari clause dan term
- Semua data dalam Prolog direpresentasikan sebagai term Prolog
- Elemen inti bahasanya hanya satu, yaitu clause, dengan bentuk dasar
Head :- Body.
- Artinya, jika Body berlaku maka Head berlaku
- Operator infiks
(:-)/2 merepresentasikan panah ← yang mengarah dari kanan ke kiri
- Jika Head selalu berlaku, maka
:- Body dapat dihilangkan
- Struktur ini saja sudah cukup untuk menulis program Prolog pertama yang berguna
- Semua komputasi yang diketahui dapat dideskripsikan dengan clause seperti ini, sehingga Prolog adalah bahasa yang Turing-complete
- Turing machine dapat diimplementasikan dengan cara mendeskripsikan relasi perpindahan ke state berikutnya dari state saat ini, simbol di bawah kepala tape, dan sebagainya, sebagai clause
- Contoh implementasinya ada di turing.pl
Pemrograman deklaratif dan cara berpikir berbasis relasi
- Prolog adalah bahasa deklaratif yang mengekspresikan apa yang berlaku untuk solusi yang diminati, bukan bagaimana menemukan solusi tersebut
- Sifat ini memungkinkan spesifikasi yang ringkas, jelas, dan umum
- Relasi antara list dan panjangnya dapat dideskripsikan seperti berikut
list_length([], 0).
list_length([_|Ls], N) :-
N #> 0,
N #= N0 + 1,
list_length(Ls, N0).
- Pada beberapa sistem Prolog, aritmetika integer deklaratif memerlukan pustaka terpisah
- Definisi ini dapat dibaca secara deklaratif sebagai berikut
- panjang list kosong
[] adalah 0
- jika panjang
Ls adalah N0 dan N adalah N0 + 1, maka panjang [_|Ls] adalah N, dan relasi ini hanya berlaku ketika N lebih besar dari 0
- Relasi yang sama dapat digunakan dalam beberapa mode
list_length("abc", L) mengembalikan L = 3
list_length(Ls, 3) menemukan bentuk list dengan panjang 3, yaitu Ls = [_A,_B,_C]
list_length(Ls, L) mendaftar jawaban umum mulai dari list kosong hingga list dengan panjang yang terus bertambah
- Prolog biasanya melaporkan semua jawaban melalui backtracking
length/2 disertakan dalam draf Prologue for Prolog dan disediakan sebagai predikat bawaan dengan makna yang sama di hampir semua implementasi Prolog
Prolog sebagai pemrograman logika
- Dalam kategori bahasa deklaratif terdapat bahasa pemrograman fungsional dan bahasa pemrograman logika
- Fungsi adalah kasus khusus dari relasi, sehingga pemrograman fungsional dapat dipandang sebagai bentuk terbatas dari pemrograman logika
- Prolog berakar pada logic
- Program Prolog murni terdiri dari himpunan Horn clause
- Eksekusinya dapat dipandang sebagai kasus khusus dari resolution
- Berkat keterkaitannya dengan logika formal, kita dapat menerapkan debugging deklaratif berdasarkan sifat logis program
- jika constraint ditambahkan, himpunan solusi hanya akan berkurang
- jika clause ditambahkan, himpunan solusi hanya akan meluas
- sifat program Prolog murni seperti ini disebut monotonisitas
- GUPU system karya Ulrich Neumerkel adalah contoh penerapan gagasan ini
Sifat homoikonik: memperlakukan program sebagai data
- Program Prolog juga merupakan term Prolog yang valid
- Berkat sifat ini, program Prolog mudah menganalisis, mentransformasikan, dan menginterpretasikan program Prolog lainnya
- Predikat bawaan
read/1 dapat membaca term Prolog, sehingga juga dapat membaca clause Prolog
- Prolog memiliki mekanisme makro yang kuat untuk menulis ulang program pada waktu kompilasi
- ini memungkinkan implementasi bahasa spesifik domain yang membuat pekerjaan tertentu lebih alami untuk diselesaikan
list_length(Ls,N) dan N#>0 terlihat berbeda secara notasi, tetapi itu hanyalah bentuk yang lebih mudah dibaca berkat operator prefix, infix, dan postfix di Prolog
- misalnya, term Prolog
+(a,b) dapat ditulis sebagai a+b dengan notasi operator
- karena sintaks abstraknya seragam, semua term Prolog dapat dibaca dan diproses tanpa bergantung pada cara penulisannya
- Operator buatan pengguna untuk kegunaan tertentu dapat didefinisikan secara dinamis
Dinamika runtime dan ekstensibilitas
- Program Prolog dapat dengan mudah dibuat, dipanggil, dan dimodifikasi saat runtime
- Sifat ini meningkatkan daya ekspresi dan memungkinkan implementasi predikat orde tinggi yang menerima predikat lain sebagai argumen
- Teknik yang sangat dinamis seperti adaptive parsing juga dapat diimplementasikan
- Prolog cocok untuk menulis program yang diperluas dengan aturan buatan pengguna yang disediakan oleh programmer lain maupun pengguna umum
- Interpreter untuk Prolog murni dapat didefinisikan hanya dengan dua baris kode Prolog
- Pembahasan terkait ada di A Couple of Meta-interpreters in Prolog
Cakupan penggunaan yang luas dan mekanisme implisit
- Sifat relasional Prolog membuat program menjadi fleksibel dan umum
- Sifat ini memainkan peran penting dalam representasi pengetahuan untuk pemrosesan bahasa dan basis data
- Sistem Prolog modern menyediakan kemampuan yang dibutuhkan untuk berbagai hal, dari logic puzzles sederhana hingga aplikasi berskala besar
- Fleksibilitas dan kekuatan Prolog berakar pada mekanisme implisit seperti pencarian, unifikasi, pengindeksan argumen, dan propagasi constraint
- Pengembang dapat memanfaatkan mekanisme ini untuk menyerahkan banyak pekerjaan kepada mesin Prolog
1 komentar
Komentar Hacker News
Saya hampir sepenuhnya setuju dengan sentimen di sini. Saya memakai Prolog di tiga mata kuliah AI saat kuliah, membahas hampir seluruh "AI: A Modern Approach" dan pemrograman Prolog, dan itu benar-benar pengalaman yang membelokkan cara berpikir
Untuk kembali berpikir ala Prolog, saya selalu perlu pemanasan, dan pada semester itu saya bahkan sering menulis kode spaghetti yang sangat berbau Prolog dalam bahasa lain. Kekurangan terbesarnya saat itu adalah interoperabilitas dengan hal lain yang rumit; pilihannya memasukkan Prolog ke dalam JVM, memakai implementasi dengan fitur minim, atau bergantung pada binding C. Untuk tugas tertentu, terutama masalah pemenuhan kendala, ia luar biasa, tetapi menurut saya tidak cocok begitu dicampur dengan hal-hal seperti antarmuka pengguna atau akses sistem berkas. Saat itu SWI juga tertinggal dan kami memakai solusi proprietary seperti Sicstus, tetapi ketika saya cek belakangan, SWI sudah mengejar implementasi proprietary, jadi kalau sekarang mungkin saya akan memilih SWI. Ujian Prolog adalah yang paling menakutkan di universitas: 3 soal live coding selama 60 menit lalu dilanjutkan ujian lisan, tetapi saya menghabiskan 40 menit untuk soal mudah dan menyelesaikan dua sisanya dalam beberapa menit, jadi berhasil melewatinya. Di mata kuliah lanjutan, tugas mengimplementasikan agen game-playing dan mengadu mereka dalam turnamen terasa menyenangkan, dan "The Art of Prolog" serta "The Craft of Prolog" termasuk buku pemrograman terbaik yang pernah saya baca
The Craft of Prolog juga hebat, tetapi terlalu terspesialisasi pada pemrograman sistem Prolog lama sehingga beberapa babnya kini terasa usang. Banyak ide Prolog tetap hidup dalam answer set programming dan Datalog, dan Datalog sangat bagus untuk membuat penganalisis statis modern: https://arxiv.org/abs/2012.10086
Tiba-tiba saya penasaran bagaimana chatbot menangani Prolog. Apakah mereka sudah cukup melihatnya? Bisakah mereka bernalar dengan cara seperti itu?
Prolog itu keren, dan layak dipelajari hanya demi merasakan paradigma pemrograman yang asing. Banyak konsep diekspresikan dengan cara yang sama sekali berbeda, dan begitu paradigmanya terasa pas, justru menjadi jauh lebih sederhana
Misalnya, di Prolog Anda biasanya tidak memanipulasi koleksi secara langsung; Anda memberi informasi tentang apa saja item dalam koleksi itu, lalu membiarkan implementasinya mencari tahu. Menggambar pohon dependensi pun bisa dilakukan dengan 3 aturan: apa entitasnya, bagaimana menentukan relasi antara entitas X dan Y, dan bagaimana merepresentasikannya. Namun karena sulit, susah meyakinkan orang untuk mempelajari atau memakainya, dan saya belum menemukan cara mengintegrasikannya secara mulus ke aplikasi lain. Saya tahu FFI adalah salah satu opsi, tetapi saya belum yakin itu siap untuk produksi. Dalam beberapa bulan terakhir saya mencari alternatif Prolog yang lebih dekat ke “produksi”, tetapi LispWorks dan Franz Allegro CL terlalu mahal dan kurang ramah integrasi. Saya sangat penasaran jika ada contoh integrasi Prolog yang baik dalam perangkat lunak modern. Karena XPCE tidak berjalan di Mac, saya juga sedang mencari solusi GUI. Swish sebagai notebook online juga layak dilihat: https://swish.swi-prolog.org
Saya dengar sekarang sudah dihapus, jadi ini bukan contoh “modern”, tetapi benar-benar contoh indah penerapan Prolog. Dari https://news.ycombinator.com/item?id=36821871 berlanjut ke https://web.archive.org/web/20030218034509/http://www.resear... dan sangat layak dibaca. Tautan terkait: https://news.ycombinator.com/item?id=14046420
Keduanya berjalan cukup baik, tetapi use case-nya terbatas. Pengalaman memakai Prolog di universitas memang menyenangkan, tetapi saya tidak ingin memakainya kecuali masalahnya memang secara hakiki berbentuk seperti Prolog. Begitu mulai mengimplementasikan sesuatu yang sedikit saja kompleks, abstraksinya mulai bocor ke mana-mana, dan rasanya lebih seperti bertarung dengan algoritma backtracking daripada menikmati keunggulan bahasanya
Racklog adalah embedding pemrograman logika ala Prolog ke dalam Racket, dan kata “embedding” berarti Anda tidak kehilangan Racket. Potongan kode ala Prolog dan kode Racket biasa bisa ditulis berdampingan. Ia memuat sebagian besar fitur Prolog, termasuk meta-logika dan predikat “set” orde kedua, hanya mengecualikan fitur yang bisa dilakukan lebih mudah dan efisien dengan subekspresi Racket. https://docs.racket-lang.org/racklog/index.html Racket juga punya GUI, dan pada dasarnya hampir semua yang dibutuhkan
CUE jauh lebih mudah dimasukkan ke workflow yang sudah ada, sehingga bagus untuk mengubah manfaat pemrograman logika menjadi sesuatu yang praktis. https://cuelang.org | https://cuetorials.com
Selama beberapa tahun membuat perangkat lunak optimasi rantai pasok dengan C++, saya memakai perangkat lunak propagasi kendala ILOG, Solver, yang sekarang dimiliki IBM. Saat itu saya juga meninjau BinProlog; ia punya propagasi rentang bawaan, dikompilasi ke x86 native, dan interoperabilitas FFI-nya juga cukup baik
Namun pada akhirnya sepertinya tersisih oleh SWI Prolog dan toolchain GNU. GUI tampaknya harus dilihat sebagai bidang keahlian yang sama sekali berbeda, dan kami memakai engine rendering kanvas C++ buatan sendiri serta alat pengembangan 4GL terpadu yang mengerikan bernama “4D” atau “Fourth Dimension”. https://www.tomshw.it/data/images/2/0/4/3/infor-advanced-sch...
Bahasa Shen dari Mark Tarver berisi implementasi lengkap Prolog: https://shenlanguage.org/SD/Prolog.html
Ada juga bab terkait di The Book of Shen: https://shenlanguage.org/TBoS/tbos_359.html Tarver juga menulis dua buku tentang pemrograman logika yang disertai perangkat lunak. Logic, Proof and Computation: https://shenlanguage.org/lpc.html Programming the Logic Lab: https://shenlanguage.org/logiclab.html
Pattern matching, pemeriksaan tipe opsional, dan Prolog bawaan itu mengagumkan. Sang pencipta agak tersisih dari komunitas yang lebih luas karena sikap diplomatisnya, tetapi ia brilian, dan adopsinya tetap niche serta berada di garis depan. Jika ada organisasi seperti Mozilla di belakangnya, saya rasa daya tariknya bagi khalayak luas akan jauh lebih besar. Presentasi-presentasi @deech sekarang sudah lama, tetapi masih tetap bagus dan bermakna: https://www.youtube.com/watch?v=lMcRBdSdO_U, https://www.youtube.com/watch?v=BUJNyHAeAc8 Namun perlu diingat, saya penggemar berat APL/J/BQN
Saya masih ingat belajar Prolog sekitar 25 tahun lalu dalam program gelar AI + ilmu komputer. Banyak dipakai di modul pemrosesan bahasa alami
Awalnya terasa membuat frustrasi dan menjengkelkan, tetapi setelah terbiasa ternyata cukup menyenangkan, dan karena satu-satunya cara melakukan iterasi adalah rekursi, ia juga sangat bagus sebagai pengantar rekursi
Di universitas, saya terutama belajar Prolog dari para matematikawan yang memang kebanyakan memakai bahasa seperti itu, dan bagi mereka Prolog adalah cara berpikir yang sangat alami. Sebaliknya, bagi mahasiswa yang terutama terbiasa dengan bahasa prosedural, itu membingungkan dan membuat frustrasi, dan semua orang mencoba menulis Prolog seperti bahasa lain lalu jadi kacau. Baru pada mata kuliah ketiga atau keempat yang memakai Prolog, setelah mempelajari algoritme di baliknya, cara menggunakannya dengan baik akhirnya masuk akal. Belakangan saya membantu seorang mahasiswa sarjana yang kesulitan karena Prolog; intinya bukan mencoba membuat Prolog bergerak seperti bahasa yang sudah dikenal, melainkan mengubah cara berpikir pemecahan masalah agar sesuai dengan dunia Prolog. Setelah pembicaraan yang cukup panjang, datanglah momen pencerahan yang nyata, dan ia menyelesaikan tugasnya dengan sangat baik
Namun setelah paradigma baru itu benar-benar klik di kepala, saya jadi sangat menyukainya. Momen pencerahan itu saja sudah cukup membuat kelas tersebut layak diambil
Komentar lain membahas Prolog secara umum, tetapi saya ingin mengatakan bahwa The Power of Prolog adalah seri tutorial yang cukup hebat
Videonya juga layak ditonton, dan Markus pandai menjaga ketertarikan penonton maupun pembaca
Berkat video ini, saya jadi menerima Prolog sebagai gerakan yang masih berlangsung dan progresif dalam pemrograman
Prolog adalah bahasa yang indah. Saya pernah menulis puluhan ribu baris untuk penalaran matematis, penalaran berbasis aturan, dan sebagainya; untuk ranah seperti itu ia sangat cocok dan pekerjaannya juga luar biasa menyenangkan
Untuk jenis aplikasi lain ada dua masalah. Pertama, paradigmanya terlalu berbeda sehingga tidak cocok dengan library dan bahasa lain. Kedua, membuat GUI yang layak hampir mustahil, juga karena tidak cocok dengan paradigmanya
Biasanya, dari sisi Prolog, antarmuka eksternal terlihat seperti predikat yang semua argumennya sudah ter-ground, dan dari sisi eksternal, interaksi dengan Prolog mirip seperti berurusan dengan database SQL. Mengirim kueri, mengurai kueri, meminta lebih banyak solusi, atau menggerakkan backtracking. Interaksi seperti ini bisa dibilang “tidak menarik”, tetapi itu karena library-library tersebut tidak benar-benar memanfaatkan fitur Prolog yang berguna. Jika mau, Anda bisa membuat lapisan interoperabilitas yang lebih tebal, menggabungkan beberapa fungsi library menjadi satu antarmuka predikat di sisi Prolog, lalu memanggil subrutin tertentu berdasarkan mode instansiasi argumen. Namun ini tidak jauh berbeda dari mengekspos library C ke bahasa berorientasi objek seperti Python dengan membungkus beberapa fungsi C sebagai accessor properti atau metode pada struktur data
Saya aktif memakai Prolog untuk analisis data. Pada awalnya perlu ada tahap memaksa diri melakukan segala sesuatu yang memungkinkan dengan Prolog agar memahami cara mengubah pertanyaan menjadi masalah simbolik
Prolog memiliki dukungan yang buruk untuk komputasi ilmiah dan manipulasi string. Setelah melewati tahap itu, solusi Prolog sering kali lebih elegan daripada alternatif terbaik berikutnya. Selain itu, karena ini adalah paradigma logika, meluangkan waktu untuk memahami bagaimana pembuktian dengan negasi + unifikasi = pemrograman logika itu sangat layak. Dari semua bahasa pemrograman yang pernah kupelajari, ini jelas yang paling memperluas cara pandangku.
Prolog standar memang tidak menyertakan regex secara bawaan, tetapi implementasi populer biasanya menyediakan pustaka untuk itu. Kalau harus banyak bekerja dengan string dan harus memilih antara C dan Prolog, aku pasti memilih Prolog. Kalau Python dan Prolog, tergantung pekerjaannya.
Bagaimanapun, ini situs yang bagus, dan senang melihat topik ini muncul lagi.
Sebelumnya aku pernah menulis pemecahnya dengan Java, jadi aku mencoba memindahkan kode itu ke Prolog, tetapi sama sekali tidak berhasil. Akhirnya aku mulai lagi dari awal dan menulis kode Prolog sederhana untuk memeriksa apakah Sudoku valid, lalu menyadari bahwa dengan menjalankan predikat-predikat itu, Sudoku juga bisa diselesaikan. Begitulah aku menyelesaikan pemecahnya dalam kurang dari 10 baris. Itu benar-benar momen eureka, dan Prolog sangat kuat, tetapi dalam praktiknya kurang digunakan secara tidak adil. Untungnya aku sempat berkesempatan mencoba Datalog dan OWL.