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_Recursion_Prolog_Append - Fatal编程技术网

List 递归追加:一个列表每次减少一个成员,并返回许多要合并的整数列表

List 递归追加:一个列表每次减少一个成员,并返回许多要合并的整数列表,list,recursion,prolog,append,List,Recursion,Prolog,Append,递归追加:一个列表每次减少一个成员,并返回许多要合并的整数列表 我期待这一结果: [0,0,0,5,5,5,3,3,2,4,4] So far I get the subsolutions : [4,4] **But I can not concatenate the rest of the solutions** [2] [3,3,3] [5,5,5] [0,0,0] 但是这个不行 /* Merge the subsolutions recursive. THIS IS THE ONE

递归追加:一个列表每次减少一个成员,并返回许多要合并的整数列表

我期待这一结果: [0,0,0,5,5,5,3,3,2,4,4]

So far I get the subsolutions :
[4,4]

**But I can not concatenate the rest of the solutions**
[2] 
[3,3,3] 
[5,5,5]
[0,0,0]
但是这个不行

/* Merge the subsolutions recursive. THIS IS THE ONE THAT DOES NOT WORK */
mergeB(S,[],[A]) :- block(S,A).
mergeB(S,X,[L|Tail],[Tail|A])  :- block(S,A), quitaUltimo(S,M), mergeB(M,X,Tail).

好吧,我还是不明白你想实现什么,但从你所说的零碎中可以看出:

“下一个想法是:从坐标列表中:L=[…],我寻找这个结果:[0,0,0,5,5,5,3,3,3,2,4,4] 到目前为止,我得到了亚解:[4,4],[3,3,3],[5,5,5],[0,0,0]。 …我想合并所有这些解决方案。”

而且,似乎您正在尝试递归地附加所有子列表,以便所有单独的结果都将在一个结果列表中结束

如果这是正确的,你想要的实际上是非常简单的名字

输入数据的输出示例:

?- flatten([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],Result).
   Result = [4, 4, 2, 3, 3, 3, 5, 5, 5, 0, 0, 0]
注意:我发现您的数据也与您试图完成的任务顺序相反。如果在构建结果时无法以递归方式修复代码,那么您可以在之后使用

因此,所有这些加在一起:

?- reverse([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],R), flatten(R,RFlat).
   R = [[0, 0, 0], [5, 5, 5], [3, 3, 3], [2], [4, 4]],
   RFlat = [0, 0, 0, 5, 5, 5, 3, 3, 3, 2, 4, 4]
编辑

一些想法:

我看到您正在获取列表的最后2个元素来处理它们,然后递归地希望对同一个列表继续这样做,只是现在删除了最后一个元素。您可以在这里使用反向列表方法,但另一种方法是:

% Gets last two elements and returns the list with last one removed
last2_and_rest([X,Y],X,Y,[X]).
last2_and_rest([H|T],X,Y,[H|A]) :- last2_and_rest(T,X,Y,A).
% Base case (*)
foo([_],[]).

% Recursively calls block on last 2 elements of list and removes last elem
foo(List,[SubResult|R]) :-
    last2_and_rest(List,X,Y,Rest),
    block(X,Y,SubResult),
    foo(Rest,R).
通过这种方式,您可以编写如下内容:

% Gets last two elements and returns the list with last one removed
last2_and_rest([X,Y],X,Y,[X]).
last2_and_rest([H|T],X,Y,[H|A]) :- last2_and_rest(T,X,Y,A).
% Base case (*)
foo([_],[]).

% Recursively calls block on last 2 elements of list and removes last elem
foo(List,[SubResult|R]) :-
    last2_and_rest(List,X,Y,Rest),
    block(X,Y,SubResult),
    foo(Rest,R).
要在最后2个元素上执行块逻辑,请在删除最后一个元素的情况下保持相同的列表,并递归地对静止列表中的每一对元素执行该操作。当列表中只剩下一个元素时,我们不能再调用last2_和_rest,因为这将给出false,因此我们相应地编写基本情况(*)

请注意,我仍然不理解您试图执行的逻辑,因此此代码不考虑/before/after/发生的任何事情。。调用block/2,但是您已经声明该部分正在工作,并且您在合并子结果时遇到了问题


当这个代码执行时——并且你正确地添加了你的逻辑——你会得到一个像[[0,0,0],[5,5,5],[3,3],…]这样的结果,然后你可以像我上面解释的那样将其展平。

我不知道这是否只是我,但我不明白你想做什么。也许你应该解释一下你是如何从[3,5)、(6,3)、(9,2)、(10,4)、(12,0)]到[0,0,0,5,5,5,3,3,3,2,4,4]的。我甚至没有看到一个具体的问题。你有这个陈述,到目前为止,我得到了子解析:
[4,4],[2],[3,3,3],[5,5,5],[0,0,0]
,但根本没有指出你运行了什么查询来获得它,或者它与你可能遇到的任何问题有什么关系。我指出了这个查询区块([(3,5)、(6,3)、(9,2)、(10,4)、(12,0)],L2)。%L2=[4,4]谢谢。但是,我如何合并子分辨率?这是我的主要问题。如果有帮助的话,我已经写了全部代码。非常感谢。我是Prolog的初学者,我试着这么做的时候都快发疯了。其他事情很简单,但我无法相信如此基本的事情会如此复杂。谢谢你这么快的回答。