import data.nat
open nat

definition fact1 : nat → nat
| 0        := 1
| (succ a) := (succ a) * fact1 a

open tactic

example (a : nat) : fact1 a > 0 :=
by do
  get_local `a >>= λ H, induction_core semireducible H `nat.rec_on [`n, `iH],
  trace_state, trace "-------",
  unfold [`fact1],
  swap,
  unfold [`fact1],
  trace_state,
  mk_const `mul_pos >>= apply,
  mk_const `nat.zero_lt_succ >>= apply,
  assumption,
  mk_const `zero_lt_one >>= apply
