【问题标题】:Member of a list, sum previous members list prolog列表的成员,总结以前的成员列表序言
【发布时间】:2018-10-16 08:37:12
【问题描述】:

我想验证列表的成员是否是前面数字的总和。

示例:[0,1,3,4,18,19]。这是正确的,因为 0+1+3 = 4

sum_([],0).
sum_([X|XS],R):- suma(XS,R1), R is X + R1.


existsSum(L,[X|C]):-append(A,[X|B],L),
                    append(A,B,C),
                    sum_(C,X).

我被困在这里。任何想法?谢谢。

【问题讨论】:

  • 您能否添加一个示例,说明您将如何调用existsSum 以及您期望的答案是什么?目前尚不清楚您想如何使用它。另外,suma 可能是一个错字。
  • 不会 [0] 已经是 0,因此我们永远不会达到 0+1+3=4?
  • 创建谓词partial_sums/2,然后使用maplist(==/3),然后使用member(true)

标签: list prolog sum append


【解决方案1】:

我认为你的问题是错误的(或者你的例子不应该从零开始),因为我认为你基本上有两种方法可以处理列表:或者你每次都处理整个列表(你的例子失败,因为 0 +1+3+4+18 != 19) 或者您的期望值与列表的头部匹配时立即停止,在这种情况下 [0] 已经成功。

最后,处理列表的方法并不多。当你有元素时你必须做出决定,当你没有元素时你必须做出决定。假设我们希望在达到与迄今为止的总和相匹配的值时立即成功。我们可以这样简单地建模:

exists_sum(List) :- exists_sum(0, List).

exists_sum(RunningTotal, [RunningTotal|_]).
exists_sum(RunningTotal, [H|T]) :- 
  NewRunningTotal is RunningTotal + H,
  exists_sum(NewRunningTotal, T).

请注意,使用此公式,[0|_] 已经成功。另请注意,我没有空列表案例:如果我在尚未成功的情况下将其排到列表的末尾,则那里没有解决方案,因此无话可说。

另一种表述是要求处理整个列表,这基本上是将第一个exists_sum/2 子句替换为:

exists_sum(Total, [Total]).

这将无法统一exists_sum(4, [4|_]),这是您在 [0,1,3,4...] 成功的问题中概述的情况。

可能还有其他比这些更复杂的公式,但我没有看到它们。我真的认为只有几种方法可以做到这一点。

【讨论】:

    【解决方案2】:

    为什么是append(A,[X|B],L),append(A,B,C),sum_(C,X)?这样,您希望除X 之外的所有元素的总和等于X

    不清楚existsSum 的参数应该是什么。假设existsSum(InputList, SubList, Element)

    existsSum(L,A,X) :- append(A,[X|_B],L), sum_(A,X).
    

    用你的例子产生这些结果:

    ?- existsSum([0,1,3,4,18,19], Sublist, Element).
    Sublist = [],
    Element = 0 ;
    Sublist = [0, 1, 3],
    Element = 4 ;
    false.
    

    注意:[]0 也是一个解决方案,因为您如何定义 sum_ 谓词,即 [] 的总和是 0

    如果您以这种方式更改 sum_ 谓词:

    sum_([X],X).
    sum_([X|XS],R):- sum_(XS,R1),R is X + R1.
    

    它仅针对非空列表定义,在这种情况下,您只能从示例中得到一个结果:

    ?- existsSum([0,1,3,4,18,19], Sublist, Element).
    Sublist = [0, 1, 3],
    Element = 4 ;
    false.
    

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多