Fixpoint my_nat_iter (n : nat) {A} (f : A → A) (x : A) : A :=
match n with
| O    => x
| S n' => f (my_nat_iter n' f x)
end.
Definition gcd_IT_F (f : nat * nat → nat) (mn : nat * nat) : nat :=
match mn with
| (0, 0)       => 0
| (0, S n')    => S n'
| (S m', 0)    => S m'
| (S m', S n') =>
match le_gt_dec (S m') (S n') with
| left  _ => f (S m', S n' - S m')
| right _ => f (S m' - S n', S n')
end
end.

Axiom max_correct_l : ∀ m n : nat, m <= max m n.
Axiom max_correct_r : ∀ m n : nat, n <= max m n.