/*  VAX C-Prolog Benchmark Package  /*
/*  Copyright 1985 by Tektronix, Inc., and Portland State University  /*
 
 
/*    The sieve of Erastosthenes.                                        */
/*                                                                       */
/*    Benchmark prolog program which requires the upper limit as a       */
/*    parameter, and will find all prime numbers between 1 and upper     */
/*    bound. Execution time is given in milliseconds.                    */
/*                                                                       */
 
primes(Limit, Prime_nums) :-
      integer_list(2,Limit,Ints),
      sift(Ints,Prime_nums).
 
integer_list(Low,High,[Low|Rest]) :-
      Low =< High, !,
      M is Low + 1,
      integer_list(M,High,Rest).
 
integer_list(_,_,[]).
 
sift([],[]).
 
sift([Int|Ints],[Int|Primes]) :-
      remove(Int,Ints,New),
      sift(New,Primes).
 
remove(Prime,[],[]).
 
remove(Prime,[Int|Ints],[Int|New_ints]) :-
      not(0 is Int mod Prime), !,
      remove(Prime,Ints,New_ints).
 
remove(Prime,[Int|Ints],New_ints) :-
      0 is Int mod Prime, !,
      remove(Prime,Ints,New_ints).
 
