繁体   English   中英

带有 lambda 表达式的 PROLOG

[英]PROLOG with lambda expressions

是否有任何支持 lambda 表达式的 Java PROLOG 实现? 我知道还有其他语言的 Java 实现支持 lambda 表达式,例如 LISP 和 Clojure,但我确实需要一个 PROLOG 实现。

http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations

Lean Prolog 是用 Java 实现的,可以运行 Logtalk,这使得所有支持的后端 Prolog 编译器都可以使用 lambda 表达式。 有关 Logtalk 的 lambda 表达式语法的概述,请参见例如:

https://logtalk.org/2009/12/08/lambda-expressions-in-logtalk.html/

有关使用示例,请参阅:

https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/lambdas

Ulrich Neumerkel 有一个 Prolog lambda 实现。 例如,SWI-Prolog 支持它。 如果您在 Stackoverflow 中进行了搜索:

[swi-prolog] lambda

您还可以找到相当多的答案,将其用于解决方案。

此外,解释这一切的网页

Prolog 中的 lambda 表达式基本上有两种方法,它们只解决 lambda 表达式的调用,而不是高阶统一:

  • global-by-default: lambda 表达式主体中的变量默认是全局的,如果它们没有被额外的绑定器提及。

  • local-by-default: lambda 表达式主体中的变量默认是本地的,如果它们没有被额外的绑定器提及。

local-by-default 的代表是例如 Ulrich Neumerkel 的库 (lambda) 或 Logtalk 中的 lambda 表达式。 全局默认方法目前遵循 Jekejeke Prolog 中的 lambda 表达式。

这两种方法都允许对相同的数学 lambda 表达式进行建模,并通过一些进一步的语法解决以下问题:

  • 控制跨多个调用共享或不共享变量。

  • 强制对 lambda 表达式主体中的绑定器和局部变量进行 alpha 转换。

这是一个示例,通过 Y 组合器进行阶乘:

  • 全局默认:Jekejeke Prolog API
?- 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.

再见

PS:全局默认和本地默认的区别是从第 10 页借用的:
B-Prolog 的语言特性和架构
周能发,逻辑程序设计理论与实践,2011
http://www.sci.brooklyn.cuny.edu/~zhou/papers/tplp11sips.pdf

在 SWI-Prolog 中有library(yall) ( https://www.swi-prolog.org/pldoc/man?section=yall ),它甚至支持柯里化:

?- use_module(library(yall)).

?- maplist([X,Y]>>(Y #= 2*X), [1,2,3], Ys).
Ys = [2, 4, 6].

?- maplist([X,Y]>>([Z]>>(Z #= X * Y)), [1,2,3], [3,4,5], Ys).
Ys = [3, 8, 15].

?- maplist([X,Y,Z]>>(Z #= X * Y), [1,2,3], [3,4,5], Ys).
Ys = [3, 8, 15].

?- maplist([X]>>([Y]>>([Z]>>(Z #= X * Y))), [1,2,3], [3,4,5], Ys).
Ys = [3, 8, 15].

library(lambda)相同:

?- maplist(\X^(\Y^(Y #= 2*X)), [1,2,3], Ys).
Ys = [2, 4, 6].

?- maplist(\X^Y^(\Z^(Z #= X * Y)), [1,2,3], [3,4,5], Ys).
Ys = [3, 8, 15].

?- maplist(\X^Y^Z^(Z #= X * Y), [1,2,3], [3,4,5], Ys).
Ys = [3, 8, 15].

?- maplist(\X^(\Y^(\Z^(Z #= X * Y))), [1,2,3], [3,4,5], Ys).
Ys = [3, 8, 15].

但是, library(lambda)的 lambdas 也可用于“提取”查询的仅某些变量的值:

?- Xs = [1,2,3,4,5,6,7], member(X, Xs), 0 #= X mod 2, Y #= X * 2.
Xs = [1, 2, 3, 4, 5, 6, 7],
X = 2,
Y = 4 ;
Xs = [1, 2, 3, 4, 5, 6, 7],
X = 4,
Y = 8 ;
Xs = [1, 2, 3, 4, 5, 6, 7],
X = 6,
Y = 12 ;
false.

?- Y+\(Xs = [1,2,3,4,5,6,7], member(X, Xs), 0 #= X mod 2 Y #= X * 2).
Y = 4 ;
Y = 8 ;
Y = 12 ;
false.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM