SWI Prolog中是否有类似匿名谓词的内容?

时间:2019-06-19 07:17:07

标签: lambda prolog swi-prolog

我可以在SWI Prolog中定义一个匿名谓词,将其绑定到变量,然后再调用它吗?像这样:

?- F = {(X, Y) :- Y is 2 * X}, call(F, 2.0, Y).

3 个答案:

答案 0 :(得分:5)

这就是lambdas  用于:

?- use_module(library(lambda)).
true.

?- F_2 = (\X^Y^ ( Y is 2*X )), call(F_2,2.0,Y).
F_2 = \X^4.0^(4.0 is 2*X),
Y = 4.0.

答案 1 :(得分:4)

或者,在SWI-Prolog中,您可以使用library(yall)。它可以自动加载,因此您无需导入任何内容:

?- F = [X, Y]>>( Y is 2*X ), call(F, 2.0, Y).
F = [X, 4.0]>>(4.0 is 2*X),
Y = 4.0.

认为在一般情况下,最好将新变量用于调用lambda的结果:

?- F = [X, Y]>>( Y is 2*X ), call(F, 2.0, R).
F = [X, Y]>>(Y is 2*X),
R = 4.0.

答案 2 :(得分:4)

到目前为止,没有现代的lambda库支持Hiord语法,不要与Hilog语法混淆。但是由于在ISO Prolog中花括号只是函子'{}'/ 1,因此可以使用一些规则来完成自己的Hiord:

'{}'((Formal :- Body), Actual) :-
   copy_term(Formal-Body, Actual-Call),
   Call.
'{}'((Formal1,Formal2 :- Body), Actual1, Actual2) :-
   copy_term(Formal1-Formal2-Body, Actual1-Actual2-Call),
   Call.
'{}'((Formal1,Formal2,Formal3 :- Body), Actual1, Actual2, Actual3) :-
   copy_term(Formal1-Formal2-Formal3-Body, Actual1-Actual2-Actual3-Call),
   Call.
 Etc..

以下是一些示例运行:

Jekejeke Prolog 3, Runtime Library 1.3.8 (May 23, 2019)
(c) 1985-2019, XLOG Technologies GmbH, Switzerland

?- F = {X :- write(X), nl}, call(F, hello).
hello

?- F = {X,Y :- Y is X+1}, call(F, 1, R).
R = 2

?- F = {X,Y,Z :- Z is X+Y}, call(F, 1, 2, R).
R = 3

使用lambda术语时,您会看到 有很多问题。例如有一个全球性的问题 具有不同解决方案的变量。

除此以外,您可能还对允许进行交易的lambda术语感兴趣。 Hiord术语不允许使用上述实现,例如,此操作将失败:

?- G = {Y :- Y is X+1},  F = {X :- G}, call(F, 1, R).
Error: Undefined or inaccesible predicate {}/1.
    {}/1
    {}/3   

Jekejeke Prologs将为您带来更多的运气 库(experiment/abstract)也可以执行以下操作:

?- G = Y\(Y is X+1), F = X\G, call(F, 1, R).
R = 2

SWI-Prologs lambda库也可以执行以下操作:

?- G = [Y]>>(Y is X+1), F = [X]>>G, call(F, 1, R).
R = 2.

Ulrich Neumerkels库也可以执行以下操作:

?- G = \Y^(Y is X+1), F = \X^G, call(F, 1, R).
R = 2