使用Prolog在长度为1,2,4,8的列表中拆分列表

时间:2017-05-16 19:26:39

标签: list prolog

我是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

1 个答案:

答案 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).
但是,它们都不是完美的。第一个是最常见的查询,而第二个不是在另一个方向上普遍终止。任何有关如何改进它们的提示都表示赞赏。