Java 带有lambda表达式的PROLOG

Java 带有lambda表达式的PROLOG,java,lambda,prolog,Java,Lambda,Prolog,是否有支持lambda表达式的Java PROLOG实现?我知道还有其他支持lambda表达式的语言的Java实现,比如LISP和Clojure,但我确实需要一个PROLOG实现 乌尔里奇·纽默克尔(Ulrich Neumerkel)有一个Prolog lambda实现。例如,SWI Prolog支持它。如果您在Stackoverflow中进行了搜索: [swi-prolog] lambda 你也可以找到相当多的答案使用它的解决方案 另外,Lean Prolog的网页是用Java实现的,可以运

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


乌尔里奇·纽默克尔(Ulrich Neumerkel)有一个Prolog lambda实现。例如,SWI Prolog支持它。如果您在Stackoverflow中进行了搜索:

[swi-prolog] lambda
你也可以找到相当多的答案使用它的解决方案


另外,Lean Prolog的网页是用Java实现的,可以运行Logtalk,这使得lambda表达式对所有人都可用。有关Logtalk lambda表达式语法的概述,请参阅,例如:

有关用法示例,请参见:


中的lambda表达式基本上有两种方法 Prolog,它只处理lambda表达式和 高阶统一:

  • 默认情况下为全局:lambda主体中的变量 默认情况下,表达式为全局表达式(如果未提及) 用一个额外的活页夹

  • 本地默认情况下:lambda主体中的变量 默认情况下,表达式是本地的(如果不是) 由一个额外的活页夹提到

默认情况下,地方政府的代表是乌尔里希·纽默克尔(Ulrich Neumerkel)的代表 库(lambda)或在Logtalk中找到的lambda表达式。这个 全局默认方法当前由lambda遵循 Jekejeke序言中的表达式

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

  • 控制变量的共享或不共享 多次调用

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

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

  • 默认情况下为全局:Jekejeke Prolog
?-Y=F\X^call(X\call(F,call(X,X)),X\call(F,call(X,X)), 事实=F\J^H^M^N^N\J^H^M^M\J^H^(N=0,M=1;N>0,H为N-1,调用(F,H,J),M为N*J), 呼叫(Y,事实,10,R)。 R=3628800。
  • 默认情况下为本地:
?-Y=\F^调用([F]+\X^调用(F,调用(X,X)),[F]+\X^调用(F,调用(X,X)), 事实=\F^([F]+\N^([N,F]+\M^(N=0,M=1;N>0,H为N-1,调用(F,H,J),M为N*J)), 呼叫(Y,事实,10,R)。 R=3628800。 再见

备注:默认借用全局和本地的区别 从,第10页:
B-Prolog的语言特性和体系结构
周能发,逻辑编程理论与实践,2011

在SWI Prolog中有
库(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].
库(lambda)
相同:

但是
库(lambda)
的lambda也可用于“提取”查询中某些变量的值:

?- 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.

Ulrich的lambda库是一个Prolog实现,但不是ISO Prolog实现(例如,它使用非ISO标准谓词strip_模块/3和非ISO标准指令meta_谓词/1)。它还需要一个Prolog编译器来支持不符合ISO Prolog模块标准的模块系统。@PauloMoura:请阅读!它既不包含strip_module/3,也不包含meta_谓词,也不包含任何模块引用。您提到的SWI实现考虑了SWI的几个实现特定功能,包括您提到的功能。但你还遗漏了更多的内容。你的链接指向了网页中的一个部分,该部分的第一句话是“这是完整的实现,包括手册。”(我的重点)。关于我遗漏的其他内容,我确实写了“(例如…”,这是“例如”的缩写。@PauloMoura:lambdas的整个机制完全是ISO Prolog,这就是你所质疑的。对于SWI,lambda被放在一个关于SWI模块系统的模块中。我建议您编辑您引用的部分()并将第一句链接文本重命名为“完整实施,包括手册”?“full”一词强烈暗示该部分的其余部分包含了实现所必需但不完整的代码。“完整”一词与您在此处的评论不一致。但是你可以很容易地解决这个问题。你也可以使用
library(yall)
来“提取”查询中一些变量的值:
{Y}/(Xs=[1,2,3,4,5,6,7],member(X,Xs),0#=xmod2,Y#=X*2)
。哦,我想知道!所以
library(yall)有两种不同的语法
?不,只有一种语法:
{…}/[…]>>目标
。但是如果没有lambda自由变量或lambda参数,则
{…}
[…]
都是可选的。有关语法的历史注释,请参阅库文档或本文档。
?- 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].
?- 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].
?- 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.