我通常可以通过maplist找出Lambda的一些用法,但是通常在prolog中很难使用lambda。可能是因为统一,所以它与其他语言不同。
这是症结之一:如何应用声明的Lambda表达式?FE
LAM = \X^R^(....)
(很奇怪,=和\之间必须有空格)
你好吗 :
\(LAM)(abc,R)
我想做的另一件事是将Lambda表达式像FACT一样存储,以便我可以查询它,但也像lambda函数一样具有它,以便稍后可以进行绑定。我可以认为这是错误的..
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]].
注意,变量X
和R
不会实例化!
确实有点不寻常的是,没有逻辑变量的直接作用域。它们都是子句中的全局变量,因此我们必须注意这些变量不会被意外重用。
还请注意,我们可能已经为上面的示例编写了:
?- LAM_2 = atom_chars, call(LAM_2, abc, Res).
LAM_2 = atom_chars,
Res = [a, b, c].
像事实一样存储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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句