将列表拆分为一半

时间:2017-12-07 20:32:09

标签: list prolog

尝试编写代码,将偶数元素的列表分成两半,例如。 split([1,2,3,4],A,B)A = [1,2]B = [3,4]

对于奇数个元素,行为类似于Java list.length()/2,因此split([1,2,3,4,5],A,B)会提供A = [1,2]B = [3,4,5]

我能得到的最接近的是这样的,但这不太对,只适用于偶数。

split(L, A, B) :-
  append(A, B, L),
  length(A, N),
  length(B, N).

1 个答案:

答案 0 :(得分:2)

在Prolog中将列表拆分为一半的一种方法是使用append/3same_length/2谓词:

split(List, Left, Right) :-
    same_length(Left, Right),
    append(Left, Right, List).
split(List, Left, [R|Rs]) :-
    same_length(Left, Rs),
    append(Left, [R|Rs], List).

这会给你:

| ?- split(L, A, B).
A = B, B = L, L = [] ;
A = [_1038],
B = [_1048],
L = [_1038, _1048] ;
A = [_1038, _1044],
B = [_1054, _1060],
L = [_1038, _1044, _1054, _1060] ;
A = [_1038, _1044, _1050],
B = [_1060, _1066, _1072],
L = [_1038, _1044, _1050, _1060, _1066, _1072] ;
...