factTU :: Int -> Int u :: Int -> Int -> Int -> Int factTU(x) -> u(x, 1, 1) u(x, i, a) -> a | i>x u(x, i, a) -> u(x, i+1, i*a) | i<=x factRD :: Int -> Int factRD(x) -> 1 | x<=1 factRD(x) -> x*factRD(x-1) | x>1 tailup :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int tailup(F, i, y, a) -> a | i > y tailup(F, i, y, a) -> tailup(F, i + 1, y, F(i, a)) | i ≤ y recdown :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int recdown(F, x, i, a) -> a | i < x recdown(F, x, i, a) -> F(i, recdown(F, x, i - 1, a)) | i ≥ x