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 Yury Kudryashov. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yury Kudryashov

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

/-!
# Extra lemmas about `ULift` and `PLift`

In this file we provide `Subsingleton`, `Unique`, `DecidableEq`, and `isEmpty` instances for
`ULift α` and `PLift α`. We also prove `ULift.forall`, `ULift.exists`, `PLift.forall`, and
`PLift.exists`.
-/

universe u v

open Function

namespace PLift

variable {
α: Sort u
α
:
Sort u: Type u
Sort
Sort u: Type u
u
} {
β: Sort v
β
:
Sort v: Type v
Sort
Sort v: Type v
v
}
instance: ∀ {α : Sort u} [inst : Subsingleton α], Subsingleton (PLift α)
instance
[
Subsingleton: Sort ?u.10 → Prop
Subsingleton
α: Sort u
α
] :
Subsingleton: Sort ?u.13 → Prop
Subsingleton
(
PLift: Sort ?u.14 → Type ?u.14
PLift
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.17} → PLift α α
Equiv.plift
.
subsingleton: ∀ {α : Sort ?u.20} {β : Sort ?u.19}, α β∀ [inst : Subsingleton β], Subsingleton α
subsingleton
instance: ∀ {α : Sort u} [inst : Nonempty α], Nonempty (PLift α)
instance
[
Nonempty: Sort ?u.76 → Prop
Nonempty
α: Sort u
α
] :
Nonempty: Sort ?u.79 → Prop
Nonempty
(
PLift: Sort ?u.80 → Type ?u.80
PLift
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.83} → PLift α α
Equiv.plift
.
nonempty: ∀ {α : Sort ?u.86} {β : Sort ?u.85}, α β∀ [inst : Nonempty β], Nonempty α
nonempty
instance: {α : Sort u} → [inst : Unique α] → Unique (PLift α)
instance
[
Unique: Sort ?u.143 → Sort (max1?u.143)
Unique
α: Sort u
α
] :
Unique: Sort ?u.146 → Sort (max1?u.146)
Unique
(
PLift: Sort ?u.147 → Type ?u.147
PLift
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.150} → PLift α α
Equiv.plift
.
unique: {α : Sort ?u.153} → {β : Sort ?u.152} → [inst : Unique β] → α βUnique α
unique
instance: {α : Sort u} → [inst : DecidableEq α] → DecidableEq (PLift α)
instance
[
DecidableEq: Sort ?u.212 → Sort (max1?u.212)
DecidableEq
α: Sort u
α
] :
DecidableEq: Sort ?u.221 → Sort (max1?u.221)
DecidableEq
(
PLift: Sort ?u.222 → Type ?u.222
PLift
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.232} → PLift α α
Equiv.plift
.
decidableEq: {α : Sort ?u.235} → {β : Sort ?u.234} → α β[inst : DecidableEq β] → DecidableEq α
decidableEq
instance: ∀ {α : Sort u} [inst : IsEmpty α], IsEmpty (PLift α)
instance
[
IsEmpty: Sort ?u.412 → Prop
IsEmpty
α: Sort u
α
] :
IsEmpty: Sort ?u.415 → Prop
IsEmpty
(
PLift: Sort ?u.416 → Type ?u.416
PLift
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.419} → PLift α α
Equiv.plift
.
isEmpty: ∀ {α : Sort ?u.421} {β : Sort ?u.422}, α β∀ [inst : IsEmpty β], IsEmpty α
isEmpty
theorem
up_injective: Injective up
up_injective
:
Injective: {α : Sort ?u.477} → {β : Sort ?u.476} → (αβ) → Prop
Injective
(@
up: {α : Sort ?u.480} → αPLift α
up
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.485} → PLift α α
Equiv.plift
.
symm: {α : Sort ?u.488} → {β : Sort ?u.487} → α ββ α
symm
.
injective: ∀ {α : Sort ?u.494} {β : Sort ?u.493} (e : α β), Injective e
injective
#align plift.up_injective
PLift.up_injective: ∀ {α : Sort u}, Injective up
PLift.up_injective
theorem
up_surjective: ∀ {α : Sort u}, Surjective up
up_surjective
:
Surjective: {α : Sort ?u.516} → {β : Sort ?u.515} → (αβ) → Prop
Surjective
(@
up: {α : Sort ?u.519} → αPLift α
up
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.525} → PLift α α
Equiv.plift
.
symm: {α : Sort ?u.528} → {β : Sort ?u.527} → α ββ α
symm
.
surjective: ∀ {α : Sort ?u.534} {β : Sort ?u.533} (e : α β), Surjective e
surjective
#align plift.up_surjective
PLift.up_surjective: ∀ {α : Sort u}, Surjective up
PLift.up_surjective
theorem
up_bijective: Bijective up
up_bijective
:
Bijective: {α : Sort ?u.555} → {β : Sort ?u.554} → (αβ) → Prop
Bijective
(@
up: {α : Sort ?u.558} → αPLift α
up
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.563} → PLift α α
Equiv.plift
.
symm: {α : Sort ?u.566} → {β : Sort ?u.565} → α ββ α
symm
.
bijective: ∀ {α : Sort ?u.572} {β : Sort ?u.571} (e : α β), Bijective e
bijective
#align plift.up_bijective
PLift.up_bijective: ∀ {α : Sort u}, Bijective up
PLift.up_bijective
@[simp] theorem
up_inj: ∀ {α : Sort u} {x y : α}, { down := x } = { down := y } x = y
up_inj
{
x: α
x
y: α
y
:
α: Sort u
α
} :
up: {α : Sort ?u.595} → αPLift α
up
x: α
x
=
up: {α : Sort ?u.597} → αPLift α
up
y: α
y
x: α
x
=
y: α
y
:=
up_injective: ∀ {α : Sort ?u.606}, Injective up
up_injective
.
eq_iff: ∀ {α : Sort ?u.608} {β : Sort ?u.609} {f : αβ}, Injective f∀ {a b : α}, f a = f b a = b
eq_iff
#align plift.up_inj
PLift.up_inj: ∀ {α : Sort u} {x y : α}, { down := x } = { down := y } x = y
PLift.up_inj
theorem
down_surjective: Surjective down
down_surjective
:
Surjective: {α : Sort ?u.664} → {β : Sort ?u.663} → (αβ) → Prop
Surjective
(@
down: {α : Sort ?u.667} → PLift αα
down
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.673} → PLift α α
Equiv.plift
.
surjective: ∀ {α : Sort ?u.676} {β : Sort ?u.675} (e : α β), Surjective e
surjective
#align plift.down_surjective
PLift.down_surjective: ∀ {α : Sort u}, Surjective down
PLift.down_surjective
theorem
down_bijective: ∀ {α : Sort u}, Bijective down
down_bijective
:
Bijective: {α : Sort ?u.700} → {β : Sort ?u.699} → (αβ) → Prop
Bijective
(@
down: {α : Sort ?u.703} → PLift αα
down
α: Sort u
α
) :=
Equiv.plift: {α : Sort ?u.708} → PLift α α
Equiv.plift
.
bijective: ∀ {α : Sort ?u.711} {β : Sort ?u.710} (e : α β), Bijective e
bijective
#align plift.down_bijective
PLift.down_bijective: ∀ {α : Sort u}, Bijective down
PLift.down_bijective
@[simp] theorem
«forall»: ∀ {α : Sort u} {p : PLift αProp}, (∀ (x : PLift α), p x) ∀ (x : α), p { down := x }
«forall»
{
p: PLift αProp
p
:
PLift: Sort ?u.733 → Type ?u.733
PLift
α: Sort u
α
Prop: Type
Prop
} : (∀
x: ?m.738
x
,
p: PLift αProp
p
x: ?m.738
x
) ↔ ∀
x: α
x
:
α: Sort u
α
,
p: PLift αProp
p
(
PLift.up: {α : Sort ?u.745} → αPLift α
PLift.up
x: α
x
) :=
up_surjective: ∀ {α : Sort ?u.751}, Surjective up
up_surjective
.
forall: ∀ {α : Sort ?u.753} {β : Sort ?u.754} {f : αβ}, Surjective f∀ {p : βProp}, (∀ (y : β), p y) ∀ (x : α), p (f x)
forall
#align plift.forall
PLift.forall: ∀ {α : Sort u} {p : PLift αProp}, (∀ (x : PLift α), p x) ∀ (x : α), p { down := x }
PLift.forall
@[simp] theorem
«exists»: ∀ {α : Sort u} {p : PLift αProp}, (x, p x) x, p { down := x }
«exists»
{
p: PLift αProp
p
:
PLift: Sort ?u.798 → Type ?u.798
PLift
α: Sort u
α
Prop: Type
Prop
} : (∃
x: ?m.805
x
,
p: PLift αProp
p
x: ?m.805
x
) ↔ ∃
x: α
x
:
α: Sort u
α
,
p: PLift αProp
p
(
PLift.up: {α : Sort ?u.813} → αPLift α
PLift.up
x: α
x
) :=
up_surjective: ∀ {α : Sort ?u.820}, Surjective up
up_surjective
.
exists: ∀ {α : Sort ?u.822} {β : Sort ?u.823} {f : αβ}, Surjective f∀ {p : βProp}, (y, p y) x, p (f x)
exists
#align plift.exists
PLift.exists: ∀ {α : Sort u} {p : PLift αProp}, (x, p x) x, p { down := x }
PLift.exists
end PLift namespace ULift variable {
α: Type u
α
:
Type u: Type (u+1)
Type u
} {
β: Type v
β
:
Type v: Type (v+1)
Type v
}
instance: ∀ {α : Type u} [inst : Subsingleton α], Subsingleton (ULift α)
instance
[
Subsingleton: Sort ?u.877 → Prop
Subsingleton
α: Type u
α
] :
Subsingleton: Sort ?u.880 → Prop
Subsingleton
(
ULift: Type ?u.881 → Type (max?u.881?u.882)
ULift
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.885} → ULift α α
Equiv.ulift
.
subsingleton: ∀ {α : Sort ?u.889} {β : Sort ?u.888}, α β∀ [inst : Subsingleton β], Subsingleton α
subsingleton
instance: ∀ {α : Type u} [inst : Nonempty α], Nonempty (ULift α)
instance
[
Nonempty: Sort ?u.947 → Prop
Nonempty
α: Type u
α
] :
Nonempty: Sort ?u.950 → Prop
Nonempty
(
ULift: Type ?u.951 → Type (max?u.951?u.952)
ULift
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.955} → ULift α α
Equiv.ulift
.
nonempty: ∀ {α : Sort ?u.959} {β : Sort ?u.958}, α β∀ [inst : Nonempty β], Nonempty α
nonempty
instance: {α : Type u} → [inst : Unique α] → Unique (ULift α)
instance
[
Unique: Sort ?u.1018 → Sort (max1?u.1018)
Unique
α: Type u
α
] :
Unique: Sort ?u.1021 → Sort (max1?u.1021)
Unique
(
ULift: Type ?u.1022 → Type (max?u.1022?u.1023)
ULift
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1026} → ULift α α
Equiv.ulift
.
unique: {α : Sort ?u.1030} → {β : Sort ?u.1029} → [inst : Unique β] → α βUnique α
unique
instance: {α : Type u} → [inst : DecidableEq α] → DecidableEq (ULift α)
instance
[
DecidableEq: Sort ?u.1091 → Sort (max1?u.1091)
DecidableEq
α: Type u
α
] :
DecidableEq: Sort ?u.1100 → Sort (max1?u.1100)
DecidableEq
(
ULift: Type ?u.1101 → Type (max?u.1101?u.1102)
ULift
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1112} → ULift α α
Equiv.ulift
.
decidableEq: {α : Sort ?u.1116} → {β : Sort ?u.1115} → α β[inst : DecidableEq β] → DecidableEq α
decidableEq
instance: ∀ {α : Type u} [inst : IsEmpty α], IsEmpty (ULift α)
instance
[
IsEmpty: Sort ?u.1294 → Prop
IsEmpty
α: Type u
α
] :
IsEmpty: Sort ?u.1297 → Prop
IsEmpty
(
ULift: Type ?u.1298 → Type (max?u.1298?u.1299)
ULift
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1302} → ULift α α
Equiv.ulift
.
isEmpty: ∀ {α : Sort ?u.1305} {β : Sort ?u.1306}, α β∀ [inst : IsEmpty β], IsEmpty α
isEmpty
theorem
up_injective: Injective up
up_injective
:
Injective: {α : Sort ?u.1363} → {β : Sort ?u.1362} → (αβ) → Prop
Injective
(@
up: {α : Type ?u.1366} → αULift α
up
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1372} → ULift α α
Equiv.ulift
.
symm: {α : Sort ?u.1376} → {β : Sort ?u.1375} → α ββ α
symm
.
injective: ∀ {α : Sort ?u.1382} {β : Sort ?u.1381} (e : α β), Injective e
injective
#align ulift.up_injective
ULift.up_injective: ∀ {α : Type u}, Injective up
ULift.up_injective
theorem
up_surjective: ∀ {α : Type u}, Surjective up
up_surjective
:
Surjective: {α : Sort ?u.1406} → {β : Sort ?u.1405} → (αβ) → Prop
Surjective
(@
up: {α : Type ?u.1409} → αULift α
up
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1416} → ULift α α
Equiv.ulift
.
symm: {α : Sort ?u.1420} → {β : Sort ?u.1419} → α ββ α
symm
.
surjective: ∀ {α : Sort ?u.1426} {β : Sort ?u.1425} (e : α β), Surjective e
surjective
#align ulift.up_surjective
ULift.up_surjective: ∀ {α : Type u}, Surjective up
ULift.up_surjective
theorem
up_bijective: Bijective up
up_bijective
:
Bijective: {α : Sort ?u.1449} → {β : Sort ?u.1448} → (αβ) → Prop
Bijective
(@
up: {α : Type ?u.1452} → αULift α
up
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1458} → ULift α α
Equiv.ulift
.
symm: {α : Sort ?u.1462} → {β : Sort ?u.1461} → α ββ α
symm
.
bijective: ∀ {α : Sort ?u.1468} {β : Sort ?u.1467} (e : α β), Bijective e
bijective
#align ulift.up_bijective
ULift.up_bijective: ∀ {α : Type u}, Bijective up
ULift.up_bijective
@[simp] theorem
up_inj: ∀ {α : Type u} {x y : α}, { down := x } = { down := y } x = y
up_inj
{
x: α
x
y: α
y
:
α: Type u
α
} :
up: {α : Type ?u.1493} → αULift α
up
x: α
x
=
up: {α : Type ?u.1496} → αULift α
up
y: α
y
x: α
x
=
y: α
y
:=
up_injective: ∀ {α : Type ?u.1526}, Injective up
up_injective
.
eq_iff: ∀ {α : Sort ?u.1529} {β : Sort ?u.1530} {f : αβ}, Injective f∀ {a b : α}, f a = f b a = b
eq_iff
#align ulift.up_inj
ULift.up_inj: ∀ {α : Type u} {x y : α}, { down := x } = { down := y } x = y
ULift.up_inj
theorem
down_surjective: Surjective down
down_surjective
:
Surjective: {α : Sort ?u.1586} → {β : Sort ?u.1585} → (αβ) → Prop
Surjective
(@
down: {α : Type ?u.1589} → ULift αα
down
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1596} → ULift α α
Equiv.ulift
.
surjective: ∀ {α : Sort ?u.1600} {β : Sort ?u.1599} (e : α β), Surjective e
surjective
#align ulift.down_surjective
ULift.down_surjective: ∀ {α : Type u}, Surjective down
ULift.down_surjective
theorem
down_bijective: ∀ {α : Type u}, Bijective down
down_bijective
:
Bijective: {α : Sort ?u.1625} → {β : Sort ?u.1624} → (αβ) → Prop
Bijective
(@
down: {α : Type ?u.1628} → ULift αα
down
α: Type u
α
) :=
Equiv.ulift: {α : Type ?u.1634} → ULift α α
Equiv.ulift
.
bijective: ∀ {α : Sort ?u.1638} {β : Sort ?u.1637} (e : α β), Bijective e
bijective
#align ulift.down_bijective
ULift.down_bijective: ∀ {α : Type u}, Bijective down
ULift.down_bijective
@[simp] theorem
«forall»: ∀ {α : Type u} {p : ULift αProp}, (∀ (x : ULift α), p x) ∀ (x : α), p { down := x }
«forall»
{
p: ULift αProp
p
:
ULift: Type ?u.1661 → Type (max?u.1661?u.1662)
ULift
α: Type u
α
Prop: Type
Prop
} : (∀
x: ?m.1667
x
,
p: ULift αProp
p
x: ?m.1667
x
) ↔ ∀
x: α
x
:
α: Type u
α
,
p: ULift αProp
p
(
ULift.up: {α : Type ?u.1674} → αULift α
ULift.up
x: α
x
) :=
up_surjective: ∀ {α : Type ?u.1682}, Surjective up
up_surjective
.
forall: ∀ {α : Sort ?u.1685} {β : Sort ?u.1686} {f : αβ}, Surjective f∀ {p : βProp}, (∀ (y : β), p y) ∀ (x : α), p (f x)
forall
#align ulift.forall
ULift.forall: ∀ {α : Type u} {p : ULift αProp}, (∀ (x : ULift α), p x) ∀ (x : α), p { down := x }
ULift.forall
@[simp] theorem
«exists»: ∀ {α : Type u} {p : ULift αProp}, (x, p x) x, p { down := x }
«exists»
{
p: ULift αProp
p
:
ULift: Type ?u.1731 → Type (max?u.1731?u.1732)
ULift
α: Type u
α
Prop: Type
Prop
} : (∃
x: ?m.1739
x
,
p: ULift αProp
p
x: ?m.1739
x
) ↔ ∃
x: α
x
:
α: Type u
α
,
p: ULift αProp
p
(
ULift.up: {α : Type ?u.1747} → αULift α
ULift.up
x: α
x
) :=
up_surjective: ∀ {α : Type ?u.1756}, Surjective up
up_surjective
.
exists: ∀ {α : Sort ?u.1759} {β : Sort ?u.1760} {f : αβ}, Surjective f∀ {p : βProp}, (y, p y) x, p (f x)
exists
#align ulift.exists
ULift.exists: ∀ {α : Type u} {p : ULift αProp}, (x, p x) x, p { down := x }
ULift.exists
@[ext] theorem
ext: ∀ (x y : ULift α), x.down = y.downx = y
ext
(
x: ULift α
x
y: ULift α
y
:
ULift: Type ?u.1815 → Type (max?u.1815?u.1816)
ULift
α: Type u
α
) (
h: x.down = y.down
h
:
x: ULift α
x
.
down: {α : Type ?u.1820} → ULift αα
down
=
y: ULift α
y
.
down: {α : Type ?u.1824} → ULift αα
down
) :
x: ULift α
x
=
y: ULift α
y
:=
congrArg: ∀ {α : Sort ?u.1859} {β : Sort ?u.1858} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
up: {α : Type ?u.1864} → αULift α
up
h: x.down = y.down
h
#align ulift.ext
ULift.ext: ∀ {α : Type u} (x y : ULift α), x.down = y.downx = y
ULift.ext
theorem
ext_iff: ∀ {α : Type u_1} (x y : ULift α), x = y x.down = y.down
ext_iff
{
α: Type u_1
α
:
Type _: Type (?u.1891+1)
Type _
} (
x: ULift α
x
y: ULift α
y
:
ULift: Type ?u.1894 → Type (max?u.1894?u.1895)
ULift
α: Type ?u.1891
α
) :
x: ULift α
x
=
y: ULift α
y
x: ULift α
x
.
down: {α : Type ?u.1926} → ULift αα
down
=
y: ULift α
y
.
down: {α : Type ?u.1929} → ULift αα
down
:= ⟨
congrArg: ∀ {α : Sort ?u.1947} {β : Sort ?u.1946} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
_: ?m.1948?m.1949
_
,
ULift.ext: ∀ {α : Type ?u.1963} (x y : ULift α), x.down = y.downx = y
ULift.ext
_: ULift ?m.1965
_
_: ULift ?m.1965
_
#align ulift.ext_iff
ULift.ext_iff: ∀ {α : Type u_1} (x y : ULift α), x = y x.down = y.down
ULift.ext_iff
end ULift