/* Sum of squares (Rosetta code) in Picat. http://rosettacode.org/wiki/Sum_of_squares """ Write a program to find the sum of squares of a numeric vector. The program should work on a zero-length vector (with an answer of 0). """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. main => go. go => List = 1..5, println(sum_squares1(List)), println(sum_squares1([])), println(sum_squares2(List)), println(sum_squares2([])), println(sum_squares3(List)), println(sum_squares3([])), % comparison % fastest (using I*I) time(SS1=sum_squares1(1..5000000)), println(ss1=SS1), % slower (using I**2) time(SS1b=sum_squares1b(1..5000000)), println(ss1b=SS1b), % recursive time(SS2=sum_squares2(1..5000000)), println(ss2=SS2), % foreach loop time(SS3=sum_squares3(1..5000000)), println(ss3=SS3), % map (very slow and memory consuming) % time(SS4=sum_squares4(1..500000)), % println(ss4=SS4), nl. % fastest sum_squares1([]) = 0. sum_squares1(List) = sum([I*I : I in List]). % using I**2 is significantly slower than I*I sum_squares1b([]) = 0. sum_squares1b(List) = sum([I**2 : I in List]). % This is the fastest sum_squares2([]) = 0. sum_squares2(List) = SS => sum_squares2(List, 0, SS). sum_squares2([], SS0, SS) => SS = SS0. sum_squares2([H|T], SS0, SS) => sum_squares2(T, SS0+H*H, SS). % Slowest sum_squares3([]) = 0. sum_squares3(List) = Sum => Sum = 0, foreach(I in List) Sum := Sum + I*I end. % reverse arguments of a function, % e.g. f(A,B) -> f(B,A) rev(F,A,B) = apply(F,B,A). pow2(A) = A*A. % this is a proof-of-concept: very slow! sum_squares4(List) = List.map($rev(**,2)).sum(). % sum_squares4(List) = List.map($pow2).sum(). % variant