Як реалізувати інтерпретатора prolog чисто функціональною мовою?


25

Чи є чітка довідка з псевдокодом про те, як реалізувати інтерпретатор Prolog чисто функціональною мовою? Те, що я виявив поки що, мабуть, стосується лише імперативних мов, є лише демонстрацією Prolog, реалізованого саме по собі, або не пропонує конкретного алгоритму, який би використовувався для інтерпретації. Я б дуже вдячний за відповідь.


4
Реалізація Prolog (серія Прінстона в галузі комп'ютерних наук) Патріса Бойзумо отримала Лісп.
Буде Несс

Дивіться цю відповідь щодо відносно нового підходу.
фальшива

Відповіді:


24

Оскільки Prolog = синтаксичне об'єднання + зворотний ланцюжок + REPL

Усі три частини можна знайти в « Штучному інтелекті»: структури та стратегії комплексного вирішення проблем Джорджа Ф. Лугера. У четвертому виданні книги всі три частини реалізовані в LISP у розділі 15.8, Логічне програмування в LISP. Він також вводить той самий код у своїх інших книгах, але я не маю всіх, щоб їх тут помітили. Код його книг можна знайти тут .

Ще одне джерело з усіма трьома частинами можна знайти в « Парадигмах програмування штучного інтелекту»: тематичні приклади у «Common Lisp » Пітера Норвіга. Див. Глави 11, логічне програмування та 12, складання логічних програм. Код його книги можна знайти тут .

Іншим джерелом є Структура та інтерпретація комп’ютерних програм Хал Абелсон, Джеррі Суссман та Джулі Суссман. Див. Розділ 4.4 Логічне програмування. Сайт для книги тут, і код для книги тут .

Не рідкість знайти алгоритм уніфікації зі зворотним ланцюжком, реалізований у багатьох додатках, якщо ви знаєте, де шукати; Це особливо поширене в типі зараження у функціональних компіляторах. Використання або уніфікація ключових слів допомагає визначити функції. Також більшість реалізацій використовують unif для імені функції об'єднання.

Для версії Prolog, за винятком REPL, виконаної в OCaml, див. Код та ресурси для "Довідника з практичної логіки та автоматизованого обгрунтування" - prolog.ml

Переклад коду книги на F # можна знайти тут . Переклад коду книги до Haskell можна знайти тут .

Щодо пошуку коду, найпростіше знайти алгоритм уніфікації, а потім реалізацію із зворотним ланцюжком, закладеним у додатки. Знайти повністю функціональну реалізацію Prolog на функціональній мові з REPL - це найскладніше. Більшість випадків код не знаходиться у форматі для прямого використання в PROLOG; він сильно налаштований для підвищення продуктивності, тому ви можете знайти код, але це не буде варто, щоб дражнити потрібні деталі. Моєю порадою було б прочитати книгу Лугера та створити її з нуля на вашій мові на вибір, навіть якщо це означає встановити та вивчити LISP та перекласти це.

EDIT

Оскільки це повторне запитання від StackOverflow і ОП є новим, а в коментарях сказано:

Щоб надати більше контексту, я намагаюся реалізувати умовиводи типу, однак заплутані функції в системі типів моєї мови (залежні типи, типи уточнення, лінійне введення, щоб назвати декілька менш поширених) дають мені відчути, що це буде Буде корисно базувати свій висновок типу алгоритмів, що керують Prolog, щоб отримати дуже загальний алгоритм. Зауважу, що я повністю самоучка, тому моїх знань не вистачає на великих територіях.

Я розповім про це тут, але розумію, що ОП повинна поставити нове запитання.

Для деяких інтро матеріалу см реалізації логічного висновку типу .

Найкраща книга, яку я знаю з цього приводу, - це типи та мови програмування Бенджаміна К. Пірса. Сайт книги тут . Ресурси з посиланнями на OCaml код тут . Нещодавно розпочатий, але переважно повний переклад цього файлу на F # є тут .

Залежні типи: pg. 462 Види уточнення: стор. 207 Лінійні системи логіки та типу: стор. 109


1
Хлопець Кодер, ви, пан, є джентльменом і науковцем! Ваша допомога є найкориснішою, і я не можу подякувати вам за те, що ви фактично знайшли час, щоб відповісти на це питання. = D - Співробітник Джимстера та товариш, що займається науковими дослідженнями
Шеньцао

Ще раз дякую, я вже отримав ці книги (тобто раніше, а не як у швидкій поїздці до книжкового магазину).
Jimster

Код @Jimster Norvig приємний і зрозумілий, вписується в сторінку IIRC. Не пам’ятайте, хоч якщо це чисто .
Буде Несс


Цікаво: unify_P3.py, що входить до завдання 2
Гай Кодер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.