Split a list in half

list, prolog

Solution

Let's give the predicate a more relational name: `list_half_half/3`

list_half_half(Xs, Ys, Zs) :-
   length(Xs, N),
   H is N - N // 2,
   length(Ys, H),
   append(Ys, Zs, Xs).

`length/2` and `append/3` are predefined in practically all recent Prologs.

This is GNU Prolog:

| ?- append(L,_,[a,b,c,d]), list_half_half(L,H1,H2).

H1 = []
H2 = []
L = [] ? ;

H1 = [a]
H2 = []
L = [a] ? ;

H1 = [a]
H2 = [b]
L = [a,b] ? ;

H1 = [a,b]
H2 = [c]
L = [a,b,c] ? ;

H1 = [a,b]
H2 = [c,d]
L = [a,b,c,d]

Problem

I need to define divide so that List `[1,2,3,4,5]` divides into: ``` a = [1,2,3} b = [4,5] ``` I'm getting an error that says `"Arguments are not sufficiently instantiated"`, and I don't know enough about the language to figure out what my problem is, or if my design is even right. Any guidance would be appreciated. So here's what I have so far: ``` append([],L2,L2). append([H|T],L2,[H|L3]) :- append(T,L2,L3). lengthIs([],N). lengthIs([H|T],N) :- lengthIs(T,M), N is M+1. divide([],[],[]). divide([H|T],L2,L3) :- ( lengthIs(L2, M) < lengthIs(L1,N)/2 -> divide(T, append(L2, H, X), L3) ; divide(T, L2, append(L3,H,Y)) ). ```

Original source