ste*_*ten 5 lambda prolog meta-predicate
我通常能够通过 maplist 找出 Lambda 的一些用法,但通常很难在 prolog 中使用 lambda。这可能是因为它与其他语言不同,因为统一。
这是症结之一:如何应用声明的 Lambda 表达式?铁
LAM = \X^R^(....)
Run Code Online (Sandbox Code Playgroud)
(奇怪,= 和 \ 之间必须有空格)
你好吗 :
\(LAM)(abc,R)
Run Code Online (Sandbox Code Playgroud)
我想做的另一件事是像 FACT 一样存储 Lambda 表达式,以便我可以查询它,但也可以像 lambda 函数一样使用它,以便我可以稍后进行绑定......我可以认为它错了..
move = \Obj^From^To(move(Obj,From,To))
Run Code Online (Sandbox Code Playgroud)
实例化:
?- \(move)(ball,ground,table).
Run Code Online (Sandbox Code Playgroud)
或部分:
?- L2 = \(move)(ball).
?- L3 = \(L2)(table,floor)
Run Code Online (Sandbox Code Playgroud)
询问 :
?- move(ball,F,T).
Run Code Online (Sandbox Code Playgroud)
让我们考虑以下 lambda 项:
?- LAM_2 = \X^R^atom_chars(X,R).
LAM_2 = \X^R^atom_chars(X, R).
Run Code Online (Sandbox Code Playgroud)
这_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]].
Run Code Online (Sandbox Code Playgroud)
请注意,变量X
和R
不会被实例化!
真正有点不寻常的是,没有直接确定逻辑变量的范围。它们在一个子句中都是全局的,所以我们要注意这些变量不会被意外重用。
另请注意,我们可以为上面的示例编写,只需:
?- LAM_2 = \X^R^atom_chars(X,R).
LAM_2 = \X^R^atom_chars(X, R).
Run Code Online (Sandbox Code Playgroud)
像 FACT 一样存储 Lambda 表达式,以便我可以查询它
为什么不直接定义事实?否则没有办法做到这一点。
你给出的例子是有道理的,前提是我们已经定义了事实:
?- 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]].
Run Code Online (Sandbox Code Playgroud)
现在我们可以通过环绕添加参数来逐步构建查询call/2
。
?- LAM_2 = atom_chars, call(LAM_2, abc, Res).
LAM_2 = atom_chars,
Res = [a, b, c].
Run Code Online (Sandbox Code Playgroud)
但是,请注意,今天很少使用这种部分目标。此外, 的直接使用call/N
主要保留给像maplist/3
.