列表成员,总结以前的成员列表prolog

时间:2018-05-06 11:03:05

标签: list prolog sum append

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

示例:[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).

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

2 个答案:

答案 0 :(得分:1)

为什么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。< / p>

如果您以这种方式更改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.

答案 1 :(得分: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 ...]成功的问题中概述的情况。

可能还有其他配方比这些更复杂,但我没有看到它们。我真的认为只有几种方法可以解决这个问题。