Bagaimana cara mengimplementasikan juru bahasa prolog dalam bahasa yang murni fungsional?

25

Apakah ada referensi yang jelas, dengan pseudo-code, tentang bagaimana cara mengimplementasikan juru bahasa Prolog dalam bahasa yang murni fungsional? Apa yang saya temukan sejauh ini tampaknya hanya berurusan dengan bahasa imperatif, hanyalah sebuah demonstrasi dari Prolog yang dilaksanakan dengan sendirinya, atau tidak menawarkan algoritma konkret untuk digunakan untuk interpretasi. Saya akan sangat menghargai jawaban.

Jimster
sumber
4
Implementasi Prolog (Princeton Series dalam Ilmu Komputer) oleh Patrice Boizumault memiliki implementasi Lisp.
Will Ness
Lihat jawaban ini untuk pendekatan yang relatif baru.
false

Jawaban:

24

Sejak Prolog = Sintaksis Unifikasi + chaining Mundur + repl

Ketiga bagian dapat ditemukan dalam kecerdasan buatan: struktur dan strategi untuk pemecahan masalah yang kompleks oleh George F. Luger. Dalam edisi keempat buku ini, ketiga bagian diimplementasikan dalam LISP di Bagian 15.8, Pemrograman Logika dalam LISP. Dia juga memasukkan kode yang sama di buku-bukunya yang lain, tetapi saya tidak memiliki semuanya untuk dicatat di sini. Kode untuk buku-bukunya dapat ditemukan di sini .

Sumber lain dengan ketiga bagian dapat ditemukan dalam Paradigma pemrograman kecerdasan buatan: studi kasus di Common Lisp oleh Peter Norvig. Lihat Bab 11, Pemrograman Logika dan 12, Mengkompilasi Program Logika. Kode untuk bukunya dapat ditemukan di sini .

Sumber lain adalah Struktur dan interpretasi program komputer oleh Hal Abelson, Jerry Sussman dan Julie Sussman. Lihat Bagian 4.4 Pemrograman Logika. Situs untuk buku ada di sini dan kode untuk buku itu ada di sini .

Bukan hal yang aneh untuk menemukan algoritma unifikasi dengan back chaining diimplementasikan di banyak aplikasi jika Anda tahu ke mana harus mencari; ini terutama lazim dalam tipe yang menyimpulkan dalam kompiler fungsional. Menggunakan unifikasi kata kunci atau terjadi membantu untuk menemukan fungsi. Juga sebagian besar implementasi menggunakan unif untuk nama fungsi unifikasi.

Untuk versi Prolog, kurangi REPL, yang dilakukan di OCaml, lihat Kode dan sumber daya untuk "Buku Pegangan Logika Praktis dan Penalaran Otomatis" - prolog.ml

Terjemahan kode buku ke F # dapat ditemukan di sini . Terjemahan kode buku ke Haskell dapat ditemukan di sini .

Dalam hal menemukan kode, algoritma unifikasi paling mudah ditemukan, kemudian implementasi dengan rantai belakang tertanam dalam aplikasi. Menemukan implementasi Prolog yang berfungsi penuh dalam bahasa fungsional dengan REPL adalah yang paling sulit. Sebagian besar waktu kode tidak dalam format untuk penggunaan langsung dalam PROLOG; itu sangat disesuaikan untuk meningkatkan kinerja, sehingga Anda dapat menemukan kode tetapi tidak akan sebanding dengan harga untuk menggoda bagian yang Anda inginkan. Saran saya adalah membaca buku Luger dan membangunnya dari awal dalam bahasa pilihan Anda, bahkan jika itu berarti menginstal dan mempelajari LISP dan menerjemahkannya untuk melakukannya.

EDIT

Karena ini adalah pertanyaan duplikat dari StackOverflow dan OP baru dan di komentar mengatakan:

Untuk memberikan lebih banyak konteks, saya mencoba menerapkan inferensi tipe, namun fitur rumit dalam sistem tipe bahasa saya (tipe dependen, tipe penyempurnaan, pengetikan linier untuk menyebutkan beberapa yang kurang umum) membuat saya merasa bahwa itu akan berguna untuk mendasarkan inferensi tipe saya dari algoritma mengemudi Prolog untuk mendapatkan algoritma yang sangat umum. Saya akan perhatikan bahwa saya sepenuhnya belajar sendiri, jadi pengetahuan saya kurang dalam bidang yang luas.

Saya akan memperluas ini di sini, tetapi menyadari OP harus mengajukan pertanyaan baru.

Untuk beberapa hal intro, lihat menerapkan tipe inferensi .

Buku terbaik yang saya tahu tentang ini adalah Jenis dan bahasa pemrograman oleh Benjamin C. Pierce. Situs buku ada di sini . Sumber daya dengan tautan ke kode OCaml ada di sini . Dan baru-baru ini mulai tetapi sebagian besar terjemahan lengkap untuk F # ada di sini .

Jenis tanggungan: hal. 462 Jenis penyempurnaan: hal. 207 Linear logic and type systems: hal. 109

Guy Coder
sumber
1
Guy Coder, Anda Tuan adalah pria dan sarjana! Bantuan Anda sangat berguna, dan saya tidak dapat cukup berterima kasih karena telah meluangkan waktu untuk menjawab pertanyaan ini. = D - Kolaborator Jimster dan Sahabat Peneliti yang Lelah
Shenzao
Saya berterima kasih sekali lagi, saya sudah mendapatkan buku-buku ini (yang sebelumnya, tidak seperti dalam perjalanan cepat ke toko buku).
Jimster
@Jimster Norvig kode bagus dan jelas, cocok di halaman IIRC. Tapi tidak ingat apakah itu murni .
Will Ness
Temukan satu lagi: Kuliah 26: Ketik Inferensi dan Penyatuan
Guy Coder
Yang menarik: unify_P3.py yang merupakan bagian dari Penugasan 2
Guy Coder