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_2_n_plus_m : forall n m : nat, exp_2 (n + m) = exp_2 n * exp_2 m.