Fixpoint exp_2 (n : nat) : nat :=
  match n return nat with
  | O =>
      (*O*)  1 
      (*S p*) 
  | S p => 2 * exp_2 p
  end.Fixpoint exp_n (n m : nat) {struct m} : nat :=
  match m return nat with
  | O =>
      (*O*)  1 
      (*S p*) 
  | S p => n * exp_n n p
  end.

(* Specifications: *)
Lemma eq_exp_2_exp_n : forall n : nat, exp_2 n = exp_n 2 n.
Lemma exp_2_n_plus_n : forall n : nat, exp_2 n + exp_2 n = exp_2 (S n).
Lemma exp_2_plus_pn_pn : forall n : nat, 0 < n -> exp_2 (pred n) + exp_2 (pred n) = exp_2 n.
Lemma exp_2_le_pn_n : forall n : nat, exp_2 (pred n) <= exp_2 n.
Lemma exp_2_pos : forall n : nat, 0 < exp_2 n.
Lemma exp_2_incr : forall n m : nat, n <= m -> exp_2 n <= exp_2 m.
Lemma exp_2_n_plus_m : forall n m : nat, exp_2 (n + m) = exp_2 n * exp_2 m.
Lemma exp_n_incr : forall n m p : nat, n <= m -> exp_n n p <= exp_n m p.
Lemma exp_n_neutre : forall n : nat, exp_n 1 n = 1.
Lemma exp_n_plus_mult : forall n m p : nat, exp_n n (m + p) = exp_n n m * exp_n n p.
Lemma exp_n_permut : forall n m p : nat, exp_n n (m * p) = exp_n (exp_n n p) m.
Lemma exp_n_plus_p1 : forall n p : nat, exp_n n (p + 1) = n * exp_n n p.
Lemma exp_n_pos : forall n p : nat, 0 < n -> 0 < exp_n n p.
Lemma le_exp_n_mult : forall n p : nat, 0 < n -> exp_n n p <= n * exp_n n p.