This fine answer by @ code_x386 uses difference-lists and foldl/4 .
Let us use only one fold_step/3 and make the relation more general, for example:
fold_step(X, [X|Xs]+Ys, Ys+Xs). list_odds_evens(List, Odds, Evens) :- foldl(fold_step, List, Odds+Evens, []+[]).
Request examples:
?β list_odds_evens([a,b,c,d,e,f], Odds, Evens). Evens = [b,d,f], Odds = [a,c,e] ?β list_odds_evens([a,b,c,d,e,f,g], Odds, Evens). Evens = [b,d,f], Odds = [a,c,e,g]
Edit
Why not use one less clause and end the fold_step/3 predicate? lambda to the rescue!
<Preview>: - use_module (
library (lambda) ). list_odds_evens (List, Odds, Evens): - foldl (\ X ^ ([X | Xs] + Ys) ^ (Ys + Xs) ^ true, List, Odds + Evens, [] + []).