Java 带有lambda表达式的PROLOG
是否有支持lambda表达式的Java PROLOG实现?我知道还有其他支持lambda表达式的语言的Java实现,比如LISP和Clojure,但我确实需要一个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实现的,可以运
乌尔里奇·纽默克尔(Ulrich Neumerkel)有一个Prolog lambda实现。例如,SWI Prolog支持它。如果您在Stackoverflow中进行了搜索:
[swi-prolog] lambda
你也可以找到相当多的答案使用它的解决方案
另外,Lean Prolog的网页是用Java实现的,可以运行Logtalk,这使得lambda表达式对所有人都可用。有关Logtalk lambda表达式语法的概述,请参阅,例如: 有关用法示例,请参见:
中的lambda表达式基本上有两种方法 Prolog,它只处理lambda表达式和 非高阶统一:
- 默认情况下为全局:lambda主体中的变量 默认情况下,表达式为全局表达式(如果未提及) 用一个额外的活页夹
- 本地默认情况下:lambda主体中的变量 默认情况下,表达式是本地的(如果不是) 由一个额外的活页夹提到
- 控制变量的共享或不共享 多次调用
- 强制绑定器和局部变量的alpha转换 在lambda表达式的主体中
- 默认情况下为全局:Jekejeke Prolog
- 默认情况下为本地:
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.