Reputation: 27
I tried to keep even numbers by removing the odd but there seams to be a problem.
keepeven([], []).
keepeven([X|Xs], Even) :- 0 is X mod 2, keepeven(Xs, [Even|X]).
And I tried:
keepeven([], []).
keepeven([X|Xs], [X|Even]) :- 0 is X mod 2, keepeven(Xs, Even).
I'm missing something. :/
I should get from
keepeven([1,2,3,4,5], Even).
Even = [2,4].
But I just get fail.
Upvotes: 1
Views: 190
Reputation: 476557
I'm missing something. :/
Yes, you are missing the case where the number is odd, since in that case 0 is X mod 2
will fail, but Prolog can not backtrack to another clause that "removes" that element.
We can for example add an extra clause:
keepeven([], []).
keepeven([X|Xs], [X|Even]) :- 0 is X mod 2, keepeven(Xs, Even).
keepeven([X|Xs], Even) :- 1 is X mod 2, keepeven(Xs, Even).
or use an if-then-else clause:
keepeven([], []).
keepeven([X|Xs], R) :-
( 0 is X mod 2
-> R = [X|Even]
; R = Even),
keepeven(Xs, Even).
Upvotes: 1