Пролог с лямбда-выражениями

есть ли реализация 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.
    ?- 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