Sto cercando di capire come creare un predicato in prolog che sommi i quadrati dei soli numeri pari in una data lista.Creazione di un predicato in Prolog che somma i quadrati dei soli numeri in una lista
risultato atteso:
?- sumsq_even([1,3,5,2,-4,6,8,-7], Sum).
Sum = 120 ;
false.
Quello che so fare è quello di rimuovere tutti i numeri dispari da una lista:
sumsq_even([], []).
sumsq_even([Head | Tail], Sum) :-
not(0 is Head mod 2),
!,
sumsq_even(Tail, Sum).
sumsq_even([Head | Tail], [Head | Sum]) :-
sumsq_even(Tail, Sum).
che mi dà:
Sum = [2, -4, 6, 8]
E So anche come sommare tutti i quadrati dei numeri in una lista:
sumsq_even([], 0)
sumsq_even([Head | Tail], Sum) :-
sumsq_even(Tail, Tail_Sum),
Sum is Head * Head + Tail_Sum.
Ma non riesco a capire come collegare questi due insieme. Sto pensando che forse ho sbagliato strada ma non sono sicuro di come definire le relazioni appropriate per farlo avere un senso.
Grazie!
Idealmente, i programmi Prolog sono relazioni * puri *. Ciò significa che dovrebbero essere utilizzabili in tutte le direzioni, anche nel caso più generale. Ad esempio, vorremmo anche ottenere risposte per '? - sumsq_even (Ls, Sum) .'. Controlla le risposte fornite da @repeat e @tas per questa generalità. – mat