blob: fe4701d9842c9825ef42cce1360bb51a2876cc98 [file] [edit]
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