Я что-то упустил. : /
Да, вы пропускаете случай, когда число равно нечетное , поскольку в этом случае 0 is X mod 2
не удастся, но Пролог не может вернуться к другому предложению, которое "удаляет" этот элемент.
Мы можем, например, добавить дополнительное предложение:
keepeven([], []).
keepeven([X|Xs], [X|Even]) :- 0 is X mod 2, keepeven(Xs, Even).
keepeven([X|Xs], <b>Even</b>) :- <b>1</b> is X mod 2, keepeven(Xs, Even).
или используйте предложение if-then-else:
keepeven([], []).
keepeven([X|Xs], R) :-
( 0 is X mod 2
-> R = [X|Even]
; R = Even),
keepeven(Xs, Even).