Próbuję dowiedzieć się, jak utworzyć predykat w prologu, który sumuje kwadraty tylko liczb parzystych z danej listy.Tworzenie predykatu w Prologu, który sumuje kwadraty tylko liczb parzystych na liście
wyjście z oczekiwaniami:
?- sumsq_even([1,3,5,2,-4,6,8,-7], Sum).
Sum = 120 ;
false.
Co wiem, jak zrobić, to usunąć wszystkie numery nieparzyste z listy:
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).
co daje mi:
Sum = [2, -4, 6, 8]
I Wiem również, jak sumować wszystkie kwadraty liczb na liście:
sumsq_even([], 0)
sumsq_even([Head | Tail], Sum) :-
sumsq_even(Tail, Tail_Sum),
Sum is Head * Head + Tail_Sum.
Ale nie mogę wymyślić, jak połączyć te dwa elementy. Myślę, że mogłem pójść w niewłaściwą stronę, ale nie jestem pewien, jak zdefiniować właściwe relacje, aby było to sensowne.
Dzięki!
Idealnie, twoje programy Prolog są czyste * relacje *. Oznacza to, że powinny być użyteczne we wszystkich kierunkach, na przykład w najbardziej ogólnym przypadku. Na przykład chcielibyśmy uzyskać odpowiedzi na '? - sumsq_even (Ls, Sum).". Sprawdź odpowiedzi udzielone przez @repeat i @tas dla tej ogólności. – mat