我是prolog的新手,需要在长度为2 ^ 1,2 ^ 2,2 ^ 3 ... 2 ^ n的列表中编写拆分列表的关系,例如,如果我们有[1, 2,3,4,5,6,7,8,9]我们应该[[1],[2,3],[4,5,6,7],[8,9]]我解决了它Haskell但不知道如何在prolog中制作它
blocks :: Int -> [a] -> [[a]]
blocks _ [] = []
blocks n ls = la : blocks (2*n) lb
where ~(la,lb) = splitAt n ls
答案 0 :(得分:1)
这个解决方案应该易于理解和学习(不是以效率为准):
split(L, X) :- split(L, 1, X).
split([], _, []).
split(X, N, [X]) :-
length(X, M),
M #< N, M #> 0.
split(L, N, [X|Xs]) :-
N0 #= N * 2,
length(X, N),
append(X, R, L),
split(R, N0, Xs).
这是一个更密切关注你的Haskell代码的版本:
split_at_squares(L, X) :-
split_at_squares_(L, 1, X).
split_at_squares_([],_,[]).
split_at_squares_([L|Ls], I, [X|Xs]) :-
split_at(I, [L|Ls], X, Xs0),
J #= I * 2,
split_at_squares_(Xs0, J, Xs).
split_at(I, L, P, S) :-
length(L, LL),
J #= min(I, LL),
length(P, J),
append(P, S, L).
但是,它们都不是完美的。第一个是最常见的查询,而第二个不是在另一个方向上普遍终止。任何有关如何改进它们的提示都表示赞赏。