Prolog - 将一个列表分成 2 个,其中以任何顺序包含原始列表的所有成员

Prolog - Split one list into 2 which contain all the members of the original one in any order

我不太擅长 Prolog 中的列表。我要做的是将一个列表 [1,2,3,4] 分成两个列表。问题是这两个列表的元素可以按任何顺序排列。

这是我现在拥有的:

divideList([],[],[]).
divideList(L1,L2,[H|T]) :-
    select(H,L1,L1C),
    length(L1,Length1),
    length([H|T],LengthHT),
    Length1 =< LengthHT,
    divideList(L1C,L2,T).
divideList(L1,L2,[H|T]) :-
    select(H,L2,L2C),
    length(L2,Length2),
    length([H|T],LengthHT),
    Length2 =< LengthHT,
    divideList(L1,L2C,T).

当我输入所有列表时它会起作用,它只需要检查它是对还是错。

?- divideList([1,2],[4,3],[1,2,3,4]).
true .
?- divideList([2,1],[4,3],[1,2,3,4]).
true .
?- divideList([2,1],[3,4],[1,2,3,4]).
true .

但是,如果我尝试这样做:?- divideList(A,[3,4],[1,2,3,4]).

它向我展示了这个ERROR: Out of global stack

当我想让它显示这个时:

?- divideList(A,[3,4],[1,2,3,4]).
A = [1,2] ;
A = [2,1].

关于如何解决这个问题有什么想法吗?

您可以使用 permutation/2:

稍微简化一下
divideList([A|As], [B|Bs], L) :-
    permutation(L, P),
    append([A|As], [B|Bs], P).

[A|As][B|Bs] 阻止 [] 成为第一个或第二个参数的解决方案。