Module docstring
{"# Types that are empty
In this file we define a typeclass IsEmpty, which expresses that a type has no elements.
Main declaration
IsEmpty: a typeclass that expresses that a type is empty. "}
{"# Types that are empty
In this file we define a typeclass IsEmpty, which expresses that a type has no elements.
IsEmpty: a typeclass that expresses that a type is empty.
"}IsEmpty
structure
(α : Sort*)
Empty.instIsEmpty
instance
: IsEmpty Empty
instance Empty.instIsEmpty : IsEmpty Empty :=
⟨Empty.elim⟩
PEmpty.instIsEmpty
instance
: IsEmpty PEmpty
instance PEmpty.instIsEmpty : IsEmpty PEmpty :=
⟨PEmpty.elim⟩
instIsEmptyFalse
instance
: IsEmpty False
Fin.isEmpty
instance
: IsEmpty (Fin 0)
instance Fin.isEmpty : IsEmpty (Fin 0) :=
⟨fun n ↦ Nat.not_lt_zero n.1 n.2⟩
Fin.isEmpty'
instance
: IsEmpty (Fin Nat.zero)
instance Fin.isEmpty' : IsEmpty (Fin Nat.zero) :=
Fin.isEmpty
Function.isEmpty
theorem
[IsEmpty β] (f : α → β) : IsEmpty α
protected theorem Function.isEmpty [IsEmpty β] (f : α → β) : IsEmpty α :=
⟨fun x ↦ IsEmpty.false (f x)⟩
Function.Surjective.isEmpty
theorem
[IsEmpty α] {f : α → β} (hf : f.Surjective) : IsEmpty β
theorem Function.Surjective.isEmpty [IsEmpty α] {f : α → β} (hf : f.Surjective) : IsEmpty β :=
⟨fun y ↦ let ⟨x, _⟩ := hf y; IsEmpty.false x⟩
instIsEmptyForallOfNonempty
instance
{p : α → Sort*} [∀ x, IsEmpty (p x)] [h : Nonempty α] : IsEmpty (∀ x, p x)
instance {p : α → Sort*} [∀ x, IsEmpty (p x)] [h : Nonempty α] : IsEmpty (∀ x, p x) :=
h.elim fun x ↦ Function.isEmpty <| Function.eval x
PProd.isEmpty_left
instance
[IsEmpty α] : IsEmpty (PProd α β)
instance PProd.isEmpty_left [IsEmpty α] : IsEmpty (PProd α β) :=
Function.isEmpty PProd.fst
PProd.isEmpty_right
instance
[IsEmpty β] : IsEmpty (PProd α β)
instance PProd.isEmpty_right [IsEmpty β] : IsEmpty (PProd α β) :=
Function.isEmpty PProd.snd
Prod.isEmpty_left
instance
{α β} [IsEmpty α] : IsEmpty (α × β)
instance Prod.isEmpty_left {α β} [IsEmpty α] : IsEmpty (α × β) :=
Function.isEmpty Prod.fst
Prod.isEmpty_right
instance
{α β} [IsEmpty β] : IsEmpty (α × β)
instance Prod.isEmpty_right {α β} [IsEmpty β] : IsEmpty (α × β) :=
Function.isEmpty Prod.snd
Quot.instIsEmpty
instance
{α : Sort*} [IsEmpty α] {r : α → α → Prop} : IsEmpty (Quot r)
instance Quot.instIsEmpty {α : Sort*} [IsEmpty α] {r : α → α → Prop} : IsEmpty (Quot r) :=
Function.Surjective.isEmpty Quot.exists_rep
Quotient.instIsEmpty
instance
{α : Sort*} [IsEmpty α] {s : Setoid α} : IsEmpty (Quotient s)
instance Quotient.instIsEmpty {α : Sort*} [IsEmpty α] {s : Setoid α} : IsEmpty (Quotient s) :=
Quot.instIsEmpty
instIsEmptyPSum
instance
[IsEmpty α] [IsEmpty β] : IsEmpty (α ⊕' β)
instIsEmptySum
instance
{α β} [IsEmpty α] [IsEmpty β] : IsEmpty (α ⊕ β)
instance instIsEmptySum {α β} [IsEmpty α] [IsEmpty β] : IsEmpty (α ⊕ β) :=
⟨fun x ↦ Sum.rec IsEmpty.false IsEmpty.false x⟩
instIsEmptySubtype
instance
[IsEmpty α] (p : α → Prop) : IsEmpty (Subtype p)
/-- subtypes of an empty type are empty -/
instance [IsEmpty α] (p : α → Prop) : IsEmpty (Subtype p) :=
⟨fun x ↦ IsEmpty.false x.1⟩
Subtype.isEmpty_of_false
theorem
{p : α → Prop} (hp : ∀ a, ¬p a) : IsEmpty (Subtype p)
/-- subtypes by an all-false predicate are false. -/
theorem Subtype.isEmpty_of_false {p : α → Prop} (hp : ∀ a, ¬p a) : IsEmpty (Subtype p) :=
⟨fun x ↦ hp _ x.2⟩
Subtype.isEmpty_false
instance
: IsEmpty { _a : α // False }
/-- subtypes by false are false. -/
instance Subtype.isEmpty_false : IsEmpty { _a : α // False } :=
Subtype.isEmpty_of_false fun _ ↦ id
Sigma.isEmpty_left
instance
{α} [IsEmpty α] {E : α → Type*} : IsEmpty (Sigma E)
instance Sigma.isEmpty_left {α} [IsEmpty α] {E : α → Type*} : IsEmpty (Sigma E) :=
Function.isEmpty Sigma.fst
isEmptyElim
definition
[IsEmpty α] {p : α → Sort*} (a : α) : p a
/-- Eliminate out of a type that `IsEmpty` (without using projection notation). -/
@[elab_as_elim]
def isEmptyElim [IsEmpty α] {p : α → Sort*} (a : α) : p a :=
(IsEmpty.false a).elim
isEmpty_iff
theorem
: IsEmpty α ↔ α → False
theorem isEmpty_iff : IsEmptyIsEmpty α ↔ α → False :=
⟨@IsEmpty.false α, IsEmpty.mk⟩
IsEmpty.elim
definition
{α : Sort u} (_ : IsEmpty α) {p : α → Sort*} (a : α) : p a
/-- Eliminate out of a type that `IsEmpty` (using projection notation). -/
@[elab_as_elim]
protected def elim {α : Sort u} (_ : IsEmpty α) {p : α → Sort*} (a : α) : p a :=
isEmptyElim a
IsEmpty.elim'
definition
{β : Sort*} (h : IsEmpty α) (a : α) : β
IsEmpty.prop_iff
theorem
{p : Prop} : IsEmpty p ↔ ¬p
protected theorem prop_iff {p : Prop} : IsEmptyIsEmpty p ↔ ¬p :=
isEmpty_iff
IsEmpty.forall_iff
theorem
{p : α → Prop} : (∀ a, p a) ↔ True
@[simp]
theorem forall_iff {p : α → Prop} : (∀ a, p a) ↔ True :=
iff_true_intro isEmptyElim
IsEmpty.exists_iff
theorem
{p : α → Prop} : (∃ a, p a) ↔ False
@[simp]
theorem exists_iff {p : α → Prop} : (∃ a, p a) ↔ False :=
iff_false_intro fun ⟨x, _⟩ ↦ IsEmpty.false x
IsEmpty.instSubsingleton
instance
: Subsingleton α
instance (priority := 100) : Subsingleton α :=
⟨isEmptyElim⟩
not_nonempty_iff
theorem
: ¬Nonempty α ↔ IsEmpty α
@[simp]
theorem not_nonempty_iff : ¬Nonempty α¬Nonempty α ↔ IsEmpty α :=
⟨fun h ↦ ⟨fun x ↦ h ⟨x⟩⟩, fun h1 h2 ↦ h2.elim h1.elim⟩
not_isEmpty_iff
theorem
: ¬IsEmpty α ↔ Nonempty α
@[simp]
theorem not_isEmpty_iff : ¬IsEmpty α¬IsEmpty α ↔ Nonempty α :=
not_iff_comm.mp not_nonempty_iff
isEmpty_Prop
theorem
{p : Prop} : IsEmpty p ↔ ¬p
@[simp]
theorem isEmpty_Prop {p : Prop} : IsEmptyIsEmpty p ↔ ¬p := by
simp only [← not_nonempty_iff, nonempty_prop]
isEmpty_pi
theorem
{π : α → Sort*} : IsEmpty (∀ a, π a) ↔ ∃ a, IsEmpty (π a)
@[simp]
theorem isEmpty_pi {π : α → Sort*} : IsEmptyIsEmpty (∀ a, π a) ↔ ∃ a, IsEmpty (π a) := by
simp only [← not_nonempty_iff, Classical.nonempty_pi, not_forall]
isEmpty_fun
theorem
: IsEmpty (α → β) ↔ Nonempty α ∧ IsEmpty β
nonempty_fun
theorem
: Nonempty (α → β) ↔ IsEmpty α ∨ Nonempty β
@[simp]
theorem nonempty_fun : NonemptyNonempty (α → β) ↔ IsEmpty α ∨ Nonempty β :=
not_iff_not.mp <| by rw [not_or, not_nonempty_iff, not_nonempty_iff, isEmpty_fun, not_isEmpty_iff]
isEmpty_sigma
theorem
{α} {E : α → Type*} : IsEmpty (Sigma E) ↔ ∀ a, IsEmpty (E a)
@[simp]
theorem isEmpty_sigma {α} {E : α → Type*} : IsEmptyIsEmpty (Sigma E) ↔ ∀ a, IsEmpty (E a) := by
simp only [← not_nonempty_iff, nonempty_sigma, not_exists]
isEmpty_psigma
theorem
{α} {E : α → Sort*} : IsEmpty (PSigma E) ↔ ∀ a, IsEmpty (E a)
@[simp]
theorem isEmpty_psigma {α} {E : α → Sort*} : IsEmptyIsEmpty (PSigma E) ↔ ∀ a, IsEmpty (E a) := by
simp only [← not_nonempty_iff, nonempty_psigma, not_exists]
isEmpty_subtype
theorem
(p : α → Prop) : IsEmpty (Subtype p) ↔ ∀ x, ¬p x
theorem isEmpty_subtype (p : α → Prop) : IsEmptyIsEmpty (Subtype p) ↔ ∀ x, ¬p x := by
simp only [← not_nonempty_iff, nonempty_subtype, not_exists]
isEmpty_prod
theorem
{α β : Type*} : IsEmpty (α × β) ↔ IsEmpty α ∨ IsEmpty β
@[simp]
theorem isEmpty_prod {α β : Type*} : IsEmptyIsEmpty (α × β) ↔ IsEmpty α ∨ IsEmpty β := by
simp only [← not_nonempty_iff, nonempty_prod, not_and_or]
isEmpty_pprod
theorem
: IsEmpty (PProd α β) ↔ IsEmpty α ∨ IsEmpty β
@[simp]
theorem isEmpty_pprod : IsEmptyIsEmpty (PProd α β) ↔ IsEmpty α ∨ IsEmpty β := by
simp only [← not_nonempty_iff, nonempty_pprod, not_and_or]
isEmpty_sum
theorem
{α β} : IsEmpty (α ⊕ β) ↔ IsEmpty α ∧ IsEmpty β
@[simp]
theorem isEmpty_sum {α β} : IsEmptyIsEmpty (α ⊕ β) ↔ IsEmpty α ∧ IsEmpty β := by
simp only [← not_nonempty_iff, nonempty_sum, not_or]
isEmpty_psum
theorem
{α β} : IsEmpty (α ⊕' β) ↔ IsEmpty α ∧ IsEmpty β
@[simp]
theorem isEmpty_psum {α β} : IsEmptyIsEmpty (α ⊕' β) ↔ IsEmpty α ∧ IsEmpty β := by
simp only [← not_nonempty_iff, nonempty_psum, not_or]
isEmpty_ulift
theorem
{α} : IsEmpty (ULift α) ↔ IsEmpty α
@[simp]
theorem isEmpty_ulift {α} : IsEmptyIsEmpty (ULift α) ↔ IsEmpty α := by
simp only [← not_nonempty_iff, nonempty_ulift]
isEmpty_plift
theorem
{α} : IsEmpty (PLift α) ↔ IsEmpty α
@[simp]
theorem isEmpty_plift {α} : IsEmptyIsEmpty (PLift α) ↔ IsEmpty α := by
simp only [← not_nonempty_iff, nonempty_plift]
wellFounded_of_isEmpty
theorem
{α} [IsEmpty α] (r : α → α → Prop) : WellFounded r
theorem wellFounded_of_isEmpty {α} [IsEmpty α] (r : α → α → Prop) : WellFounded r :=
⟨isEmptyElim⟩
isEmpty_or_nonempty
theorem
: IsEmpty α ∨ Nonempty α
theorem isEmpty_or_nonempty : IsEmptyIsEmpty α ∨ Nonempty α :=
(em <| IsEmpty α).elim Or.inl <| Or.inrOr.inr ∘ not_isEmpty_iff.mp
not_isEmpty_of_nonempty
theorem
[h : Nonempty α] : ¬IsEmpty α
@[simp]
theorem not_isEmpty_of_nonempty [h : Nonempty α] : ¬IsEmpty α :=
not_isEmpty_iff.mpr h
Function.extend_of_isEmpty
theorem
[IsEmpty α] (f : α → β) (g : α → γ) (h : β → γ) : Function.extend f g h = h
theorem Function.extend_of_isEmpty [IsEmpty α] (f : α → β) (g : α → γ) (h : β → γ) :
Function.extend f g h = h :=
funext fun _ ↦ (Function.extend_apply' _ _ _) fun ⟨a, _⟩ ↦ isEmptyElim a
leftTotal_empty
theorem
[IsEmpty α] : LeftTotal R
@[simp]
theorem leftTotal_empty [IsEmpty α] : LeftTotal R := by
simp only [LeftTotal, IsEmpty.forall_iff]
leftTotal_iff_isEmpty_left
theorem
[IsEmpty β] : LeftTotal R ↔ IsEmpty α
theorem leftTotal_iff_isEmpty_left [IsEmpty β] : LeftTotalLeftTotal R ↔ IsEmpty α := by
simp only [LeftTotal, IsEmpty.exists_iff, isEmpty_iff]
rightTotal_empty
theorem
[IsEmpty β] : RightTotal R
@[simp]
theorem rightTotal_empty [IsEmpty β] : RightTotal R := by
simp only [RightTotal, IsEmpty.forall_iff]
rightTotal_iff_isEmpty_right
theorem
[IsEmpty α] : RightTotal R ↔ IsEmpty β
theorem rightTotal_iff_isEmpty_right [IsEmpty α] : RightTotalRightTotal R ↔ IsEmpty β := by
simp only [RightTotal, IsEmpty.exists_iff, isEmpty_iff, imp_self]
biTotal_empty
theorem
[IsEmpty α] [IsEmpty β] : BiTotal R
@[simp]
theorem biTotal_empty [IsEmpty α] [IsEmpty β] : BiTotal R :=
⟨leftTotal_empty R, rightTotal_empty R⟩
biTotal_iff_isEmpty_right
theorem
[IsEmpty α] : BiTotal R ↔ IsEmpty β
theorem biTotal_iff_isEmpty_right [IsEmpty α] : BiTotalBiTotal R ↔ IsEmpty β := by
simp only [BiTotal, leftTotal_empty, rightTotal_iff_isEmpty_right, true_and]
biTotal_iff_isEmpty_left
theorem
[IsEmpty β] : BiTotal R ↔ IsEmpty α
theorem biTotal_iff_isEmpty_left [IsEmpty β] : BiTotalBiTotal R ↔ IsEmpty α := by
simp only [BiTotal, leftTotal_iff_isEmpty_left, rightTotal_empty, and_true]