Prolog中的Lambda?

问题描述

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

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

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

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

你是怎么做的:

\(LAM)(abc,R)

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

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

实例化:

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

或部分:

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

查询

?- move(ball,F,T).

解决方法

让我们考虑以下 lambda 项:

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

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

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

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

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

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

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

?- LAM_2 = atom_chars,Res).
LAM_2 = atom_chars,c].

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

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

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

move(ball,table,floor).

现在我们可以通过将 call/2 包裹起来添加参数来逐步构建查询。

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

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