dataprop TALLY (int, int) =
| TALLYbas (0, 0) of ()
| {n:nat} {s:int}
TALLYind (n+1, s+n+1) of TALLY (n, s)
extern
prfun TALLYistot {n:nat} (): [r:int] TALLY (n, r)
extern
prfun TALLYisfun {n:nat} {r1,r2:int}
(pf1: TALLY (n, r1), pf2: TALLY (n, r2)): [r1==r2] void
fun tally2 {n:nat} (n: int n)
: [s:int] (TALLY (n, s) | int (s)) = let
fun aux {n:nat} {s:int}
(pf: TALLY (n, s) | n: int n): int s =
if n = 0 then let
prval TALLYbas () = pf in 0
end else let
prval TALLYind pf1 = pf
val s1 = aux (pf1 | n-1) in s1 + n
end prval pf = TALLYistot (); val s = aux (pf | n)
in
(pf | s)
end
implement
main () = () where {
#define N 100
val (pf | ans) = tally2 (N)
val () = printf ("sum(1 ... %i) = %i\n", @(N, ans))
}