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 factTD :: Int -> Int d :: Int -> Int -> Int factTD(x) -> d(x, 1) d(x, a) -> a | x<=0 d(x, a) -> d(x-1, a*x) | x>0 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 taildown :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int taildown(F, x, i, a) -> a | i < x taildown(F, x, i, a) -> taildown(F, x, i - 1, F(a,i)) | i ≥ x