Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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
Prolog-将列表划分为n个元素部分_Prolog - Fatal编程技术网

Prolog-将列表划分为n个元素部分

Prolog-将列表划分为n个元素部分,prolog,Prolog,我有一个预测,它得到了前N个元素: nfirst(N, _, Lnew) :- N =< 0, Lnew = []. nfirst(_, [], []). nfirst(N, [X|Y], [X|Y1]) :- N1 is N - 1, nfirst(N1, Y, Y1). 最好的方法是使用nfirst。这个问题与前面的问题非常相似。同样,诀窍是使用append/3加length/2来“咬掉”列表中的一块,根据我上面的评论: split_at(N, List, [H|[T]]) :- a

我有一个预测,它得到了前N个元素:

nfirst(N, _, Lnew) :- N =< 0, Lnew = [].
nfirst(_, [], []).
nfirst(N, [X|Y], [X|Y1]) :- N1 is N - 1, nfirst(N1, Y, Y1).

最好的方法是使用nfirst。

这个问题与前面的问题非常相似。同样,诀窍是使用
append/3
length/2
来“咬掉”列表中的一块,根据我上面的评论:

split_at(N, List, [H|[T]]) :- append(H, T, List), length(H, N).
如果运行该命令,您将看到以下内容:

?- split_at(4, [1,2,3,4,5,6,7,8], X).
X = [[1, 2, 3, 4], [5, 6, 7, 8]] ;
这是你的程序的主干,现在你只需要围绕它的递归的东西。首先,基本情况是,如果我不在列表中,我应该不在拆分位置中,从而不在结果中:

divide([], [], []).
请注意,像这样的显式基本情况使您的程序比像
divide([],\uu,\uu)
这样的程序更正确,因为如果列表大小的拆分位置过多,它们将导致您失败

现在递归的情况并不困难,但是因为
split_at/3
将两件事情放在一个列表中(可能是一个错误的选择,您可以将
split_at/4
作为一个改进),您必须将它们去掉,并且它在这里稍微模糊了逻辑,同时使(IMO)自己成为一个更好的API

divide(List, [Split|Splits], [Chunk|Rest]) :-
    split_at(Split, List, [Chunk, Remainder]),
    divide(Remainder, Splits, Rest).
这应该相当简单:我们只是取一个
拆分
位置,用它来切碎
列表
,并对剩余的部分重复处理。它似乎如您所期望的那样工作:

?- divide([a,b,c,d,e,f,g,h],[3,2,1,2],X).
X = [[a, b, c], [d, e], [f], [g, h]] ;
false.

希望这有帮助!与另一个答案相比,它可能会说明一些问题。

应该如何划分([a,b,c,d,e],[3,4],X)。?您是否必须使用您定义的
nfirst/3
?这不是最好的办法。比您定义的
nfirst/3
更好的谓词是
nfirst(N,List,First,Rest)
其中
First
是第一个
N
元素,而
R
是其余元素。这有帮助吗<代码>拆分(N,List[H |[T]]:-append(H,T,List),length(H,N)。我再次需要帮助。
?- divide([a,b,c,d,e,f,g,h],[3,2,1,2],X).
X = [[a, b, c], [d, e], [f], [g, h]] ;
false.