【问题标题】:Implement my own maplist in Prolog?在 Prolog 中实现我自己的地图列表?
【发布时间】:2013-01-12 09:11:02
【问题描述】:

我想在 Prolog 中实现我自己的地图列表。

鉴于以下情况:

myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
        apply(Goal, [Elem1, Elem2]), 
        myMaplist(Goal, Tail1, Tail2).

apply 运算符是什么,如何将其替换为 不是库系统调用吗?

【问题讨论】:

  • call/1..8 是 Prolog 的 ISO/IEC 13211-1 标准的一部分。所以这些不是“库系统调用”。

标签: prolog maplist


【解决方案1】:

如果你的 Prolog 有 call/N,使用它:

myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
        call(Goal, Elem1, Elem2), 
        myMaplist(Goal, Tail1, Tail2).

否则使用 univ 构建调用,并使用 call/1

myMaplist(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
        Pred =.. [Goal, Elem1, Elem2],
        call(Pred),
        myMaplist(Goal, Tail1, Tail2).

edit 感谢@false 指出我必须更正。说实话,我在没有测试的情况下发布了该代码,但我肯定忽略了这个错误......这里是一个更正

myMapList(_, [], []).
myMapList(Goal, [Elem1|Tail1], [Elem2|Tail2]) :-
    Goal =.. [P|A],
    append(A, [Elem1, Elem2], Ac),
    Pred =.. [P|Ac],
    call(Pred),
    myMapList(Goal, Tail1, Tail2).

测试:

?- myMapList(myMapList(=),[[1,2,3],[a,b,c]],L).
L = [[1, 2, 3], [a, b, c]] .

【讨论】:

  • 可以,但我不允许使用它(HW)。
  • 我不能使用任何系统/库调用。有什么选择吗? 10 倍!
  • 那么您也有可能无法使用 maplist。定义你自己的似乎是在作弊......
  • 你应该说明什么是允许的,没有内置你不能使用裸算术......
  • @ron:您总是需要一些内置调用来执行此操作。并且 call/1..8 是 ISO。 apply/2 是 1970 年代。这不是你的错:-)
【解决方案2】:

纯序言基于一阶逻辑,这意味着您不能将谓词作为其他谓词的参数。因此,您无法实现映射谓词。

关于apply/2swipl manual

【讨论】:

  • 另一方面:call/1..8 可以在一阶逻辑中实现——不需要二阶的一般性。
猜你喜欢
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多