List 列表的成员,前一个成员和列表序言
我想验证列表中的一个成员是否是前面的数字之和 示例:[0,1,3,4,18,19]。这是正确的,因为0+1+3=4List 列表的成员,前一个成员和列表序言,list,prolog,sum,append,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). 我被困在这里了。有什么想法吗?谢谢。为什么附加(A[X |
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).
我被困在这里了。有什么想法吗?谢谢。为什么附加(A[X | B],L),附加(A,B,C),和(C,X)
?这样,您希望除X
之外的所有元素的总和等于X
尚不清楚existsSum
的参数应该是什么。假设存在(输入列表、子列表、元素):
使用您的示例生成以下结果:
?- existsSum([0,1,3,4,18,19], Sublist, Element).
Sublist = [],
Element = 0 ;
Sublist = [0, 1, 3],
Element = 4 ;
false.
注意:[]
和0
也是一种解决方案,因为您是如何定义sum
谓词的,即[]
的和是0
如果以这种方式更改求和
谓词:
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.
为什么附加(A[X | B],L),附加(A,B,C),和(C,X)
?这样,您希望除X
之外的所有元素的总和等于X
尚不清楚existsSum
的参数应该是什么。假设存在(输入列表、子列表、元素):
使用您的示例生成以下结果:
?- existsSum([0,1,3,4,18,19], Sublist, Element).
Sublist = [],
Element = 0 ;
Sublist = [0, 1, 3],
Element = 4 ;
false.
注意:[]
和0
也是一种解决方案,因为您是如何定义sum
谓词的,即[]
的和是0
如果以这种方式更改求和
谓词:
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.
我认为您的问题陈述不当(或者您的示例不应该以零开始),因为我认为您基本上有两种方法可以处理列表:要么每次处理整个列表(并且您的示例失败,因为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\u sum/2
条款:
exists_sum(Total, [Total]).
这将无法统一exists_sum(4,[4 |)
,您在[0,1,3,4…]成功的问题中概述了这种情况
可能还有比这些更复杂的其他配方,但我看不到它们。我真的认为只有两种方法是有意义的。我认为你的问题陈述不当(或者你的例子不应该以零开始),因为我认为你基本上有两种方法可以处理列表:要么你每次都处理整个列表(你的例子失败是因为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\u sum/2
条款:
exists_sum(Total, [Total]).
这将无法统一exists_sum(4,[4 |)
,您在[0,1,3,4…]成功的问题中概述了这种情况
可能还有比这些更复杂的其他配方,但我看不到它们。我真的认为只有两种方法是有意义的。你能添加一个例子,说明如何调用
existsSum
以及你希望得到什么答案吗?不清楚你想如何使用它。另外,suma
可能是一个打字错误。难道[0]不是已经是0了,因此我们永远不会得到0+1+3=4吗?做一个谓词partial\u sums/2
,然后使用maplist(=/3)
,然后使用member(true)
。你能添加一个如何调用existsSum
的示例,以及你希望得到的答案吗?不清楚你想如何使用它。另外,suma
可能是一个打字错误。难道[0]不是已经是0了,因此我们永远不会得到0+1+3=4吗?做一个谓词partial\u sums/2
,然后使用maplist(=/3)
,然后使用member(true)
。