Prolog中的Lambda?

结石

我通常可以通过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]].

注意,变量XR不会实例化!

确实有点不寻常的是,没有逻辑变量的直接作用域。它们都是子句中的全局变量,因此我们必须注意这些变量不会被意外重用。

还请注意,我们可能已经为上面的示例编写了:

?- 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章