Ich versuche herauszufinden, wie ein Prädikat in Prolog erstellt wird, das die Quadrate nur der geraden Zahlen in einer gegebenen Liste summiert.Erstellen eines Prädikats in Prolog, das die Quadrate nur der geraden Zahlen in einer Liste summiert
Erwarteter Ausgang:
?- sumsq_even([1,3,5,2,-4,6,8,-7], Sum).
Sum = 120 ;
false.
Was ich weiß, wie zu tun ist, um alle ungeraden Zahlen aus einer Liste zu entfernen:
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).
Was mich gibt:
Sum = [2, -4, 6, 8]
Und Ich weiß auch, wie man alle Quadrate der Zahlen in einer Liste summiert:
sumsq_even([], 0)
sumsq_even([Head | Tail], Sum) :-
sumsq_even(Tail, Tail_Sum),
Sum is Head * Head + Tail_Sum.
Aber ich kann anscheinend nicht herausfinden, wie man diese zwei zusammen verbindet. Ich denke, dass ich in die falsche Richtung gegangen bin, aber ich bin mir nicht sicher, wie ich richtige Beziehungen definieren soll, damit es Sinn ergibt.
Danke!
Idealerweise sind Ihre Prolog-Programme reine * Relationen *. Dies bedeutet, dass sie in allen Richtungen verwendbar sein sollten, beispielsweise auch im allgemeinsten Fall. Zum Beispiel möchten wir auch Antworten für "? - sumbsq_even (Ls, Sum)." Lesen Sie die Antworten von @repeat und @tas für diese Allgemeingültigkeit. – mat