Problème 7
staload P = "lib_prime.sats"
staload "lib_prime.dats"
dataprop P7 (m : int, n : int) = | P7_Bas (1, 2)
| {m, n : int} P7_Rec (m + 1, n) of
[k : int | k < n]
($P.Prime n, P7 (m, k), {l : int | k < l && l < n} $P.Prime l -<> [0 == 1] void)
extern fun p7 {m : pos} (m : int m) :<> [n : int] (P7 (m, n) | int n)
implement main () = let
#define N 10001
val (_ | k) = p7 N
in
printf ("The %dth prime number is:\n%d\n\n",
@(N, k))
end
implement p7 (m) =
if m = 1 then (P7_Bas | 2)
else let
fun search {m, n : int} (m : int m, n : int n) : [n : int] int n = let
val (pf_prime | pr) = $P.is_prime n
in
if pr then if m = 1 then n else search (m - 1, n + 1) else search (m, n + 1)
end
val (pf, _ | result) = search (m, 2)
in
(pf | result)
end