PUBS: A Practical Upper Bounds Solver

(* * * * * * * * * * *
 * Resource Aware ML *
 * * * * * * * * * * *
 *
 * File:
 *   eratosthenes.raml
 *
 * Author:
 *   Jan Hoffmann (2009)
 *
 * Resource Bound:
 *   O(n^2)
 *
 * Description: 
 *   The Sieve of Eratosthenes.  A nice and simple way to compute prime
 *   numbers.  See for example
 *   http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes.
 *)


eratos : L(int) -> L(int)

eratos l = let _=tick(1) in
            match l with
               | nil -> nil
               | (x::xs) -> x::eratos(filter(x,xs)) ;
(*
eq(eratos(A),1,[],[A=0]).
eq(eratos(A),1,[eratos(As),filter(X,As)],[A>=1,As=A-1]). % %%out_filter(A,B) = B
*)
 filter: (int,L(int)) -> L(int)
 (* Destructive!*)
 
 filter(p,l) =  let _=tick(1) in
                matchD l with
                | nil -> nil
                | (x::xs) -> let xs' = filter(p,xs) in
                             if x mod p == 0 then xs' else x::xs';
(*
eq(out_filter(A,B),0,[],[B=0]).
eq(out_filter(A,B),0,[out_filter(A,Bs)],[B>=1,Bs = B-1]).
eq(out_filter(A,B),1,[out_filter(A,Bs)],[B>=1,Bs = B-1]).

eq(filter(A,B),1,[],[B=0]).
eq(filter(A,B),1,[filter(A,Bs)],[B>=1,Bs = B-1]).
*)

main =()