Czy istnieje wyraźne odniesienie, z pseudo-kodem, dotyczące sposobu wdrażania interpretera Prolog w czysto funkcjonalnym języku? To, co do tej pory znalazłem, wydaje się dotyczyć wyłącznie języków imperatywnych, jest jedynie demonstracją samego Prologu zaimplementowanego lub nie oferuje żadnego konkretnego algorytmu do zastosowania w interpretacji. Byłbym bardzo wdzięczny za odpowiedź.
25
Odpowiedzi:
Ponieważ Prolog = ujednolicenie składniowe + tworzenie łańcuchów wstecznych + REPL
Wszystkie trzy części można znaleźć w Sztucznej inteligencji: struktury i strategie kompleksowego rozwiązywania problemów autorstwa George'a F. Lugera. W czwartym wydaniu książki wszystkie trzy części zostały zaimplementowane w LISP w rozdziale 15.8, Programowanie logiki w LISP. On również umieszcza ten sam kod w swoich innych książkach, ale nie mam ich wszystkich do odnotowania tutaj. Kod jego książek można znaleźć tutaj .
Kolejne źródło ze wszystkimi trzema częściami można znaleźć w Paradygmatach programowania sztucznej inteligencji: studia przypadków w Common Lisp autorstwa Petera Norviga. Patrz rozdziały 11, Programowanie logiki i 12, Kompilowanie programów logicznych. Kod jego książki można znaleźć tutaj .
Innym źródłem jest struktura i interpretacja programów komputerowych Hal Abelson, Jerry Sussman i Julie Sussman. Patrz rozdział 4.4 Programowanie logiki. Strona książki jest tutaj, a kod książki jest tutaj .
Nierzadko zdarza się znaleźć algorytm unifikacji z łańcuchem wstecznym zaimplementowanym w wielu aplikacjach, jeśli wiesz, gdzie szukać; jest to szczególnie rozpowszechnione w wnioskach typu w kompilatorach funkcjonalnych. Użycie słowa kluczowego ujednolicenie lub występuje pomaga dostrzec funkcje. Również większość implementacji używa unif jako nazwy funkcji unifikacyjnej.
Wersja Prologu, pomniejszona o REPL, wykonana w OCaml, patrz Kod i zasoby dla „Podręcznika praktycznej logiki i automatycznego wnioskowania” - prolog.ml
Tłumaczenie kodu książki na F # można znaleźć tutaj . Tłumaczenie kodu książki na Haskell można znaleźć tutaj .
Jeśli chodzi o znalezienie kodu, najłatwiej jest znaleźć algorytm unifikacji, a następnie implementacje z łańcuchem wstecznym wbudowanym w aplikacje. Najtrudniej jest znaleźć w pełni funkcjonalną implementację Prologa w funkcjonalnym języku z REPL. Przez większość czasu kod nie ma formatu do bezpośredniego użycia w PROLOGU; jest mocno dostosowany, aby zwiększyć wydajność, więc możesz znaleźć kod, ale nie będzie warto kosztować wypróbowania pożądanych części. Radzę przeczytać książkę Lugera i zbudować ją od podstaw w wybranym języku, nawet jeśli oznacza to instalację i naukę LISP oraz tłumaczenie.
EDYTOWAĆ
Ponieważ jest to zduplikowane pytanie StackOverflow, a OP jest nowy, a w komentarzach mówi:
Omówię to tutaj, ale zdaję sobie sprawę, że OP powinien zadać nowe pytanie.
Aby zapoznać się z niektórymi informacjami wprowadzającymi, zobacz wnioskowanie o typach .
Najlepsza książka, jaką znam na ten temat, to Typy i języki programowania autorstwa Benjamina C. Pierce'a. Strona książki jest tutaj . Zasoby z linkami do kodu OCaml są tutaj . Niedawno rozpoczęto, ale przeważnie pełne tłumaczenie tego na F # jest tutaj .
Zależne typy: str. 462 Typy zawężeń: str. 207 Układy logiczne i typy: str. 109
źródło
Zobacz implementację miniprologa w moim zoo języków programowania , jest to ostatni na liście. Możesz zobaczyć kod źródłowy online , kod jest dobrze udokumentowany.
źródło