:- use_module(library(list_util)). :- use_module(library(tap)). zero :- split_at(0, [a,b], [], [a,b]). zero_empty :- split_at(0, [], [], []). n_small :- split_at(3, [a,b,c,d,e,f], [a,b,c], [d,e,f]). n_huge :- split_at(1000, [a,b,c], [a,b,c], []). n_huge_empty :- split_at(1000, [], [], []). unbound_l :- split_at(2, L, [a,b], [c,d]), L == [a,b,c,d]. unbound_l_huge :- split_at(400, L, [a,b,c], []), L == [a,b,c]. unbound_l_take :- split_at(3, L, Take, [d]), L = [A,B,C,d], Take = [A,B,C], maplist(var, Take). unbound_l_take_small :- split_at(3, L, Take, [d,e,f]), Take = [A,B,C], L = [A,B,C,d,e,f], maplist(var, Take). unbound_l_take_empty :- forall( split_at(5, L, Take, []), ( length(L, N), N =< 5, term_variables(L, Vs), length(Vs, N), L == Take ) ). zero_unbound_l_take :- split_at(0, L, Take, [a,b]), L == [a,b], Take == [].