Divide your problem into smaller parts. As you said, you have two different functions that should be combined:
- remove odd numbers from the list (
even ) - sum all squares of numbers in a list (
sumsq )
So, firstly, use different predicate names for different functions:
even([], []). even([Head | Tail], Sum) :- not(0 is Head mod 2), !, even(Tail, Sum). even([Head | Tail], [Head | Sum]) :- even(Tail, Sum). sumsq([], 0). sumsq([Head | Tail], Sum) :- sumsq(Tail, Tail_Sum), Sum is Head * Head + Tail_Sum.
In the third predicate, you can now combine the next two small steps:
sumsq_even(List, Sum) :- even(List, Even_List), sumsq(Even_List, Sum).
In this rule, the list (input) is first reduced to even elements ( Even_List ), after which the sum of the squares is calculated.
This is the result for your example:
sumsq_even([1,3,5,2,-4,6,8,-7], Sum). S = 120.