let combi_1 : ((int -> int -> int) ref -> int -> int -> int) -> int -> int -> int = fun u -> ( (fun v -> (v := u v; !v))(ref (fun x -> (fun i -> 0))) ) let f_1 : (int -> int -> int) ref -> int -> int -> int = fun y i j -> if (i = 0) then 0 else (j + (!y) (i - 1) j) let combi_2 : (((int -> int -> int) -> int -> int) ref -> (int -> int -> int) -> int -> int) -> (int -> int -> int) -> int -> int = fun u -> ( (fun v -> (v := u v; !v))(ref (fun x -> (fun i -> 0))) ) let f_2 : ((int -> int -> int) -> int -> int) ref -> (int -> int -> int) -> int -> int = fun y f i -> if (i = 0) then 1 else (f i ((!y) f (i - 1))) let fact : int -> int = combi_2 f_2 (combi_1 f_1)