gpt4 book ai didi

Prolog - 将列表分成 n 个元素部分

转载 作者:行者123 更新时间:2023-12-01 12:20:44 24 4
gpt4 key购买 nike

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

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

有用:
% nfirst(3,[1,2,3,4,5,6],X)。
% X = [1, 2, 3]

我需要一个像下面这样的划分列表的预测:
% divide([a,b,c,d,e,f,g,h],[3,2,1,2],X).
% X = [[a,b,c],[d,e],[f],[g,h]]

最好的方法是使用 nfirst。

最佳答案

I answered here 的问题非常相似.同样,诀窍是使用 append/3length/2根据我上面的评论,“咬掉”一大块 list :

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([], _, _) 更正确。因为如果列表大小的拆分位置太多,它们会导致您失败。

现在递归的情况不难,而是因为 split_at/3将两件事放在一个列表中(可能是一个错误的选择,您可以将 split_at/4 作为改进)您必须将它们删除,并且在使 (IMO) 本身成为更好的 API 的同时,这里的逻辑有点模糊。
divide(List, [Split|Splits], [Chunk|Rest]) :-
split_at(Split, List, [Chunk, Remainder]),
divide(Remainder, Splits, Rest).

这应该相当简单:我们只需要一个 Split位置,用它来切碎 List ,并对剩下的部分重复处理。它似乎按您的预期工作:
?- divide([a,b,c,d,e,f,g,h],[3,2,1,2],X).
X = [[a, b, c], [d, e], [f], [g, h]] ;
false.

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

关于Prolog - 将列表分成 n 个元素部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44273268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com