Пролог с лямбда-выражениями
есть ли реализация Java PROLOG, которая поддерживает лямбда-выражения? Я знаю, что есть реализации Java других языков, которые поддерживают лямбда-выражения, такие как LISP и Clojure, но мне действительно нужна реализация PROLOG.
http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations
3 ответов
Lean Prolog реализован на Java и может запускать Logtalk, что делает лямбда-выражения доступными для всех поддерживаемые компиляторы backend Prolog. Обзор синтаксиса лямбда-выражений Logtalk см., например:
http://blog.logtalk.org/2009/12/lambda-expressions-in-logtalk/
примеры использования см.:
https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/lambdas
есть пролог внедрение лямда Ульрихом Neumerkel. SWI-Prolog, например, поддерживает его. Если вы выполнили поиск в Stackoverflow:
[swi-prolog] lambda
вы также можете найти довольно много ответов, используя его для решения.
кроме того, веб-страницы объясняет все
существует в основном два подхода для лямбда-выражений в Пролог, который адресует только вызов лямбда-выражений и не объединение высших порядков:
global-по-умолчанию: переменные в теле лямбда выражения являются глобальными по умолчанию, если они не упомянуты на подшивку.
local-по-умолчанию: переменные в теле лямбда выражение местные по умолчанию, если они не упоминается в дополнительной папке.
представителями local-by-default являются, например, Ульрих Ноймеркель библиотека (лямбда) или лямбда-выражения, найденные в Logtalk. Этот глобальный подход по умолчанию в настоящее время используется лямбда выражения, найденные в Jekejeke Prolog.
оба подхода позволяют моделировать одну и ту же математическую лямбду выражения и решить следующие задачи проблемы:
контроль обмена или не обмена переменных по несколько заклинаний.
принудительное Альфа-преобразование для связующих и локальных переменных в теле лямбда-выражения.
вот пример факториала через Y-комбинатор:
?- Y = F\X^call(X\call(F,call(X,X)),X\call(F,call(X,X))), Fact = F\J^H^M^N^N\J^H^M^M\J^H^(N=0,M=1;N>0,H is N-1,call(F,H,J),M is N*J), call(Y,Fact,10,R). R = 3628800.
- local-по-умолчанию:библиотека Ульриха Ноймеркеля (лямбда)
?- Y = \F^call([F]+\X^call(F,call(X,X)),[F]+\X^call(F,call(X,X))), Fact = \F^([F]+\N^([N,F]+\M^(N=0,M=1;N>0,H is N-1,call(F,H,J),M is N*J))), call(Y,Fact,10,R). R = 3628800.
тю
P.S.: различие global-by-default и local-by-default заимствовано
from, page 10:
Языковые особенности и архитектура B-Prolog
Ненг-ФА Чжоу, теория и практика логического программирования, 2011
http://www.sci.brooklyn.cuny.edu / ~Чжоу / документы / tplp11sips.pdf