Files
mercury/tests/benchmarks/primes.nl
Fergus Henderson aaafa54da5 Define main/2.
*.nl:
	Define main/2.
1995-03-06 05:22:25 +00:00

73 lines
1.2 KiB
Plaintext

:- module primes.
:- interface.
:- import_module list, int, io, printlist.
:- pred main1(list(int)).
:- mode main1(out) is det.
:- pred main(io__state, io__state).
:- mode main(di, uo) is det.
:- pred main3(list(int), io__state, io__state).
:- mode main3(out, di, uo) is det.
:- implementation.
main --> main3(_).
main1(Out) :-
data(Data),
primes(Data, Out).
main3(Out) -->
{ main1(Out) },
print_list(Out).
:- pred data(int).
:- mode data(out) is det.
:- pred primes(int, list(int)).
:- mode primes(in, out) is det.
:- pred integers(int, int, list(int)).
:- mode integers(in, in, out) is det.
:- pred sift(list(int), list(int)).
:- mode sift(in, out) is det.
:- pred remove(int, list(int), list(int)).
:- mode remove(in, in, out) is det.
data(98).
primes(Limit, Ps) :-
integers(2, Limit, Is),
sift(Is, Ps).
integers(Low, High, Result) :-
( Low =< High ->
M is Low + 1,
Result = [Low | Rest],
integers(M, High, Rest)
;
Result = []
).
sift([], []).
sift([I | Is], [I | Ps]) :-
remove(I, Is, New),
sift(New, Ps).
remove(_P, [], []).
remove(P, [I | Is], Result) :-
M is I mod P,
( M = 0 ->
Result = Nis,
remove(P, Is, Nis)
;
Result = [I | Nis],
remove(P, Is, Nis)
).