language-ats-1.7.2.0: test/data/ifact2.dats
fun
ifact2
{n:nat} .<>.
(
n: int (n)
) :<> [r:int] (FACT(n, r) | int r) = let
fun loop
{i:nat|i <= n}{r:int} .<n-i>.
(
pf: FACT(i, r)
| n: int n, i: int i, r: int r
) :<> [r:int] (FACT(n, r) | int r) =
if n - i > 0 then let
val (pfmul | r1) = imul2 (i+1, r) in loop (FACTind(pf, pfmul) | n, i+1, r1)
end else (pf | r) // end of [if]
// end of [loop]
in
loop (FACTbas() | n, 0, 1)
end // end of [ifact2]