【问题标题】:Lambdas in Prolog?Prolog 中的 Lambda 表达式?
【发布时间】:2021-04-28 17:41:01
【问题描述】:

我通常能够通过 maplist 找出 Lambda 的一些用法,但通常很难在 prolog 中使用 lambda。 可能是因为它与其他语言不同,因为统一。

这是症结之一:如何应用声明的 Lambda 表达式? f.e.

LAM = \X^R^(....)

(奇怪,= 和 \ 之间必须有空格)

你好吗:

\(LAM)(abc,R)

我想做的另一件事是像 FACT 一样存储 Lambda 表达式,以便我可以查询它,但也可以像 lambda 函数一样拥有它,以便以后进行绑定..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).

【问题讨论】:

  • 请参阅 this 了解应该回答您大部分问题的介绍。
  • red it before ..它只是断开了sn-ps ...没有多大帮助
  • 那些 lambda 表达式并不是真正的函数式编程中的 lambda 表达式。特别是你不能用它们来“关闭”(因为 Prolog 没有可以关闭的上下文,因为它没有“局部变量”)。您不能存储它们。它们实际上是围绕需要通过“创建适当的谓词”来调用的目标重写为“无 lambda Prolog”的“垫片”。
  • 上面的语法是this package。对于 SWI-Prolog 和 Logtalk,有另一种语法 yall。也许它更清楚?我花了一些时间才得到它。
  • @DavidTonhofer:请注意,您引用的替代方案没有键入。所以类型检查器(如 SWI 中的那个)不能与它一起使用。

标签: lambda prolog meta-predicate


【解决方案1】:

除了已经提到的SWI-Prolog package,您可能还对λProlog 感兴趣。

另外,Logtalk supports lambdas 自 2009 年以来。

【讨论】:

    【解决方案2】:

    让我们考虑以下 lambda 项:

    ?- LAM_2 = \X^R^atom_chars(X,R).
    LAM_2 = \X^R^atom_chars(X, R).
    

    _2 提醒我们缺少两个论据才能实现这一目标。

    要使用它,您现在必须提供这两个参数。可以使用一些元谓词,例如 maplist/3call/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].
    

    像 FACT 一样存储 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 这样的元谓词。

    【讨论】:

    • 所以一般来说应用 lambda fun 我们使用 call()
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多