5

我通常能够弄清楚 Lambda 与 maplist 的一些用法,但通常很难在 prolog 中使用 lambda。可能是因为它与其他语言不同,因为统一。

这是症结之一:您如何应用声明的 Lambda 表达式?铁

LAM = \X^R^(....)

(奇怪,= 和 \ 之间必须有空格)

你好吗 :

\(LAM)(abc,R)

我想做的另一件事是像 FACT 一样存储 Lambda 表达式,以便我可以查询它,但也可以像 lambda 函数一样拥有它,这样我就可以稍后进行绑定..fe 就在我的头顶......我可能认为它错了..

move = \Obj^From^To(move(Obj,From,To))

实例化:

?- \(move)(ball,ground,table).

或部分:

?- L2 = \(move)(ball).
?- L3 = \(L2)(table,floor)

询问 :

?- move(ball,F,T).
4

2 回答 2

6

让我们考虑以下 lambda 项:

?- LAM_2 = \X^R^atom_chars(X,R).
LAM_2 = \X^R^atom_chars(X, R).

_2提醒我们,要使这成为一个真正的目标,缺少两个论据。

要使用它,您现在必须提供这两个参数。使用一些元谓词 likemaplist/3或 with call/3

?- LAM_2 = \X^R^atom_chars(X,R), call(LAM_2, abc, Res).
LAM_2 = \X^R^atom_chars(X, R),
Res = [a, b, c].
?- LAM_2 = \X^R^atom_chars(X,R), maplist(LAM_2, [abc,def], Xss).
LAM_2 = \X^R^atom_chars(X, R),
Xss = [[a, b, c], [d, e, f]].

请注意,变量XR没有被实例化!

真正有点不寻常的是没有直接的逻辑变量范围。它们在一个子句中都是全局的,所以我们必须注意这些变量不会被意外重用。

另请注意,我们可以为上面的示例编写,只是:

?- LAM_2 = atom_chars, call(LAM_2, abc, Res).
LAM_2 = atom_chars,
Res = [a, b, c].

像 FACT 一样存储 Lambda 表达式,以便我可以查询它

为什么不直接定义事实呢?否则没有办法做到这一点。

你给出的例子是有道理的,只要我们已经定义了事实:

move(ball, table, floor).

现在我们可以通过环绕添加参数来增量构造查询call/2

?- L1_3 = move, L2_2 = call(move, ball), L3_0 = call(L2_2, table, X), L3_0.
L1_3 = move,
L2_2 = call(move, ball),
L3_0 = call(call(move, ball), table, floor),
X = floor.

但是,请注意,今天很少使用这样的部分目标。此外, 的直接使用call/N主要保留给元谓词,如maplist/3.

于 2021-01-24T22:01:05.087 回答
1

除了已经提到的SWI-Prolog 包之外,您可能还对λProlog感兴趣。

此外,Logtalk从 2009 年开始支持 lambda 。

于 2022-02-04T06:33:03.947 回答