Ishmael Black
Ishmael Black

Reputation: 27

How to save even numbers in Prolog?

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

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

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

Related Questions