% ==========================================================================
% $Id: prime_num.pl,v 1.1 2014/01/23 04:34:04 jlang Exp $
% CSI2120 example Code for lecture 6
% ==========================================================================
% (C)opyright:
%
%   Robert Laganiere, Jochen Lang
%   EECS, University of Ottawa
%   800 King Edward Ave.
%   Ottawa, On., K1N 6N5
%   Canada. 
%   http://www.eecs.uottawa.ca/~jlang
% 
% Creator: jlang (Jochen Lang)
% Email:   jlang@eecs.uottawa.ca
% ==========================================================================
% $Log: prime_num.pl,v $
% Revision 1.1  2014/01/23 04:34:04  jlang
% Created examples for lecture 6
%
% ==========================================================================
generateInt(0,[]) :- !.
generateInt(N,[N|Xs]):- N > 0,
    N1 is N-1,generateInt(N1,Xs).

% remove multiples of X from the list [H|T]
removeMultiple(_,[],[]).                % boundary case   
removeMultiple(X,[H|T],Result) :- H>X,  % Test if H is to be removed
    H mod X =:= 0,                      % Check if current H is a multiple of X
    removeMultiple(X,T,Result),!.       % remove H and recurse
removeMultiple(X,[H|T],[H|Result]) :-   % Not a multiple keep H
    removeMultiple(X,T,Result).         % recurse

% Sieve of Eratosthenes: 
% ==========================================================================
% $Id: prime_num.pl,v 1.1 2014/01/23 04:34:04 jlang Exp $
% CSI2120 example Code for lecture 6
% ==========================================================================
% (C)opyright:
%
%   Robert Laganiere
%   EECS, University of Ottawa
%   800 King Edward Ave.
%   Ottawa, On., K1N 6N5
%   Canada. 
%   http://www.eecs.uottawa.ca/~jlang
% 
% Creator: jlang (Jochen Lang)
% Email:   jlang@eecs.uottawa.ca
% ==========================================================================
% $Log: prime_num.pl,v $
% Revision 1.1  2014/01/23 04:34:04  jlang
% Created examples for lecture 6
%
% ==========================================================================
% N is the highest number
% Li (2nd arg) is the current list of numbers to be tested
% L (3rd arg) is the result
removeAllMultiples(_,[],[]).            % no numbers left
removeAllMultiples(1,L,L).              % division by 1 
removeAllMultiples(N,Li,L):- N>1,             
    removeMultiple(N,Li,LL),            % start with N
    N1 is N-1,                          % work towards 1
    removeAllMultiples(N1,LL,L),!.      % call ourselves

primeNum(N,L):- generateInt(N,Li),      % top level
    removeAllMultiples(N,Li,L).
