Prolog 中的 Lambda 表达式?

标签 lambda prolog meta-predicate

我通常能够弄清楚 Lambda 与 maplist 的一些用法,但通常很难在 prolog 中使用 lambda。
可能是因为它与其他语言不同,因为统一。
这是症结之一:您如何应用声明的 Lambda 表达式? f.e.

LAM = \X^R^(....)
(奇怪,= 和\之间必须有空格)
你好吗 :
\(LAM)(abc,R)
我想做的另一件事是像 FACT 一样存储 Lambda 表达式,以便我可以查询它,但也可以像 lambda 函数一样拥有它,以便以后进行绑定(bind)..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/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]].

注意变量 XR不要实例化!
真正有点不寻常的是没有直接的逻辑变量范围。它们在一个子句中都是全局的,所以我们必须注意这些变量不会被意外重用。
另请注意,我们可以为上面的示例编写,只是:
?- LAM_2 = atom_chars, call(LAM_2, abc, Res).
LAM_2 = atom_chars,
Res = [a, b, c].

to store Lambda expression like a FACT, so that I can query it


为什么不直接定义事实呢?否则没有办法做到这一点。
你给出的例子是有道理的,只要我们已经定义了事实:
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 .

关于Prolog 中的 Lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65875932/

相关文章:

java - 为 lambda 表达式存储 out 范围变量的位置

variables - Prolog 中的变量绑定(bind)

Prolog为什么以下术语不统一?

list - 以递归方式将列表附加到列表列表

prolog - 从谓词中收集所有 "minimum"解决方案

prolog - 具体化 call_with_time_limit/call_with_inference_limit

c# - 在 Monotouch 中编译 lambda 并在设备上调用委托(delegate)

function - 如何返回带有守卫和双重递归的 lambda?

c++ - 如何在 lambda 中捕获此对象的变量?