:- module accumbug. :- interface. :- import_module int. :- func fact(int) = int. :- implementation. :- promise all [A, B, C, ABC] (A * B) * C = ABC: int <=> A * (B * C) = ABC. %:- promise all [A, B, C, ABC] (A * B) * C = ABC <=> A * (B * C) = ABC. fact(N) = (if N > 0 then N * fact(N - 1) else 1).