Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2021 Floris van Doorn. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Floris van Doorn

! This file was ported from Lean 3 source module logic.is_empty
! leanprover-community/mathlib commit c4658a649d216f57e99621708b09dcb3dcccbd23
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Logic.Function.Basic

/-!
# 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.
-/


variable {
α: Sort ?u.1588
α
β: Sort ?u.507
β
γ: Sort ?u.34
γ
:
Sort _: Type ?u.5
Sort
Sort _: Type ?u.5
_
} /-- `IsEmpty α` expresses that `α` is empty. -/ class
IsEmpty: ∀ {α : Sort u_1}, (αFalse) → IsEmpty α
IsEmpty
(
α: Sort ?u.20
α
:
Sort _: Type ?u.20
Sort
Sort _: Type ?u.20
_
) :
Prop: Type
Prop
where protected
false: ∀ {α : Sort u_1} [self : IsEmpty α], αFalse
false
:
α: Sort ?u.20
α
False: Prop
False
#align is_empty
IsEmpty: Sort u_1 → Prop
IsEmpty
instance: IsEmpty Empty
instance
:
IsEmpty: Sort ?u.46 → Prop
IsEmpty
Empty: Type
Empty
:= ⟨
Empty.elim: ∀ {C : Sort ?u.53}, EmptyC
Empty.elim
instance: IsEmpty PEmpty
instance
:
IsEmpty: Sort ?u.70 → Prop
IsEmpty
PEmpty: Sort ?u.71
PEmpty
:= ⟨
PEmpty.elim: ∀ {C : Sort ?u.79}, PEmptyC
PEmpty.elim
instance: IsEmpty False
instance
:
IsEmpty: Sort ?u.97 → Prop
IsEmpty
False: Prop
False
:= ⟨
id: ∀ {α : Sort ?u.104}, αα
id
instance
Fin.isEmpty: IsEmpty (Fin 0)
Fin.isEmpty
:
IsEmpty: Sort ?u.121 → Prop
IsEmpty
(
Fin: Type
Fin
0: ?m.123
0
) := ⟨fun
n: ?m.139
n
Nat.not_lt_zero: ∀ (n : ), ¬n < 0
Nat.not_lt_zero
n: ?m.139
n
.
1: {n : } → Fin n
1
n: ?m.139
n
.
2: ∀ {n : } (self : Fin n), self < n
2
protected theorem
Function.isEmpty: ∀ {α : Sort u_2} {β : Sort u_1} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
[
IsEmpty: Sort ?u.163 → Prop
IsEmpty
β: Sort ?u.157
β
] (
f: αβ
f
:
α: Sort ?u.154
α
β: Sort ?u.157
β
) :
IsEmpty: Sort ?u.170 → Prop
IsEmpty
α: Sort ?u.154
α
:= ⟨fun
x: ?m.180
x
IsEmpty.false: ∀ {α : Sort ?u.182} [self : IsEmpty α], αFalse
IsEmpty.false
(
f: αβ
f
x: ?m.180
x
)⟩ #align function.is_empty
Function.isEmpty: ∀ {α : Sort u_2} {β : Sort u_1} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
instance: ∀ {α : Sort u_1} {p : αSort u_2} [h : Nonempty α] [inst : ∀ (x : α), IsEmpty (p x)], IsEmpty ((x : α) → p x)
instance
{
p: αSort ?u.210
p
:
α: Sort ?u.199
α
Sort _: Type ?u.210
Sort
Sort _: Type ?u.210
_
} [
h: Nonempty α
h
:
Nonempty: Sort ?u.213 → Prop
Nonempty
α: Sort ?u.199
α
] [∀
x: ?m.217
x
,
IsEmpty: Sort ?u.220 → Prop
IsEmpty
(
p: αSort ?u.210
p
x: ?m.217
x
)] :
IsEmpty: Sort ?u.224 → Prop
IsEmpty
(∀
x: ?m.226
x
,
p: αSort ?u.210
p
x: ?m.226
x
) :=
h: Nonempty α
h
.
elim: ∀ {α : Sort ?u.235} {p : Prop}, Nonempty α(αp) → p
elim
fun
x: ?m.244
x
Function.isEmpty: ∀ {α : Sort ?u.247} {β : Sort ?u.246} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
<|
Function.eval: {α : Sort ?u.259} → {β : αSort ?u.258} → (x : α) → ((x : α) → β x) → β x
Function.eval
x: ?m.244
x
instance
PProd.isEmpty_left: ∀ {α : Sort u_1} {β : Sort u_2} [inst : IsEmpty α], IsEmpty (PProd α β)
PProd.isEmpty_left
[
IsEmpty: Sort ?u.317 → Prop
IsEmpty
α: Sort ?u.308
α
] :
IsEmpty: Sort ?u.320 → Prop
IsEmpty
(
PProd: Sort ?u.322 → Sort ?u.321 → Sort (max(max1?u.322)?u.321)
PProd
α: Sort ?u.308
α
β: Sort ?u.311
β
) :=
Function.isEmpty: ∀ {α : Sort ?u.326} {β : Sort ?u.325} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
PProd.fst: {α : Sort ?u.337} → {β : Sort ?u.336} → PProd α βα
PProd.fst
instance
PProd.isEmpty_right: ∀ {α : Sort u_1} {β : Sort u_2} [inst : IsEmpty β], IsEmpty (PProd α β)
PProd.isEmpty_right
[
IsEmpty: Sort ?u.378 → Prop
IsEmpty
β: Sort ?u.372
β
] :
IsEmpty: Sort ?u.381 → Prop
IsEmpty
(
PProd: Sort ?u.383 → Sort ?u.382 → Sort (max(max1?u.383)?u.382)
PProd
α: Sort ?u.369
α
β: Sort ?u.372
β
) :=
Function.isEmpty: ∀ {α : Sort ?u.387} {β : Sort ?u.386} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
PProd.snd: {α : Sort ?u.400} → {β : Sort ?u.399} → PProd α ββ
PProd.snd
instance
Prod.isEmpty_left: ∀ {α : Type u_1} {β : Type u_2} [inst : IsEmpty α], IsEmpty (α × β)
Prod.isEmpty_left
{
α: Type ?u.452
α
β: Type ?u.451
β
} [
IsEmpty: Sort ?u.447 → Prop
IsEmpty
α: ?m.441
α
] :
IsEmpty: Sort ?u.450 → Prop
IsEmpty
(
α: ?m.441
α
×
β: ?m.444
β
) :=
Function.isEmpty: ∀ {α : Sort ?u.458} {β : Sort ?u.457} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
Prod.fst: {α : Type ?u.473} → {β : Type ?u.472} → α × βα
Prod.fst
instance
Prod.isEmpty_right: ∀ {α : Type u_1} {β : Type u_2} [inst : IsEmpty β], IsEmpty (α × β)
Prod.isEmpty_right
{
α: ?m.513
α
β: Type ?u.523
β
} [
IsEmpty: Sort ?u.519 → Prop
IsEmpty
β: ?m.516
β
] :
IsEmpty: Sort ?u.522 → Prop
IsEmpty
(
α: ?m.513
α
×
β: ?m.516
β
) :=
Function.isEmpty: ∀ {α : Sort ?u.530} {β : Sort ?u.529} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
Prod.snd: {α : Type ?u.547} → {β : Type ?u.546} → α × ββ
Prod.snd
instance: ∀ {α : Sort u_1} {β : Sort u_2} [inst : IsEmpty α] [inst : IsEmpty β], IsEmpty (α ⊕' β)
instance
[
IsEmpty: Sort ?u.587 → Prop
IsEmpty
α: Sort ?u.578
α
] [
IsEmpty: Sort ?u.590 → Prop
IsEmpty
β: Sort ?u.581
β
] :
IsEmpty: Sort ?u.593 → Prop
IsEmpty
(
PSum: Sort ?u.595 → Sort ?u.594 → Sort (max(max1?u.595)?u.594)
PSum
α: Sort ?u.578
α
β: Sort ?u.581
β
) := ⟨fun
x: ?m.605
x
PSum.rec: ∀ {α : Sort ?u.608} {β : Sort ?u.607} {motive : α ⊕' βSort ?u.609}, (∀ (val : α), motive (PSum.inl val)) → (∀ (val : β), motive (PSum.inr val)) → ∀ (t : α ⊕' β), motive t
PSum.rec
IsEmpty.false: ∀ {α : Sort ?u.649} [self : IsEmpty α], αFalse
IsEmpty.false
IsEmpty.false: ∀ {α : Sort ?u.671} [self : IsEmpty α], αFalse
IsEmpty.false
x: ?m.605
x
instance: ∀ {α : Type u_1} {β : Type u_2} [inst : IsEmpty α] [inst : IsEmpty β], IsEmpty (α β)
instance
{
α: ?m.730
α
β: ?m.733
β
} [
IsEmpty: Sort ?u.736 → Prop
IsEmpty
α: ?m.730
α
] [
IsEmpty: Sort ?u.739 → Prop
IsEmpty
β: ?m.733
β
] :
IsEmpty: Sort ?u.742 → Prop
IsEmpty
(
Sum: Type ?u.744 → Type ?u.743 → Type (max?u.744?u.743)
Sum
α: ?m.730
α
β: ?m.733
β
) := ⟨fun
x: ?m.756
x
Sum.rec: ∀ {α : Type ?u.759} {β : Type ?u.758} {motive : α βSort ?u.760}, (∀ (val : α), motive (Sum.inl val)) → (∀ (val : β), motive (Sum.inr val)) → ∀ (t : α β), motive t
Sum.rec
IsEmpty.false: ∀ {α : Sort ?u.799} [self : IsEmpty α], αFalse
IsEmpty.false
IsEmpty.false: ∀ {α : Sort ?u.823} [self : IsEmpty α], αFalse
IsEmpty.false
x: ?m.756
x
⟩ /-- subtypes of an empty type are empty -/
instance: ∀ {α : Sort u_1} [inst : IsEmpty α] (p : αProp), IsEmpty (Subtype p)
instance
[
IsEmpty: Sort ?u.884 → Prop
IsEmpty
α: Sort ?u.875
α
] (
p: αProp
p
:
α: Sort ?u.875
α
Prop: Type
Prop
) :
IsEmpty: Sort ?u.891 → Prop
IsEmpty
(
Subtype: {α : Sort ?u.892} → (αProp) → Sort (max1?u.892)
Subtype
p: αProp
p
) := ⟨fun
x: ?m.906
x
IsEmpty.false: ∀ {α : Sort ?u.908} [self : IsEmpty α], αFalse
IsEmpty.false
x: ?m.906
x
.
1: {α : Sort ?u.928} → {p : αProp} → Subtype pα
1
⟩ /-- subtypes by an all-false predicate are false. -/ theorem
Subtype.isEmpty_of_false: ∀ {α : Sort u_1} {p : αProp}, (∀ (a : α), ¬p a) → IsEmpty (Subtype p)
Subtype.isEmpty_of_false
{
p: αProp
p
:
α: Sort ?u.963
α
Prop: Type
Prop
} (
hp: ∀ (a : α), ¬p a
hp
: ∀
a: ?m.977
a
, ¬
p: αProp
p
a: ?m.977
a
) :
IsEmpty: Sort ?u.983 → Prop
IsEmpty
(
Subtype: {α : Sort ?u.984} → (αProp) → Sort (max1?u.984)
Subtype
p: αProp
p
) := ⟨fun
x: ?m.999
x
hp: ∀ (a : α), ¬p a
hp
_: α
_
x: ?m.999
x
.
2: ∀ {α : Sort ?u.1002} {p : αProp} (self : Subtype p), p self.val
2
#align subtype.is_empty_of_false
Subtype.isEmpty_of_false: ∀ {α : Sort u_1} {p : αProp}, (∀ (a : α), ¬p a) → IsEmpty (Subtype p)
Subtype.isEmpty_of_false
/-- subtypes by false are false. -/ instance
Subtype.isEmpty_false: IsEmpty { _a // False }
Subtype.isEmpty_false
:
IsEmpty: Sort ?u.1029 → Prop
IsEmpty
{
_a: α
_a
:
α: Sort ?u.1020
α
//
False: Prop
False
} :=
Subtype.isEmpty_of_false: ∀ {α : Sort ?u.1038} {p : αProp}, (∀ (a : α), ¬p a) → IsEmpty (Subtype p)
Subtype.isEmpty_of_false
fun
_: ?m.1047
_
id: ∀ {α : Sort ?u.1049}, αα
id
instance
Sigma.isEmpty_left: ∀ {α : Type u_1} [inst : IsEmpty α] {E : αType u_2}, IsEmpty (Sigma E)
Sigma.isEmpty_left
{
α: ?m.1077
α
} [
IsEmpty: Sort ?u.1080 → Prop
IsEmpty
α: ?m.1077
α
] {
E: αType ?u.1085
E
:
α: ?m.1077
α
Type _: Type (?u.1085+1)
Type _
} :
IsEmpty: Sort ?u.1088 → Prop
IsEmpty
(
Sigma: {α : Type ?u.1090} → (αType ?u.1089) → Type (max?u.1090?u.1089)
Sigma
E: αType ?u.1085
E
) :=
Function.isEmpty: ∀ {α : Sort ?u.1100} {β : Sort ?u.1099} [inst : IsEmpty β], (αβ) → IsEmpty α
Function.isEmpty
Sigma.fst: {α : Type ?u.1125} → {β : αType ?u.1124} → Sigma βα
Sigma.fst
example: ∀ {α : Sort u_1} {β : Sort u_2} [h : Nonempty α] [inst : IsEmpty β], IsEmpty (αβ)
example
[
h: Nonempty α
h
:
Nonempty: Sort ?u.1169 → Prop
Nonempty
α: Sort ?u.1160
α
] [
IsEmpty: Sort ?u.1172 → Prop
IsEmpty
β: Sort ?u.1163
β
] :
IsEmpty: Sort ?u.1175 → Prop
IsEmpty
(
α: Sort ?u.1160
α
β: Sort ?u.1163
β
) :=

Goals accomplished! 🐙
α: Sort ?u.1160

β: Sort ?u.1163

γ: Sort ?u.1166

h: Nonempty α

inst✝: IsEmpty β


IsEmpty (αβ)

Goals accomplished! 🐙
/-- Eliminate out of a type that `IsEmpty` (without using projection notation). -/ @[elab_as_elim] def
isEmptyElim: {α : Sort u_1} → [inst : IsEmpty α] → {p : αSort u_2} → (a : α) → p a
isEmptyElim
[
IsEmpty: Sort ?u.1236 → Prop
IsEmpty
α: Sort ?u.1227
α
] {
p: αSort ?u.1241
p
:
α: Sort ?u.1227
α
Sort _: Type ?u.1241
Sort
Sort _: Type ?u.1241
_
} (
a: α
a
:
α: Sort ?u.1227
α
) :
p: αSort ?u.1241
p
a: α
a
:= (
IsEmpty.false: ∀ {α : Sort ?u.1250} [self : IsEmpty α], αFalse
IsEmpty.false
a: α
a
).
elim: {C : Sort ?u.1255} → FalseC
elim
#align is_empty_elim
isEmptyElim: {α : Sort u_1} → [inst : IsEmpty α] → {p : αSort u_2} → (a : α) → p a
isEmptyElim
theorem
isEmpty_iff: IsEmpty α αFalse
isEmpty_iff
:
IsEmpty: Sort ?u.1342 → Prop
IsEmpty
α: Sort ?u.1333
α
α: Sort ?u.1333
α
False: Prop
False
:= ⟨@
IsEmpty.false: ∀ {α : Sort ?u.1355} [self : IsEmpty α], αFalse
IsEmpty.false
α: Sort ?u.1333
α
,
IsEmpty.mk: ∀ {α : Sort ?u.1359}, (αFalse) → IsEmpty α
IsEmpty.mk
#align is_empty_iff
isEmpty_iff: ∀ {α : Sort u_1}, IsEmpty α αFalse
isEmpty_iff
namespace IsEmpty open Function /-- Eliminate out of a type that `IsEmpty` (using projection notation). -/ @[elab_as_elim] protected def
elim: {α : Sort u} → IsEmpty α{p : αSort u_1} → (a : α) → p a
elim
{
α: Sort u
α
:
Sort u: Type u
Sort
Sort u: Type u
u
} (
_: IsEmpty α
_
:
IsEmpty: Sort ?u.1380 → Prop
IsEmpty
α: Sort u
α
) {
p: αSort ?u.1385
p
:
α: Sort u
α
Sort _: Type ?u.1385
Sort
Sort _: Type ?u.1385
_
} (
a: α
a
:
α: Sort u
α
) :
p: αSort ?u.1385
p
a: α
a
:=
isEmptyElim: {α : Sort ?u.1396} → [inst : IsEmpty α] → {p : αSort ?u.1395} → (a : α) → p a
isEmptyElim
a: α
a
#align is_empty.elim
IsEmpty.elim: {α : Sort u} → IsEmpty α{p : αSort u_1} → (a : α) → p a
IsEmpty.elim
/-- Non-dependent version of `IsEmpty.elim`. Helpful if the elaborator cannot elaborate `h.elim a` correctly. -/ protected def
elim': {β : Sort ?u.1508} → IsEmpty ααβ
elim'
{
β: Sort ?u.1508
β
:
Sort _: Type ?u.1508
Sort
Sort _: Type ?u.1508
_
} (
h: IsEmpty α
h
:
IsEmpty: Sort ?u.1511 → Prop
IsEmpty
α: Sort ?u.1499
α
) (
a: α
a
:
α: Sort ?u.1499
α
) :
β: Sort ?u.1508
β
:= (
h: IsEmpty α
h
.
false: ∀ {α : Sort ?u.1520} [self : IsEmpty α], αFalse
false
a: α
a
).
elim: {C : Sort ?u.1523} → FalseC
elim
#align is_empty.elim'
IsEmpty.elim': {α : Sort u_1} → {β : Sort u_2} → IsEmpty ααβ
IsEmpty.elim'
protected theorem
prop_iff: ∀ {p : Prop}, IsEmpty p ¬p
prop_iff
{
p: Prop
p
:
Prop: Type
Prop
} :
IsEmpty: Sort ?u.1599 → Prop
IsEmpty
p: Prop
p
↔ ¬
p: Prop
p
:=
isEmpty_iff: ∀ {α : Sort ?u.1602}, IsEmpty α αFalse
isEmpty_iff
#align is_empty.prop_iff
IsEmpty.prop_iff: ∀ {p : Prop}, IsEmpty p ¬p
IsEmpty.prop_iff
variable [
IsEmpty: Sort ?u.1909 → Prop
IsEmpty
α: Sort ?u.1609
α
] @[simp] theorem
forall_iff: ∀ {α : Sort u_1} [inst : IsEmpty α] {p : αProp}, (∀ (a : α), p a) True
forall_iff
{
p: αProp
p
:
α: Sort ?u.1621
α
Prop: Type
Prop
} : (∀
a: ?m.1638
a
,
p: αProp
p
a: ?m.1638
a
) ↔
True: Prop
True
:=
iff_true_intro: ∀ {a : Prop}, a → (a True)
iff_true_intro
isEmptyElim: ∀ {α : Sort ?u.1649} [inst : IsEmpty α] {p : αSort ?u.1648} (a : α), p a
isEmptyElim
#align is_empty.forall_iff
IsEmpty.forall_iff: ∀ {α : Sort u_1} [inst : IsEmpty α] {p : αProp}, (∀ (a : α), p a) True
IsEmpty.forall_iff
@[simp] theorem
exists_iff: ∀ {α : Sort u_1} [inst : IsEmpty α] {p : αProp}, (a, p a) False
exists_iff
{
p: αProp
p
:
α: Sort ?u.1720
α
Prop: Type
Prop
} : (∃
a: ?m.1739
a
,
p: αProp
p
a: ?m.1739
a
) ↔
False: Prop
False
:=
iff_false_intro: ∀ {a : Prop}, ¬a → (a False)
iff_false_intro
fun
x: α
x
, _⟩ ↦
IsEmpty.false: ∀ {α : Sort ?u.1783} [self : IsEmpty α], αFalse
IsEmpty.false
x: α
x
#align is_empty.exists_iff
IsEmpty.exists_iff: ∀ {α : Sort u_1} [inst : IsEmpty α] {p : αProp}, (a, p a) False
IsEmpty.exists_iff
-- see Note [lower instance priority]
instance: ∀ {α : Sort u_1} [inst : IsEmpty α], Subsingleton α
instance
(priority := 100) :
Subsingleton: Sort ?u.1912 → Prop
Subsingleton
α: Sort ?u.1900
α
:= ⟨
isEmptyElim: ∀ {α : Sort ?u.1920} [inst : IsEmpty α] {p : αSort ?u.1919} (a : α), p a
isEmptyElim
end IsEmpty @[simp] theorem
not_nonempty_iff: ∀ {α : Sort u_1}, ¬Nonempty α IsEmpty α
not_nonempty_iff
: ¬
Nonempty: Sort ?u.1997 → Prop
Nonempty
α: Sort ?u.1988
α
IsEmpty: Sort ?u.1998 → Prop
IsEmpty
α: Sort ?u.1988
α
:= ⟨fun
h: ?m.2009
h
↦ ⟨fun
x: ?m.2017
x
h: ?m.2009
h
x: ?m.2017
x
⟩⟩, fun
h1: ?m.2029
h1
h2: ?m.2032
h2
h2: ?m.2032
h2
.
elim: ∀ {α : Sort ?u.2034} {p : Prop}, Nonempty α(αp) → p
elim
h1: ?m.2029
h1
.
elim: ∀ {α : Sort ?u.2042}, IsEmpty α∀ {p : αSort ?u.2041} (a : α), p a
elim
#align not_nonempty_iff
not_nonempty_iff: ∀ {α : Sort u_1}, ¬Nonempty α IsEmpty α
not_nonempty_iff
@[simp] theorem
not_isEmpty_iff: ∀ {α : Sort u_1}, ¬IsEmpty α Nonempty α
not_isEmpty_iff
: ¬
IsEmpty: Sort ?u.2096 → Prop
IsEmpty
α: Sort ?u.2087
α
Nonempty: Sort ?u.2097 → Prop
Nonempty
α: Sort ?u.2087
α
:=
not_iff_comm: ∀ {a b : Prop}, (¬a b) (¬b a)
not_iff_comm
.
mp: ∀ {a b : Prop}, (a b) → ab
mp
not_nonempty_iff: ∀ {α : Sort ?u.2106}, ¬Nonempty α IsEmpty α
not_nonempty_iff
#align not_is_empty_iff
not_isEmpty_iff: ∀ {α : Sort u_1}, ¬IsEmpty α Nonempty α
not_isEmpty_iff
@[simp] theorem
isEmpty_Prop: ∀ {p : Prop}, IsEmpty p ¬p
isEmpty_Prop
{
p: Prop
p
:
Prop: Type
Prop
} :
IsEmpty: Sort ?u.2132 → Prop
IsEmpty
p: Prop
p
↔ ¬
p: Prop
p
:=

Goals accomplished! 🐙
α: Sort ?u.2121

β: Sort ?u.2124

γ: Sort ?u.2127

p: Prop



Goals accomplished! 🐙
#align is_empty_Prop
isEmpty_Prop: ∀ {p : Prop}, IsEmpty p ¬p
isEmpty_Prop
@[simp] theorem
isEmpty_pi: ∀ {α : Sort u_2} {π : αSort u_1}, IsEmpty ((a : α) → π a) a, IsEmpty (π a)
isEmpty_pi
{
π: αSort u_1
π
:
α: Sort ?u.2201
α
Sort _: Type ?u.2212
Sort
Sort _: Type ?u.2212
_
} :
IsEmpty: Sort ?u.2215 → Prop
IsEmpty
(∀
a: ?m.2217
a
,
π: αSort ?u.2212
π
a: ?m.2217
a
) ↔ ∃
a: ?m.2224
a
,
IsEmpty: Sort ?u.2226 → Prop
IsEmpty
(
π: αSort ?u.2212
π
a: ?m.2224
a
) :=

Goals accomplished! 🐙
α: Sort u_2

β: Sort ?u.2204

γ: Sort ?u.2207

π: αSort u_1


IsEmpty ((a : α) → π a) a, IsEmpty (π a)

Goals accomplished! 🐙
#align is_empty_pi
isEmpty_pi: ∀ {α : Sort u_2} {π : αSort u_1}, IsEmpty ((a : α) → π a) a, IsEmpty (π a)
isEmpty_pi
@[simp] theorem
isEmpty_sigma: ∀ {α : Type u_1} {E : αType u_2}, IsEmpty (Sigma E) ∀ (a : α), IsEmpty (E a)
isEmpty_sigma
{
α: Type u_1
α
} {
E: αType u_2
E
:
α: ?m.2431
α
Type _: Type (?u.2436+1)
Type _
} :
IsEmpty: Sort ?u.2439 → Prop
IsEmpty
(
Sigma: {α : Type ?u.2441} → (αType ?u.2440) → Type (max?u.2441?u.2440)
Sigma
E: αType ?u.2436
E
) ↔ ∀
a: ?m.2447
a
,
IsEmpty: Sort ?u.2450 → Prop
IsEmpty
(
E: αType ?u.2436
E
a: ?m.2447
a
) :=

Goals accomplished! 🐙
α✝: Sort ?u.2422

β: Sort ?u.2425

γ: Sort ?u.2428

α: Type u_1

E: αType u_2


IsEmpty (Sigma E) ∀ (a : α), IsEmpty (E a)

Goals accomplished! 🐙
#align is_empty_sigma
isEmpty_sigma: ∀ {α : Type u_1} {E : αType u_2}, IsEmpty (Sigma E) ∀ (a : α), IsEmpty (E a)
isEmpty_sigma
@[simp] theorem
isEmpty_psigma: ∀ {α : Sort u_1} {E : αSort u_2}, IsEmpty (PSigma E) ∀ (a : α), IsEmpty (E a)
isEmpty_psigma
{
α: ?m.2650
α
} {
E: αSort ?u.2655
E
:
α: ?m.2650
α
Sort _: Type ?u.2655
Sort
Sort _: Type ?u.2655
_
} :
IsEmpty: Sort ?u.2658 → Prop
IsEmpty
(
PSigma: {α : Sort ?u.2660} → (αSort ?u.2659) → Sort (max(max1?u.2660)?u.2659)
PSigma
E: αSort ?u.2655
E
) ↔ ∀
a: ?m.2666
a
,
IsEmpty: Sort ?u.2669 → Prop
IsEmpty
(
E: αSort ?u.2655
E
a: ?m.2666
a
) :=

Goals accomplished! 🐙
α✝: Sort ?u.2641

β: Sort ?u.2644

γ: Sort ?u.2647

α: Sort u_1

E: αSort u_2


IsEmpty (PSigma E) ∀ (a : α), IsEmpty (E a)

Goals accomplished! 🐙
#align is_empty_psigma
isEmpty_psigma: ∀ {α : Sort u_1} {E : αSort u_2}, IsEmpty (PSigma E) ∀ (a : α), IsEmpty (E a)
isEmpty_psigma
@[simp] theorem
isEmpty_subtype: ∀ {α : Sort u_1} (p : αProp), IsEmpty (Subtype p) ∀ (x : α), ¬p x
isEmpty_subtype
(
p: αProp
p
:
α: Sort ?u.2849
α
Prop: Type
Prop
) :
IsEmpty: Sort ?u.2862 → Prop
IsEmpty
(
Subtype: {α : Sort ?u.2863} → (αProp) → Sort (max1?u.2863)
Subtype
p: αProp
p
) ↔ ∀
x: ?m.2869
x
, ¬
p: αProp
p
x: ?m.2869
x
:=

Goals accomplished! 🐙
α: Sort u_1

β: Sort ?u.2852

γ: Sort ?u.2855

p: αProp


IsEmpty (Subtype p) ∀ (x : α), ¬p x

Goals accomplished! 🐙
#align is_empty_subtype
isEmpty_subtype: ∀ {α : Sort u_1} (p : αProp), IsEmpty (Subtype p) ∀ (x : α), ¬p x
isEmpty_subtype
@[simp] theorem
isEmpty_prod: ∀ {α : Type u_1} {β : Type u_2}, IsEmpty (α × β) IsEmpty α IsEmpty β
isEmpty_prod
{
α: Type u_1
α
β: Type u_2
β
:
Type _: Type (?u.3033+1)
Type _
} :
IsEmpty: Sort ?u.3036 → Prop
IsEmpty
(
α: Type ?u.3030
α
×
β: Type ?u.3033
β
) ↔
IsEmpty: Sort ?u.3039 → Prop
IsEmpty
α: Type ?u.3030
α
IsEmpty: Sort ?u.3040 → Prop
IsEmpty
β: Type ?u.3033
β
:=

Goals accomplished! 🐙
α✝: Sort ?u.3021

β✝: Sort ?u.3024

γ: Sort ?u.3027

α: Type u_1

β: Type u_2



Goals accomplished! 🐙
#align is_empty_prod
isEmpty_prod: ∀ {α : Type u_1} {β : Type u_2}, IsEmpty (α × β) IsEmpty α IsEmpty β
isEmpty_prod
@[simp] theorem
isEmpty_pprod: IsEmpty (PProd α β) IsEmpty α IsEmpty β
isEmpty_pprod
:
IsEmpty: Sort ?u.3179 → Prop
IsEmpty
(
PProd: Sort ?u.3181 → Sort ?u.3180 → Sort (max(max1?u.3181)?u.3180)
PProd
α: Sort ?u.3170
α
β: Sort ?u.3173
β
) ↔
IsEmpty: Sort ?u.3182 → Prop
IsEmpty
α: Sort ?u.3170
α
IsEmpty: Sort ?u.3183 → Prop
IsEmpty
β: Sort ?u.3173
β
:=

Goals accomplished! 🐙
α: Sort u_2

β: Sort u_1

γ: Sort ?u.3176



Goals accomplished! 🐙
#align is_empty_pprod
isEmpty_pprod: ∀ {α : Sort u_2} {β : Sort u_1}, IsEmpty (PProd α β) IsEmpty α IsEmpty β
isEmpty_pprod
@[simp] theorem
isEmpty_sum: ∀ {α : Type u_1} {β : Type u_2}, IsEmpty (α β) IsEmpty α IsEmpty β
isEmpty_sum
{
α: ?m.3316
α
β: Type u_2
β
} :
IsEmpty: Sort ?u.3322 → Prop
IsEmpty
(
Sum: Type ?u.3324 → Type ?u.3323 → Type (max?u.3324?u.3323)
Sum
α: ?m.3316
α
β: ?m.3319
β
) ↔
IsEmpty: Sort ?u.3325 → Prop
IsEmpty
α: ?m.3316
α
IsEmpty: Sort ?u.3326 → Prop
IsEmpty
β: ?m.3319
β
:=

Goals accomplished! 🐙
α✝: Sort ?u.3307

β✝: Sort ?u.3310

γ: Sort ?u.3313

α: Type u_1

β: Type u_2



Goals accomplished! 🐙
#align is_empty_sum
isEmpty_sum: ∀ {α : Type u_1} {β : Type u_2}, IsEmpty (α β) IsEmpty α IsEmpty β
isEmpty_sum
@[simp] theorem
isEmpty_psum: ∀ {α : Sort u_1} {β : Sort u_2}, IsEmpty (α ⊕' β) IsEmpty α IsEmpty β
isEmpty_psum
{
α: Sort u_1
α
β: Sort u_2
β
} :
IsEmpty: Sort ?u.3471 → Prop
IsEmpty
(
PSum: Sort ?u.3473 → Sort ?u.3472 → Sort (max(max1?u.3473)?u.3472)
PSum
α: ?m.3465
α
β: ?m.3468
β
) ↔
IsEmpty: Sort ?u.3474 → Prop
IsEmpty
α: ?m.3465
α
IsEmpty: Sort ?u.3475 → Prop
IsEmpty
β: ?m.3468
β
:=

Goals accomplished! 🐙
α✝: Sort ?u.3456

β✝: Sort ?u.3459

γ: Sort ?u.3462

α: Sort u_1

β: Sort u_2



Goals accomplished! 🐙
#align is_empty_psum
isEmpty_psum: ∀ {α : Sort u_1} {β : Sort u_2}, IsEmpty (α ⊕' β) IsEmpty α IsEmpty β
isEmpty_psum
@[simp] theorem
isEmpty_ulift: ∀ {α : Type u_1}, IsEmpty (ULift α) IsEmpty α
isEmpty_ulift
{
α: Type u_1
α
} :
IsEmpty: Sort ?u.3613 → Prop
IsEmpty
(
ULift: Type ?u.3614 → Type (max?u.3614?u.3615)
ULift
α: ?m.3610
α
) ↔
IsEmpty: Sort ?u.3616 → Prop
IsEmpty
α: ?m.3610
α
:=

Goals accomplished! 🐙
α✝: Sort ?u.3601

β: Sort ?u.3604

γ: Sort ?u.3607

α: Type u_1



Goals accomplished! 🐙
#align is_empty_ulift
isEmpty_ulift: ∀ {α : Type u_1}, IsEmpty (ULift α) IsEmpty α
isEmpty_ulift
@[simp] theorem
isEmpty_plift: ∀ {α : Sort u_1}, IsEmpty (PLift α) IsEmpty α
isEmpty_plift
{
α: ?m.3708
α
} :
IsEmpty: Sort ?u.3711 → Prop
IsEmpty
(
PLift: Sort ?u.3712 → Type ?u.3712
PLift
α: ?m.3708
α
) ↔
IsEmpty: Sort ?u.3713 → Prop
IsEmpty
α: ?m.3708
α
:=

Goals accomplished! 🐙
α✝: Sort ?u.3699

β: Sort ?u.3702

γ: Sort ?u.3705

α: Sort u_1



Goals accomplished! 🐙
#align is_empty_plift
isEmpty_plift: ∀ {α : Sort u_1}, IsEmpty (PLift α) IsEmpty α
isEmpty_plift
theorem
wellFounded_of_isEmpty: ∀ {α : Sort u_1} [inst : IsEmpty α] (r : ααProp), WellFounded r
wellFounded_of_isEmpty
{
α: Sort u_1
α
} [
IsEmpty: Sort ?u.3806 → Prop
IsEmpty
α: ?m.3803
α
] (
r: ααProp
r
:
α: ?m.3803
α
α: ?m.3803
α
Prop: Type
Prop
) :
WellFounded: {α : Sort ?u.3815} → (ααProp) → Prop
WellFounded
r: ααProp
r
:= ⟨
isEmptyElim: ∀ {α : Sort ?u.3840} [inst : IsEmpty α] {p : αSort ?u.3839} (a : α), p a
isEmptyElim
#align well_founded_of_empty
wellFounded_of_isEmpty: ∀ {α : Sort u_1} [inst : IsEmpty α] (r : ααProp), WellFounded r
wellFounded_of_isEmpty
variable (
α: ?m.3914
α
) theorem
isEmpty_or_nonempty: IsEmpty α Nonempty α
isEmpty_or_nonempty
:
IsEmpty: Sort ?u.3926 → Prop
IsEmpty
α: Sort ?u.3917
α
Nonempty: Sort ?u.3927 → Prop
Nonempty
α: Sort ?u.3917
α
:= (
em: ∀ (p : Prop), p ¬p
em
<|
IsEmpty: Sort ?u.3929 → Prop
IsEmpty
α: Sort ?u.3917
α
).
elim: ∀ {a b c : Prop}, a b(ac) → (bc) → c
elim
Or.inl: ∀ {a b : Prop}, aa b
Or.inl
<|
Or.inr: ∀ {a b : Prop}, ba b
Or.inr
not_isEmpty_iff: ∀ {α : Sort ?u.3959}, ¬IsEmpty α Nonempty α
not_isEmpty_iff
.
mp: ∀ {a b : Prop}, (a b) → ab
mp
#align is_empty_or_nonempty
isEmpty_or_nonempty: ∀ (α : Sort u_1), IsEmpty α Nonempty α
isEmpty_or_nonempty
@[simp] theorem
not_isEmpty_of_nonempty: ∀ (α : Sort u_1) [h : Nonempty α], ¬IsEmpty α
not_isEmpty_of_nonempty
[
h: Nonempty α
h
:
Nonempty: Sort ?u.3984 → Prop
Nonempty
α: Sort ?u.3975
α
] : ¬
IsEmpty: Sort ?u.3987 → Prop
IsEmpty
α: Sort ?u.3975
α
:=
not_isEmpty_iff: ∀ {α : Sort ?u.3991}, ¬IsEmpty α Nonempty α
not_isEmpty_iff
.
mpr: ∀ {a b : Prop}, (a b) → ba
mpr
h: Nonempty α
h
#align not_is_empty_of_nonempty
not_isEmpty_of_nonempty: ∀ (α : Sort u_1) [h : Nonempty α], ¬IsEmpty α
not_isEmpty_of_nonempty
variable {
α: ?m.4022
α
} theorem
Function.extend_of_isEmpty: ∀ {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} [inst : IsEmpty α] (f : αβ) (g : αγ) (h : βγ), extend f g h = h
Function.extend_of_isEmpty
[
IsEmpty: Sort ?u.4034 → Prop
IsEmpty
α: Sort ?u.4025
α
] (
f: αβ
f
:
α: Sort ?u.4025
α
β: Sort ?u.4028
β
) (
g: αγ
g
:
α: Sort ?u.4025
α
γ: Sort ?u.4031
γ
) (
h: βγ
h
:
β: Sort ?u.4028
β
γ: Sort ?u.4031
γ
) :
Function.extend: {α : Sort ?u.4052} → {β : Sort ?u.4051} → {γ : Sort ?u.4050} → (αβ) → (αγ) → (βγ) → βγ
Function.extend
f: αβ
f
g: αγ
g
h: βγ
h
=
h: βγ
h
:=
funext: ∀ {α : Sort ?u.4075} {β : αSort ?u.4074} {f g : (x : α) → β x}, (∀ (x : α), f x = g x) → f = g
funext
fun
_: ?m.4089
_
↦ (
Function.extend_apply': ∀ {α : Sort ?u.4091} {β : Sort ?u.4092} {γ : Sort ?u.4093} {f : αβ} (g : αγ) (e' : βγ) (b : β), (¬a, f a = b) → extend f g e' b = e' b
Function.extend_apply'
_: ?m.4094?m.4096
_
_: ?m.4095?m.4096
_
_: ?m.4095
_
) fun
a: α
a
, _⟩ ↦
isEmptyElim: ∀ {α : Sort ?u.4154} [inst : IsEmpty α] {p : αSort ?u.4153} (a : α), p a
isEmptyElim
a: α
a
#align function.extend_of_empty
Function.extend_of_isEmpty: ∀ {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} [inst : IsEmpty α] (f : αβ) (g : αγ) (h : βγ), Function.extend f g h = h
Function.extend_of_isEmpty