open nat

inductive fin : nat → Type :=
| fz : Π n, fin (succ n)
| fs : Π {n}, fin n → fin (succ n)

namespace fin

  definition z_cases_on2 (C : fin zero → Type) (p : fin zero) : C p :=
  by cases p

  definition nz_cases_on2 {C  : Π n, fin (succ n) → Type}
                         (H₁ : Π n, C n (fz n))
                         (H₂ : Π n (f : fin n), C n (fs f))
                         {n  : nat}
                         (f  : fin (succ n)) : C n f :=
  begin
    cases f,
    apply (H₁ n),
    apply (H₂ n a)
  end

end fin
