set_option warn.classDefReducibility false namespace Ex1 structure A class B (a : outParam A) (α : Sort u) class C {a : A} (α : Sort u) [B a α] class D {a : A} (α : Sort u) [B a α] [c : C α] class E (a : A) where [c (α : Sort u) [B a α] : C α] instance c {a : A} [e : E a] (α : Sort u) [B a α] : C α := e.c α def d {a : A} [E a] (α : Sort u) [B a α] : D α := ⟨⟩ end Ex1 namespace Ex2 class C where f : Sort u → Nat class D extends C def a [C] := C.f Nat def b [D] := D.toC.f Nat def c [D] := C.f Nat end Ex2 namespace Ex3 section variable (N : Type _) class Zero where zero : N export Zero (zero) class Succ where succ : N → N export Succ (succ) class Succ_Not_Zero [Zero N] [Succ N] where succ_not_zero {n : N} : succ n ≠ zero export Succ_Not_Zero (succ_not_zero) class Eq_Of_Succ_Eq_Succ [Succ N] where eq_of_succ_eq_succ {n m : N} (h : succ n = succ m) : n = m export Eq_Of_Succ_Eq_Succ (eq_of_succ_eq_succ) class Nat_Induction [Zero N] [Succ N] where nat_induction {P : N → Sort u} (P0 : P zero) (ih : (k : N) → P k → P (succ k)) (n : N) : P n export Nat_Induction (nat_induction) end section variable (N : Type _) class Natural extends Zero N, Succ N, Succ_Not_Zero N, Eq_Of_Succ_Eq_Succ N, Nat_Induction N end section variable {ℕ} [Natural ℕ] def pred_with_proof (n : ℕ) (h : n ≠ zero) : Σ' m, n = succ m := by revert h let P (k : ℕ) := k ≠ zero → Σ' m, k = succ m exact (nat_induction (by simp [P]; exact False.elim) (λ k _ _ => ⟨k, rfl⟩) n : P n) def pred (n : ℕ) (h : n ≠ zero) : ℕ := (pred_with_proof n h).fst end end Ex3