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.

Lemma exp_n_plus_p1 : forall n p : nat, exp_n n (p + 1) = n * exp_n n p.