具有lambda表达式的PROLOG

时间:2013-04-19 05:31:17

标签: java lambda prolog

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

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

4 个答案:

答案 0 :(得分:4)

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

[swi-prolog] lambda

你也可以找到很多使用它来解决问题的答案。

此外,explains it all

的网页

答案 1 :(得分:4)

Lean Prolog是用Java实现的,可以运行Logtalk,这使得lambda表达式可供所有supported backend Prolog compilers使用。有关Logtalk的lambda表达式语法的概述,请参见例如:

http://blog.logtalk.org/2009/12/lambda-expressions-in-logtalk/

有关用法示例,请参阅:

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

答案 2 :(得分:2)

lambda表达式基本上有两种方法 Prolog,只解决lambda表达式的调用问题 高阶统一:

  • global-by-default: lambda正文中的变量 如果没有提到,表达式默认是全局的 通过额外的活页夹。

  • local-by-default: lambda正文中的变量 表达式默认是本地的,如果不是 由额外的粘合剂提及。

默认为当地代表的是Ulrich Neumerkel's 库(lambda)或Logtalk中的lambda表达式。该 目前,lambda遵循全局默认方法 在Jekejeke Prolog中找到的表达。

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

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

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

这是一个例子,通过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。:借用默认全局和默认本地的区别 来自,第10页:
B-Prolog的语言特征和架构 周能发,逻辑程序设计理论与实践,2011 http://www.sci.brooklyn.cuny.edu/~zhou/papers/tplp11sips.pdf

答案 3 :(得分:1)

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