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_pos : forall n p : nat, 0 < n -> 0 < exp_n n p.