让我们考虑以下 lambda 项:
?- LAM_2 = \X^R^atom_chars(X,R).
LAM_2 = \X^R^atom_chars(X,R).
The _2
提醒我们,要使其成为真正的目标,还缺少两个论据。
要使用它,您现在必须提供这两个参数。要么使用一些元谓词,例如maplist/3
或与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]].
请注意变量X
and R
不要实例化!
真正有点不寻常的是,没有直接确定逻辑变量的作用域。它们在子句中都是全局的,因此我们必须注意这些变量不会被意外地重用。
另请注意,我们可以为上面的示例编写:
?- 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
around.
?- 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
.