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]
阻止 []
成为第一个或第二个参数的解决方案。
我不太擅长 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]
阻止 []
成为第一个或第二个参数的解决方案。