Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 列表的成员,前一个成员和列表序言_List_Prolog_Sum_Append - Fatal编程技术网

List 列表的成员,前一个成员和列表序言

List 列表的成员,前一个成员和列表序言,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 |

我想验证列表中的一个成员是否是前面的数字之和

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