/* Filter (Rosetta code) in Picat. http://rosettacode.org/wiki/Filter """ Select certain elements from an Array into a new Array in a generic way. To demonstrate, select all even numbers from an Array. As an option, give a second solution which filters destructively, by modifying the original Array rather than creating a new Array. """ This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import v3_utils. % import util. % import cp. main => go. go => N = 10**7, L = 1..N, % [I : I in L, I mod 2 == 0], % placed in list_comp for timing println("list_comp_mod:"), time(_ = list_comp_mod(L)), println("list_comp_even:"), time(_ = list_comp_even(L)), println("filter_pred:"), time(_ = filter_pred(L,even)), println("filter_rec:"), time(_ = filter_rec(L,even)), println("filter_findall:"), time(_ = filter_findall(L)), nl. % Is N even? p(N) :- N mod 2 == 0. list_comp_mod(L) = [I : I in L, I mod 2 == 0]. list_comp_even(L) = [I : I in L, even(I)]. filter_pred(A,F) = [N : N in A, call(F,N)]. % recursion filter_rec(A,P) = F => filter_rec(A,P,[],F). filter_rec([],_P,F,F). filter_rec([H|T],P,F0,[H|F]) :- call(P,H),!, filter_rec(T,P,F0,F). filter_rec([_H|T],P,F0,F) :- filter_rec(T,P,F0,F). filter_findall(L) = findall(E, (member(E, L), E mod 2 == 0)).