mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 01:13:30 +00:00
73 lines
1.2 KiB
Plaintext
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)
|
|
).
|