Один из признаков того, что код не является оптимальным, заключается в том, что он убежит в лес, если вы попросите дополнительное решение в шаблоне -, +, +:
?- evenAndOdd(X, [[1,3,5], [2,4,6]]).
X = [1, 2, 3, 4, 5, 6] ;
<time passes>
Такого рода вещиявляется частым явлением, когда вручную пытаюсь сопоставить списки с индексами в Прологе.
Стилистически, я бы не стал возвращать список, содержащий ровно два списка, когда у меня могло бы быть только три аргумента вместо двух;это, в конце концов, связь между тремя списками, объединенным списком и четными и нечетными элементами.
Кроме того, просто замечая это, я не уверен, зачем здесь нужна какая-либо арифметика или какие-либо сокращения.Вот как я бы это реализовал:
evenAndOdd([], [], []).
evenAndOdd([O], [O], []).
evenAndOdd([O,E|Rest], [O|ORest], [E|ERest]) :- evenAndOdd(Rest, ORest, ERest).
Это работает со многими экземплярами:
?- evenAndOdd([1,2,3,4,5,6], O, E).
O = [1, 3, 5],
E = [2, 4, 6].
?- evenAndOdd([1,2,3,4,5], O, E).
O = [1, 3, 5],
E = [2, 4] ;
false.
?- evenAndOdd(X, [1,3,5], [2,4]).
X = [1, 2, 3, 4, 5] ;
false.
?- evenAndOdd(X, [1,3,5], [2,4,6]).
X = [1, 2, 3, 4, 5, 6].
?- evenAndOdd(X, [1,3,5], [2,4,6,8]).
false.
?- evenAndOdd([1,2,3,4,5,6], X, [2,4,6,8]).
false.
?- evenAndOdd([1,2,3,4,5,6], X, [2,4,6]).
X = [1, 3, 5].