Làm thế nào để thực hiện một trình thông dịch prolog trong một ngôn ngữ chức năng thuần túy?


25

Có một tài liệu tham khảo rõ ràng, với mã giả, về cách thực hiện trình thông dịch Prolog bằng ngôn ngữ thuần túy? Điều mà tôi đã tìm thấy cho đến nay dường như chỉ đối phó với các ngôn ngữ bắt buộc, chỉ đơn thuần là một minh chứng cho Prolog được thực hiện trong chính nó, hoặc không đưa ra thuật toán cụ thể nào để sử dụng để giải thích. Tôi sẽ rất đánh giá cao một câu trả lời.


4
Việc triển khai Prolog (Dòng Princeton trong Khoa học Máy tính) của Patrice Boizumault đã thực hiện Lisp.
Will Ness

Xem câu trả lời này cho một cách tiếp cận tương đối mới.
sai

Câu trả lời:


24

Prolog = Hợp nhất cú pháp + Xâu chuỗi ngược + REPL

Tất cả ba phần có thể được tìm thấy trong Trí tuệ nhân tạo: cấu trúc và chiến lược để giải quyết vấn đề phức tạp của George F. Luger. Trong phiên bản thứ tư của cuốn sách, cả ba phần được triển khai trong LISP trong Phần 15.8, Lập trình logic trong LISP. Anh ấy cũng đặt mã tương tự trong các cuốn sách khác của mình, nhưng tôi không có tất cả chúng để ghi chú ở đây. Mã cho các cuốn sách của mình có thể được tìm thấy ở đây .

Một nguồn khác với cả ba phần có thể được tìm thấy trong Paradigms của lập trình trí tuệ nhân tạo: nghiên cứu trường hợp trong Common Lisp của Peter Norvig. Xem Chương 11, Lập trình logic và 12, Biên dịch chương trình logic. Mã cho cuốn sách của mình có thể được tìm thấy ở đây .

Một nguồn khác là Cấu trúc và giải thích các chương trình máy tính của Hal Abelson, Jerry Sussman và Julie Sussman. Xem phần 4.4 Lập trình logic. Trang web cho cuốn sách ở đây và mã cho cuốn sách ở đây .

Không có gì lạ khi tìm thấy thuật toán hợp nhất với chuỗi ngược được triển khai trong nhiều ứng dụng nếu bạn biết tìm ở đâu; nó đặc biệt phổ biến trong kiểu suy luận trong trình biên dịch chức năng. Sử dụng các từ khóa thống nhất hoặc xảy ra giúp phát hiện các chức năng. Ngoài ra hầu hết các triển khai sử dụng unif cho tên của hàm thống nhất.

Đối với phiên bản Prolog, trừ REPL, được thực hiện trong OCaml, hãy xem Mã và tài nguyên cho "Sổ tay logic thực tế và lý luận tự động" - prolog.ml

Một bản dịch của mã sách sang F # có thể được tìm thấy ở đây . Một bản dịch của mã sách sang Haskell có thể được tìm thấy ở đây .

Về mặt tìm mã, thuật toán hợp nhất là dễ tìm nhất, sau đó triển khai với chuỗi nối lại được nhúng trong các ứng dụng. Tìm kiếm một triển khai đầy đủ chức năng của Prolog bằng ngôn ngữ chức năng với REPL là khó nhất. Hầu hết thời gian mã không ở định dạng để sử dụng trực tiếp trong PRITAL; nó được tùy chỉnh rất nhiều để nâng cao hiệu suất, vì vậy bạn có thể tìm thấy mã nhưng nó sẽ không đáng giá để trêu chọc những phần bạn muốn. Lời khuyên của tôi là đọc cuốn sách của Luger và xây dựng nó từ đầu bằng ngôn ngữ bạn chọn, ngay cả khi nó có nghĩa là cài đặt và học LISP và dịch để làm như vậy.

CHỈNH SỬA

Vì đây là một câu hỏi trùng lặp từ StackOverflow và OP là mới và trong các ý kiến ​​cho biết:

Để cung cấp thêm ngữ cảnh, tôi đang cố gắng thực hiện suy luận kiểu, tuy nhiên các tính năng phức tạp trong hệ thống loại ngôn ngữ của tôi (loại phụ thuộc, loại tinh chỉnh, gõ tuyến tính để đặt tên cho một số loại ít phổ biến hơn) khiến tôi cảm thấy rằng nó sẽ sẽ hữu ích để dựa vào loại suy luận của tôi về các thuật toán điều khiển Prolog để có được một thuật toán rất chung chung. Tôi sẽ lưu ý rằng tôi hoàn toàn tự học, vì vậy kiến ​​thức của tôi còn thiếu trong các lĩnh vực lớn.

Tôi sẽ mở rộng về vấn đề này ở đây, nhưng nhận ra OP nên hỏi một câu hỏi mới.

Đối với một số công cụ giới thiệu xem thực hiện suy luận loại .

Cuốn sách hay nhất mà tôi biết về điều này là Các loại và ngôn ngữ lập trình của Benjamin C. Pierce. Trang web của cuốn sách ở đây . Các tài nguyên với các liên kết đến mã OCaml là ở đây . Và gần đây đã bắt đầu nhưng chủ yếu là hoàn thành bản dịch này sang F # ở đây .

Các loại phụ thuộc: pg. 462 Các loại sàng lọc: pg. 207 Hệ thống logic và loại tuyến tính: pg. 109


1
Guy Coder, thưa ngài là một quý ông và một học giả! Sự giúp đỡ của bạn là hữu ích nhất và tôi không thể cảm ơn bạn đủ vì đã thực sự dành thời gian để trả lời câu hỏi này. = D - Người cộng tác của Jimster và người bạn nghiên cứu
mệt

Tôi cảm ơn bạn một lần nữa, tôi đã có được những cuốn sách này (đó là trước đây, không phải như trong một chuyến đi nhanh đến một cửa hàng sách).
Jimster

Mã của @Jimster Norvig rất hay và rõ ràng, phù hợp với trang IIRC. Đừng nhớ rằng nếu nó nguyên chất .
Will Ness


Quan tâm: unify_P3.py là một phần của Bài tập 2
Guy Coder

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.