Search code examples
prolog

Sum only the positive elements in a list in prolog


How do i only sum all the positive numbers?

sumlist([],0).
sumlist([H|T],N):-sumlist(T,N1),N is N1 +H.

?- sumlist([-2,2,3],N).
   N = 3, unexpected.
   N = 5. % expected

Solution

  • Another method:

    plus_positive(N, Sum, Sum1) :-
        (   N > 0 ->
            plus(N, Sum, Sum1)
        ;   Sum1 = Sum
        ).
        
    sum_positive(Lst, Sum) :-
        foldl(plus_positive, Lst, 0, Sum).
    

    Result in swi-prolog:

    ?- sum_positive([-2, 2, -4, 3, -8], Sum).
    Sum = 5.