【问题标题】:Prolog: apply predicate to all list elements and sum resultsProlog:将谓词应用于所有列表元素并对结果求和
【发布时间】:2019-11-10 23:35:26
【问题描述】:

我有一个从谓词生成的列表,如下所示:

[a, b, c]

我还有以下谓词 p/3 可以应用于我的列表中的每个元素:

?- p(a, NewList, Number).

它会返回:

NewList = [c, d],
Number = 2.

其中 NewList 是从 a 元素新生成的列表,Number 是 NewList 的长度。

问题

我想将p/3 谓词应用于所有元素,并得到

  1. 一个列表,由所有 NewLists 中的所有元素组成,也就是所有 NewLists 附加在一起
  2. 以及所有数字的总和。

我试着这样做:

loop_list([Element|[]], NewList, Number) :-
    p(Element, NewList, Number).
loop_list([Head|Tail], [Tmp|NewList], Number) :-
    loop_list(Tail, Tmp, Number).

但失败了。

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    通常最好将您的关注点分开,一次解决一项任务。您可以在此处使用maplist/4 [swi-doc] 来调用列表中所有元素的谓词。然后这会将第三个和第四个元素与p/3 的结果统一起来。

    接下来我们可以使用append/2 [swi-doc] 将列表追加在一起,并使用sumlist/2 [swi-doc] 将列表中的元素相加。

    因此我们可以这样实现:

    loop_list(Ls, Xs, Sum) :-
        maplist(p, Ls, Xss, Items),
        append(Xss, Xs),
        sumlist(Items, Sum).

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多