/* Sieve in Picat v3. From bench/sieve.pl https://github.com/SWI-Prolog/bench For Picat v3 This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => go. go => top. %% print the found primes % All=findall(X,bp.candidate(X)), % println(All), % nl. go => true. % """ % Benchmark prime number generation using the sieve of Eratosthenes % algorithm with assert/retract. This benchmark tests assert/retract and % JIT index generation and destruction. % % Auther: Jan Wielemaker % Copyright: Public domain. % """ top :- clean, primesx(10000), fail. top. clean :- bp.retractall($primesx(_)), bp.retractall($candidate(_)). primesx(N) :- % hakank: We hard code 2 and 3 as the first two primes bp.assertz($candidate(2)), bp.assertz($candidate(3)), bp.forall($between(2, N, I), $assertz($candidate(I))), % foreach(I in 2..N) bp.assertz($candidate(I)), end, sieve(N). sieve(Max) :- bp.retract($candidate(First)), !, bp.assertz($primesx(First)), First < Max, sieve(First, 2, Max), sieve(Max). sieve(_). sieve(N, Mul, Max) :- I is N*Mul, I =< Max, !, bp.retract($candidate(I)), Mul2 is Mul+1, sieve(N, Mul2, Max). sieve(_, _, _).