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) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura, Mario Carneiro
Ported by: Kevin Buzzard, Ruben Vorster, Scott Morrison, Eric Rodriguez

! This file was ported from Lean 3 source module logic.equiv.basic
! leanprover-community/mathlib commit d2d8742b0c21426362a9dacebc6005db895ca963
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Bool.Basic
import Mathlib.Data.Prod.Basic
import Mathlib.Data.Sigma.Basic
import Mathlib.Data.Subtype
import Mathlib.Data.Sum.Basic
import Mathlib.Init.Data.Sigma.Basic
import Mathlib.Logic.Equiv.Defs
import Mathlib.Logic.Function.Conjugate

/-!
# Equivalence between types

In this file we continue the work on equivalences begun in `Logic/Equiv/Defs.lean`, defining

* canonical isomorphisms between various types: e.g.,

  - `Equiv.sumEquivSigmaBool` is the canonical equivalence between the sum of two types `α ⊕ β`
    and the sigma-type `Σ b : Bool, cond b α β`;

  - `Equiv.prodSumDistrib : α × (β ⊕ γ) ≃ (α × β) ⊕ (α × γ)` shows that type product and type sum
    satisfy the distributive law up to a canonical equivalence;

* operations on equivalences: e.g.,

  - `Equiv.prodCongr ea eb : α₁ × β₁ ≃ α₂ × β₂`: combine two equivalences `ea : α₁ ≃ α₂` and
    `eb : β₁ ≃ β₂` using `Prod.map`.

  More definitions of this kind can be found in other files.
  E.g., `Data/Equiv/TransferInstance.lean` does it for many algebraic type classes like
  `Group`, `Module`, etc.

## Tags

equivalence, congruence, bijective map
-/

open Function

namespace Equiv

/-- `PProd α β` is equivalent to `α × β` -/
@[simps 
apply: ∀ {α : Type u_1} {β : Type u_2} (x : PProd α β), pprodEquivProd x = (x.fst, x.snd)
apply
symm_apply: ∀ {α : Type u_1} {β : Type u_2} (x : α × β), pprodEquivProd.symm x = { fst := x.fst, snd := x.snd }
symm_apply
] def
pprodEquivProd: {α : Type u_1} → {β : Type u_2} → PProd α β α × β
pprodEquivProd
:
PProd: Sort ?u.21 → Sort ?u.20 → Sort (max(max1?u.21)?u.20)
PProd
α: ?m.7
α
β: ?m.15
β
α: ?m.7
α
×
β: ?m.15
β
where toFun
x: ?m.34
x
:= (
x: ?m.34
x
.
1: {α : Sort ?u.43} → {β : Sort ?u.42} → PProd α βα
1
,
x: ?m.34
x
.
2: {α : Sort ?u.49} → {β : Sort ?u.48} → PProd α ββ
2
) invFun
x: ?m.55
x
:= ⟨
x: ?m.55
x
.
1: {α : Type ?u.66} → {β : Type ?u.65} → α × βα
1
,
x: ?m.55
x
.
2: {α : Type ?u.70} → {β : Type ?u.69} → α × ββ
2
⟩ left_inv := fun
_: ?m.76
_
=>
rfl: ∀ {α : Sort ?u.78} {a : α}, a = a
rfl
right_inv := fun
_: ?m.88
_
=>
rfl: ∀ {α : Sort ?u.90} {a : α}, a = a
rfl
#align equiv.pprod_equiv_prod
Equiv.pprodEquivProd: {α : Type u_1} → {β : Type u_2} → PProd α β α × β
Equiv.pprodEquivProd
#align equiv.pprod_equiv_prod_apply
Equiv.pprodEquivProd_apply: ∀ {α : Type u_1} {β : Type u_2} (x : PProd α β), pprodEquivProd x = (x.fst, x.snd)
Equiv.pprodEquivProd_apply
#align equiv.pprod_equiv_prod_symm_apply
Equiv.pprodEquivProd_symm_apply: ∀ {α : Type u_1} {β : Type u_2} (x : α × β), pprodEquivProd.symm x = { fst := x.fst, snd := x.snd }
Equiv.pprodEquivProd_symm_apply
/-- Product of two equivalences, in terms of `PProd`. If `α ≃ β` and `γ ≃ δ`, then `PProd α γ ≃ PProd β δ`. -/ -- porting note: in Lean 3 this had @[congr]` @[simps
apply: ∀ {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} (e₁ : α β) (e₂ : γ δ) (x : PProd α γ), ↑(pprodCongr e₁ e₂) x = { fst := e₁ x.fst, snd := e₂ x.snd }
apply
] def
pprodCongr: {α : Sort u_1} → {β : Sort u_2} → {γ : Sort u_3} → {δ : Sort u_4} → α βγ δPProd α γ PProd β δ
pprodCongr
(
e₁: α β
e₁
:
α: ?m.370
α
β: ?m.376
β
) (
e₂: γ δ
e₂
:
γ: ?m.386
γ
δ: ?m.396
δ
) :
PProd: Sort ?u.410 → Sort ?u.409 → Sort (max(max1?u.410)?u.409)
PProd
α: ?m.370
α
γ: ?m.386
γ
PProd: Sort ?u.412 → Sort ?u.411 → Sort (max(max1?u.412)?u.411)
PProd
β: ?m.376
β
δ: ?m.396
δ
where toFun
x: ?m.427
x
:= ⟨
e₁: α β
e₁
x: ?m.427
x
.
1: {α : Sort ?u.501} → {β : Sort ?u.500} → PProd α βα
1
,
e₂: γ δ
e₂
x: ?m.427
x
.
2: {α : Sort ?u.568} → {β : Sort ?u.567} → PProd α ββ
2
⟩ invFun
x: ?m.574
x
:= ⟨
e₁: α β
e₁
.
symm: {α : Sort ?u.585} → {β : Sort ?u.584} → α ββ α
symm
x: ?m.574
x
.
1: {α : Sort ?u.662} → {β : Sort ?u.661} → PProd α βα
1
,
e₂: γ δ
e₂
.
symm: {α : Sort ?u.666} → {β : Sort ?u.665} → α ββ α
symm
x: ?m.574
x
.
2: {α : Sort ?u.743} → {β : Sort ?u.742} → PProd α ββ
2
⟩ left_inv := fun
x: α
x
,
y: γ
y
⟩ =>

Goals accomplished! 🐙
α: Sort ?u.400

β: Sort ?u.399

γ: Sort ?u.404

δ: Sort ?u.403

e₁: α β

e₂: γ δ

x✝: PProd α γ

x: α

y: γ


(fun x => { fst := e₁.symm x.fst, snd := e₂.symm x.snd }) ((fun x => { fst := e₁ x.fst, snd := e₂ x.snd }) { fst := x, snd := y }) = { fst := x, snd := y }

Goals accomplished! 🐙
right_inv := fun
x: β
x
,
y: δ
y
⟩ =>

Goals accomplished! 🐙
α: Sort ?u.400

β: Sort ?u.399

γ: Sort ?u.404

δ: Sort ?u.403

e₁: α β

e₂: γ δ

x✝: PProd β δ

x: β

y: δ


(fun x => { fst := e₁ x.fst, snd := e₂ x.snd }) ((fun x => { fst := e₁.symm x.fst, snd := e₂.symm x.snd }) { fst := x, snd := y }) = { fst := x, snd := y }

Goals accomplished! 🐙
#align equiv.pprod_congr
Equiv.pprodCongr: {α : Sort u_1} → {β : Sort u_2} → {γ : Sort u_3} → {δ : Sort u_4} → α βγ δPProd α γ PProd β δ
Equiv.pprodCongr
#align equiv.pprod_congr_apply
Equiv.pprodCongr_apply: ∀ {α : Sort u_1} {β : Sort u_2} {γ : Sort u_3} {δ : Sort u_4} (e₁ : α β) (e₂ : γ δ) (x : PProd α γ), ↑(pprodCongr e₁ e₂) x = { fst := e₁ x.fst, snd := e₂ x.snd }
Equiv.pprodCongr_apply
/-- Combine two equivalences using `PProd` in the domain and `Prod` in the codomain. -/ @[simps!
apply: ∀ {α₁ : Sort u_1} {α₂ : Type u_2} {β₁ : Sort u_3} {β₂ : Type u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : PProd α₁ β₁), ↑(pprodProd ea eb) a = (ea a.fst, eb a.snd)
apply
symm_apply: ∀ {α₁ : Sort u_1} {α₂ : Type u_2} {β₁ : Sort u_3} {β₂ : Type u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : α₂ × β₂), (pprodProd ea eb).symm a = (pprodCongr ea eb).symm { fst := a.fst, snd := a.snd }
symm_apply
] def
pprodProd: {α₁ : Sort u_1} → {α₂ : Type u_2} → {β₁ : Sort u_3} → {β₂ : Type u_4} → α₁ α₂β₁ β₂PProd α₁ β₁ α₂ × β₂
pprodProd
(
ea: α₁ α₂
ea
:
α₁: ?m.1894
α₁
α₂: ?m.1900
α₂
) (
eb: β₁ β₂
eb
:
β₁: ?m.1910
β₁
β₂: ?m.1920
β₂
) :
PProd: Sort ?u.1934 → Sort ?u.1933 → Sort (max(max1?u.1934)?u.1933)
PProd
α₁: ?m.1894
α₁
β₁: ?m.1910
β₁
α₂: ?m.1900
α₂
×
β₂: ?m.1920
β₂
:= (
ea: α₁ α₂
ea
.
pprodCongr: {α : Sort ?u.1947} → {β : Sort ?u.1946} → {γ : Sort ?u.1945} → {δ : Sort ?u.1944} → α βγ δPProd α γ PProd β δ
pprodCongr
eb: β₁ β₂
eb
).
trans: {α : Sort ?u.1966} → {β : Sort ?u.1965} → {γ : Sort ?u.1964} → α ββ γα γ
trans
pprodEquivProd: {α : Type ?u.1978} → {β : Type ?u.1977} → PProd α β α × β
pprodEquivProd
#align equiv.pprod_prod
Equiv.pprodProd: {α₁ : Sort u_1} → {α₂ : Type u_2} → {β₁ : Sort u_3} → {β₂ : Type u_4} → α₁ α₂β₁ β₂PProd α₁ β₁ α₂ × β₂
Equiv.pprodProd
#align equiv.pprod_prod_apply
Equiv.pprodProd_apply: ∀ {α₁ : Sort u_1} {α₂ : Type u_2} {β₁ : Sort u_3} {β₂ : Type u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : PProd α₁ β₁), ↑(pprodProd ea eb) a = (ea a.fst, eb a.snd)
Equiv.pprodProd_apply
#align equiv.pprod_prod_symm_apply
Equiv.pprodProd_symm_apply: ∀ {α₁ : Sort u_1} {α₂ : Type u_2} {β₁ : Sort u_3} {β₂ : Type u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : α₂ × β₂), (pprodProd ea eb).symm a = (pprodCongr ea eb).symm { fst := a.fst, snd := a.snd }
Equiv.pprodProd_symm_apply
/-- Combine two equivalences using `PProd` in the codomain and `Prod` in the domain. -/ @[simps!
apply: ∀ {α₁ : Type u_1} {α₂ : Sort u_2} {β₁ : Type u_3} {β₂ : Sort u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : α₁ × β₁), ↑(prodPProd ea eb) a = (pprodCongr ea.symm eb.symm).symm { fst := a.fst, snd := a.snd }
apply
symm_apply: ∀ {α₁ : Type u_1} {α₂ : Sort u_2} {β₁ : Type u_3} {β₂ : Sort u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : PProd α₂ β₂), (prodPProd ea eb).symm a = (ea.symm a.fst, eb.symm a.snd)
symm_apply
] def
prodPProd: {α₁ : Type u_1} → {α₂ : Sort u_2} → {β₁ : Type u_3} → {β₂ : Sort u_4} → α₁ α₂β₁ β₂α₁ × β₁ PProd α₂ β₂
prodPProd
(
ea: α₁ α₂
ea
:
α₁: ?m.2558
α₁
α₂: ?m.2564
α₂
) (
eb: β₁ β₂
eb
:
β₁: ?m.2574
β₁
β₂: ?m.2584
β₂
) :
α₁: ?m.2558
α₁
×
β₁: ?m.2574
β₁
PProd: Sort ?u.2600 → Sort ?u.2599 → Sort (max(max1?u.2600)?u.2599)
PProd
α₂: ?m.2564
α₂
β₂: ?m.2584
β₂
:= (
ea: α₁ α₂
ea
.
symm: {α : Sort ?u.2609} → {β : Sort ?u.2608} → α ββ α
symm
.
pprodProd: {α₁ : Sort ?u.2617} → {α₂ : Type ?u.2616} → {β₁ : Sort ?u.2615} → {β₂ : Type ?u.2614} → α₁ α₂β₁ β₂PProd α₁ β₁ α₂ × β₂
pprodProd
eb: β₁ β₂
eb
.
symm: {α : Sort ?u.2631} → {β : Sort ?u.2630} → α ββ α
symm
).
symm: {α : Sort ?u.2644} → {β : Sort ?u.2643} → α ββ α
symm
#align equiv.prod_pprod
Equiv.prodPProd: {α₁ : Type u_1} → {α₂ : Sort u_2} → {β₁ : Type u_3} → {β₂ : Sort u_4} → α₁ α₂β₁ β₂α₁ × β₁ PProd α₂ β₂
Equiv.prodPProd
#align equiv.prod_pprod_symm_apply
Equiv.prodPProd_symm_apply: ∀ {α₁ : Type u_1} {α₂ : Sort u_2} {β₁ : Type u_3} {β₂ : Sort u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : PProd α₂ β₂), (prodPProd ea eb).symm a = (ea.symm a.fst, eb.symm a.snd)
Equiv.prodPProd_symm_apply
#align equiv.prod_pprod_apply
Equiv.prodPProd_apply: ∀ {α₁ : Type u_1} {α₂ : Sort u_2} {β₁ : Type u_3} {β₂ : Sort u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : α₁ × β₁), ↑(prodPProd ea eb) a = (pprodCongr ea.symm eb.symm).symm { fst := a.fst, snd := a.snd }
Equiv.prodPProd_apply
/-- `PProd α β` is equivalent to `PLift α × PLift β` -/ @[simps!
apply: ∀ {α : Sort u_1} {β : Sort u_2} (a : PProd α β), pprodEquivProdPLift a = (Equiv.plift.symm a.fst, Equiv.plift.symm a.snd)
apply
symm_apply: ∀ {α : Sort u_1} {β : Sort u_2} (a : PLift α × PLift β), pprodEquivProdPLift.symm a = (pprodCongr Equiv.plift.symm Equiv.plift.symm).symm { fst := a.fst, snd := a.snd }
symm_apply
] def
pprodEquivProdPLift: {α : Sort u_1} → {β : Sort u_2} → PProd α β PLift α × PLift β
pprodEquivProdPLift
:
PProd: Sort ?u.3242 → Sort ?u.3241 → Sort (max(max1?u.3242)?u.3241)
PProd
α: ?m.3228
α
β: ?m.3236
β
PLift: Sort ?u.3245 → Type ?u.3245
PLift
α: ?m.3228
α
×
PLift: Sort ?u.3246 → Type ?u.3246
PLift
β: ?m.3236
β
:=
Equiv.plift: {α : Sort ?u.3250} → PLift α α
Equiv.plift
.
symm: {α : Sort ?u.3253} → {β : Sort ?u.3252} → α ββ α
symm
.
pprodProd: {α₁ : Sort ?u.3261} → {α₂ : Type ?u.3260} → {β₁ : Sort ?u.3259} → {β₂ : Type ?u.3258} → α₁ α₂β₁ β₂PProd α₁ β₁ α₂ × β₂
pprodProd
Equiv.plift: {α : Sort ?u.3280} → PLift α α
Equiv.plift
.
symm: {α : Sort ?u.3283} → {β : Sort ?u.3282} → α ββ α
symm
#align equiv.pprod_equiv_prod_plift
Equiv.pprodEquivProdPLift: {α : Sort u_1} → {β : Sort u_2} → PProd α β PLift α × PLift β
Equiv.pprodEquivProdPLift
#align equiv.pprod_equiv_prod_plift_symm_apply
Equiv.pprodEquivProdPLift_symm_apply: ∀ {α : Sort u_1} {β : Sort u_2} (a : PLift α × PLift β), pprodEquivProdPLift.symm a = (pprodCongr Equiv.plift.symm Equiv.plift.symm).symm { fst := a.fst, snd := a.snd }
Equiv.pprodEquivProdPLift_symm_apply
#align equiv.pprod_equiv_prod_plift_apply
Equiv.pprodEquivProdPLift_apply: ∀ {α : Sort u_1} {β : Sort u_2} (a : PProd α β), pprodEquivProdPLift a = (Equiv.plift.symm a.fst, Equiv.plift.symm a.snd)
Equiv.pprodEquivProdPLift_apply
/-- Product of two equivalences. If `α₁ ≃ α₂` and `β₁ ≃ β₂`, then `α₁ × β₁ ≃ α₂ × β₂`. This is `Prod.map` as an equivalence. -/ -- porting note: in Lean 3 there was also a @[congr] tag @[simps (config := .asFn)
apply: ∀ {α₁ : Type u_1} {α₂ : Type u_2} {β₁ : Type u_3} {β₂ : Type u_4} (e₁ : α₁ α₂) (e₂ : β₁ β₂), ↑(prodCongr e₁ e₂) = Prod.map e₁ e₂
apply
] def
prodCongr: {α₁ : Type ?u.3881} → {α₂ : Type ?u.3883} → {β₁ : Type ?u.3880} → {β₂ : Type ?u.3882} → α₁ α₂β₁ β₂α₁ × β₁ α₂ × β₂
prodCongr
(
e₁: α₁ α₂
e₁
:
α₁: ?m.3841
α₁
α₂: ?m.3847
α₂
) (
e₂: β₁ β₂
e₂
:
β₁: ?m.3857
β₁
β₂: ?m.3867
β₂
) :
α₁: ?m.3841
α₁
×
β₁: ?m.3857
β₁
α₂: ?m.3847
α₂
×
β₂: ?m.3867
β₂
:= ⟨
Prod.map: {α₁ : Type ?u.3906} → {α₂ : Type ?u.3905} → {β₁ : Type ?u.3904} → {β₂ : Type ?u.3903} → (α₁α₂) → (β₁β₂) → α₁ × β₁α₂ × β₂
Prod.map
e₁: α₁ α₂
e₁
e₂: β₁ β₂
e₂
,
Prod.map: {α₁ : Type ?u.4059} → {α₂ : Type ?u.4058} → {β₁ : Type ?u.4057} → {β₂ : Type ?u.4056} → (α₁α₂) → (β₁β₂) → α₁ × β₁α₂ × β₂
Prod.map
e₁: α₁ α₂
e₁
.
symm: {α : Sort ?u.4067} → {β : Sort ?u.4066} → α ββ α
symm
e₂: β₁ β₂
e₂
.
symm: {α : Sort ?u.4141} → {β : Sort ?u.4140} → α ββ α
symm
, fun
a: α₁
a
,
b: β₁
b
⟩ =>

Goals accomplished! 🐙
α₁: Type ?u.3881

α₂: Type ?u.3883

β₁: Type ?u.3880

β₂: Type ?u.3882

e₁: α₁ α₂

e₂: β₁ β₂

x✝: α₁ × β₁

a: α₁

b: β₁


Prod.map (e₁.symm) (e₂.symm) (Prod.map e₁ e₂ (a, b)) = (a, b)

Goals accomplished! 🐙
, fun
a: α₂
a
,
b: β₂
b
⟩ =>

Goals accomplished! 🐙
α₁: Type ?u.3881

α₂: Type ?u.3883

β₁: Type ?u.3880

β₂: Type ?u.3882

e₁: α₁ α₂

e₂: β₁ β₂

x✝: α₂ × β₂

a: α₂

b: β₂


Prod.map (e₁) (e₂) (Prod.map e₁.symm e₂.symm (a, b)) = (a, b)

Goals accomplished! 🐙
#align equiv.prod_congr
Equiv.prodCongr: {α₁ : Type u_1} → {α₂ : Type u_2} → {β₁ : Type u_3} → {β₂ : Type u_4} → α₁ α₂β₁ β₂α₁ × β₁ α₂ × β₂
Equiv.prodCongr
#align equiv.prod_congr_apply
Equiv.prodCongr_apply: ∀ {α₁ : Type u_1} {α₂ : Type u_2} {β₁ : Type u_3} {β₂ : Type u_4} (e₁ : α₁ α₂) (e₂ : β₁ β₂), ↑(prodCongr e₁ e₂) = Prod.map e₁ e₂
Equiv.prodCongr_apply
@[simp] theorem
prodCongr_symm: ∀ {α₁ : Type u_1} {α₂ : Type u_2} {β₁ : Type u_3} {β₂ : Type u_4} (e₁ : α₁ α₂) (e₂ : β₁ β₂), (prodCongr e₁ e₂).symm = prodCongr e₁.symm e₂.symm
prodCongr_symm
(
e₁: α₁ α₂
e₁
:
α₁: ?m.5641
α₁
α₂: ?m.5647
α₂
) (
e₂: β₁ β₂
e₂
:
β₁: ?m.5657
β₁
β₂: ?m.5667
β₂
) : (
prodCongr: {α₁ : Type ?u.5682} → {α₂ : Type ?u.5681} → {β₁ : Type ?u.5680} → {β₂ : Type ?u.5679} → α₁ α₂β₁ β₂α₁ × β₁ α₂ × β₂
prodCongr
e₁: α₁ α₂
e₁
e₂: β₁ β₂
e₂
).
symm: {α : Sort ?u.5692} → {β : Sort ?u.5691} → α ββ α
symm
=
prodCongr: {α₁ : Type ?u.5703} → {α₂ : Type ?u.5702} → {β₁ : Type ?u.5701} → {β₂ : Type ?u.5700} → α₁ α₂β₁ β₂α₁ × β₁ α₂ × β₂
prodCongr
e₁: α₁ α₂
e₁
.
symm: {α : Sort ?u.5709} → {β : Sort ?u.5708} → α ββ α
symm
e₂: β₁ β₂
e₂
.
symm: {α : Sort ?u.5720} → {β : Sort ?u.5719} → α ββ α
symm
:=
rfl: ∀ {α : Sort ?u.5740} {a : α}, a = a
rfl
#align equiv.prod_congr_symm
Equiv.prodCongr_symm: ∀ {α₁ : Type u_1} {α₂ : Type u_2} {β₁ : Type u_3} {β₂ : Type u_4} (e₁ : α₁ α₂) (e₂ : β₁ β₂), (prodCongr e₁ e₂).symm = prodCongr e₁.symm e₂.symm
Equiv.prodCongr_symm
/-- Type product is commutative up to an equivalence: `α × β ≃ β × α`. This is `Prod.swap` as an equivalence.-/ def
prodComm: (α : Type u_1) → (β : Type u_2) → α × β β × α
prodComm
(
α: Type ?u.5832
α
β: Type ?u.5831
β
) :
α: ?m.5823
α
×
β: ?m.5826
β
β: ?m.5826
β
×
α: ?m.5823
α
:= ⟨
Prod.swap: {α : Type ?u.5851} → {β : Type ?u.5850} → α × ββ × α
Prod.swap
,
Prod.swap: {α : Type ?u.5862} → {β : Type ?u.5861} → α × ββ × α
Prod.swap
,
Prod.swap_swap: ∀ {α : Type ?u.5868} {β : Type ?u.5869} (x : α × β), Prod.swap (Prod.swap x) = x
Prod.swap_swap
,
Prod.swap_swap: ∀ {α : Type ?u.5881} {β : Type ?u.5882} (x : α × β), Prod.swap (Prod.swap x) = x
Prod.swap_swap
#align equiv.prod_comm
Equiv.prodComm: (α : Type u_1) → (β : Type u_2) → α × β β × α
Equiv.prodComm
@[simp] theorem
coe_prodComm: ∀ (α : Type u_1) (β : Type u_2), ↑(prodComm α β) = Prod.swap
coe_prodComm
(
α: Type u_1
α
β: ?m.5980
β
) : (⇑(
prodComm: (α : Type ?u.5992) → (β : Type ?u.5991) → α × β β × α
prodComm
α: ?m.5977
α
β: ?m.5980
β
) :
α: ?m.5977
α
×
β: ?m.5980
β
β: ?m.5980
β
×
α: ?m.5977
α
) =
Prod.swap: {α : Type ?u.6067} → {β : Type ?u.6066} → α × ββ × α
Prod.swap
:=
rfl: ∀ {α : Sort ?u.6124} {a : α}, a = a
rfl
#align equiv.coe_prod_comm
Equiv.coe_prodComm: ∀ (α : Type u_1) (β : Type u_2), ↑(prodComm α β) = Prod.swap
Equiv.coe_prodComm
@[simp] theorem
prodComm_apply: ∀ {α : Type u_1} {β : Type u_2} (x : α × β), ↑(prodComm α β) x = Prod.swap x
prodComm_apply
(
x: α × β
x
:
α: ?m.6165
α
×
β: ?m.6171
β
) :
prodComm: (α : Type ?u.6180) → (β : Type ?u.6179) → α × β β × α
prodComm
α: ?m.6165
α
β: ?m.6171
β
x: α × β
x
=
x: α × β
x
.
swap: {α : Type ?u.6252} → {β : Type ?u.6251} → α × ββ × α
swap
:=
rfl: ∀ {α : Sort ?u.6268} {a : α}, a = a
rfl
#align equiv.prod_comm_apply
Equiv.prodComm_apply: ∀ {α : Type u_1} {β : Type u_2} (x : α × β), ↑(prodComm α β) x = Prod.swap x
Equiv.prodComm_apply
@[simp] theorem
prodComm_symm: ∀ (α : Type u_1) (β : Type u_2), (prodComm α β).symm = prodComm β α
prodComm_symm
(
α: Type u_1
α
β: Type u_2
β
) : (
prodComm: (α : Type ?u.6314) → (β : Type ?u.6313) → α × β β × α
prodComm
α: ?m.6306
α
β: ?m.6309
β
).
symm: {α : Sort ?u.6316} → {β : Sort ?u.6315} → α ββ α
symm
=
prodComm: (α : Type ?u.6325) → (β : Type ?u.6324) → α × β β × α
prodComm
β: ?m.6309
β
α: ?m.6306
α
:=
rfl: ∀ {α : Sort ?u.6334} {a : α}, a = a
rfl
#align equiv.prod_comm_symm
Equiv.prodComm_symm: ∀ (α : Type u_1) (β : Type u_2), (prodComm α β).symm = prodComm β α
Equiv.prodComm_symm
/-- Type product is associative up to an equivalence. -/ @[
simps: ∀ (α : Type u_1) (β : Type u_2) (γ : Type u_3) (p : α × β × γ), (prodAssoc α β γ).symm p = ((p.fst, p.snd.fst), p.snd.snd)
simps
] def
prodAssoc: (α : Type ?u.6397) → (β : Type ?u.6396) → (γ : Type ?u.6394) → (α × β) × γ α × β × γ
prodAssoc
(
α: Type ?u.6397
α
β: Type ?u.6396
β
γ: ?m.6389
γ
) : (
α: ?m.6383
α
×
β: ?m.6386
β
) ×
γ: ?m.6389
γ
α: ?m.6383
α
×
β: ?m.6386
β
×
γ: ?m.6389
γ
:= ⟨fun
p: ?m.6419
p
=> (
p: ?m.6419
p
.
1: {α : Type ?u.6428} → {β : Type ?u.6427} → α × βα
1
.
1: {α : Type ?u.6434} → {β : Type ?u.6433} → α × βα
1
,
p: ?m.6419
p
.
1: {α : Type ?u.6446} → {β : Type ?u.6445} → α × βα
1
.
2: {α : Type ?u.6450} → {β : Type ?u.6449} → α × ββ
2
,
p: ?m.6419
p
.
2: {α : Type ?u.6454} → {β : Type ?u.6453} → α × ββ
2
), fun
p: ?m.6460
p
=> ((
p: ?m.6460
p
.
1: {α : Type ?u.6471} → {β : Type ?u.6470} → α × βα
1
,
p: ?m.6460
p
.
2: {α : Type ?u.6475} → {β : Type ?u.6474} → α × ββ
2
.
1: {α : Type ?u.6479} → {β : Type ?u.6478} → α × βα
1
),
p: ?m.6460
p
.
2: {α : Type ?u.6483} → {β : Type ?u.6482} → α × ββ
2
.
2: {α : Type ?u.6487} → {β : Type ?u.6486} → α × ββ
2
), fun ⟨⟨_, _⟩, _⟩ =>
rfl: ∀ {α : Sort ?u.6541} {a : α}, a = a
rfl
, fun ⟨_, ⟨_, _⟩⟩ =>
rfl: ∀ {α : Sort ?u.6702} {a : α}, a = a
rfl
#align equiv.prod_assoc
Equiv.prodAssoc: (α : Type u_1) → (β : Type u_2) → (γ : Type u_3) → (α × β) × γ α × β × γ
Equiv.prodAssoc
#align equiv.prod_assoc_symm_apply
Equiv.prodAssoc_symm_apply: ∀ (α : Type u_1) (β : Type u_2) (γ : Type u_3) (p : α × β × γ), (prodAssoc α β γ).symm p = ((p.fst, p.snd.fst), p.snd.snd)
Equiv.prodAssoc_symm_apply
#align equiv.prod_assoc_apply
Equiv.prodAssoc_apply: ∀ (α : Type u_1) (β : Type u_2) (γ : Type u_3) (p : (α × β) × γ), ↑(prodAssoc α β γ) p = (p.fst.fst, p.fst.snd, p.snd)
Equiv.prodAssoc_apply
/-- `γ`-valued functions on `α × β` are equivalent to functions `α → β → γ`. -/ @[
simps: ∀ (α : Type u_1) (β : Type u_2) (γ : Type u_3), ↑(curry α β γ) = Function.curry
simps
(config := { fullyApplied :=
false: Bool
false
})] def
curry: (α : Type u_1) → (β : Type u_2) → (γ : Type u_3) → (α × βγ) (αβγ)
curry
(
α: ?m.7175
α
β: Type ?u.7187
β
γ: ?m.7181
γ
) : (
α: ?m.7175
α
×
β: ?m.7178
β
γ: ?m.7181
γ
) ≃ (
α: ?m.7175
α
β: ?m.7178
β
γ: ?m.7181
γ
) where toFun :=
Function.curry: {α : Type ?u.7212} → {β : Type ?u.7211} → {φ : Type ?u.7210} → (α × βφ) → αβφ
Function.curry
invFun :=
uncurry: {α : Type ?u.7231} → {β : Type ?u.7230} → {φ : Type ?u.7229} → (αβφ) → α × βφ
uncurry
left_inv :=
uncurry_curry: ∀ {α : Type ?u.7247} {β : Type ?u.7246} {φ : Type ?u.7245} (f : α × βφ), uncurry (Function.curry f) = f
uncurry_curry
right_inv :=
curry_uncurry: ∀ {α : Type ?u.7263} {β : Type ?u.7262} {φ : Type ?u.7261} (f : αβφ), Function.curry (uncurry f) = f
curry_uncurry
#align equiv.curry
Equiv.curry: (α : Type u_1) → (β : Type u_2) → (γ : Type u_3) → (α × βγ) (αβγ)
Equiv.curry
#align equiv.curry_symm_apply
Equiv.curry_symm_apply: ∀ (α : Type u_1) (β : Type u_2) (γ : Type u_3), (curry α β γ).symm = uncurry
Equiv.curry_symm_apply
#align equiv.curry_apply
Equiv.curry_apply: ∀ (α : Type u_1) (β : Type u_2) (γ : Type u_3), ↑(curry α β γ) = Function.curry
Equiv.curry_apply
section /-- `PUnit` is a right identity for type product up to an equivalence. -/ @[
simps: ∀ (α : Type u_1) (p : α × PUnit), ↑(prodPUnit α) p = p.fst
simps
] def
prodPUnit: (α : Type ?u.7558) → α × PUnit α
prodPUnit
(
α: ?m.7552
α
) :
α: ?m.7552
α
×
PUnit: Sort ?u.7559
PUnit
α: ?m.7552
α
:= ⟨fun
p: ?m.7575
p
=>
p: ?m.7575
p
.
1: {α : Type ?u.7578} → {β : Type ?u.7577} → α × βα
1
, fun
a: ?m.7586
a
=> (
a: ?m.7586
a
,
PUnit.unit: PUnit
PUnit.unit
), fun ⟨_,
PUnit.unit: PUnit
PUnit.unit
⟩ =>
rfl: ∀ {α : Sort ?u.7625} {a : α}, a = a
rfl
, fun
_: ?m.7705
_
=>
rfl: ∀ {α : Sort ?u.7707} {a : α}, a = a
rfl
#align equiv.prod_punit
Equiv.prodPUnit: (α : Type u_1) → α × PUnit α
Equiv.prodPUnit
#align equiv.prod_punit_apply
Equiv.prodPUnit_apply: ∀ (α : Type u_1) (p : α × PUnit), ↑(prodPUnit α) p = p.fst
Equiv.prodPUnit_apply
#align equiv.prod_punit_symm_apply
Equiv.prodPUnit_symm_apply: ∀ (α : Type u_1) (a : α), (prodPUnit α).symm a = (a, PUnit.unit)
Equiv.prodPUnit_symm_apply
/-- `PUnit` is a left identity for type product up to an equivalence. -/ @[simps!] def
punitProd: (α : Type u_1) → PUnit × α α
punitProd
(
α: ?m.7867
α
) :
PUnit: Sort ?u.7874
PUnit
×
α: ?m.7867
α
α: ?m.7867
α
:= calc
PUnit: Sort ?u.7882
PUnit
×
α: Type ?u.7872
α
α: Type ?u.7872
α
×
PUnit: Sort ?u.7885
PUnit
:=
prodComm: (α : Type ?u.7887) → (β : Type ?u.7886) → α × β β × α
prodComm
_: Type ?u.7887
_
_: Type ?u.7886
_
_: ?m✝
_
α: Type ?u.7872
α
:=
prodPUnit: (α : Type ?u.7905) → α × PUnit α
prodPUnit
_: Type ?u.7905
_
#align equiv.punit_prod
Equiv.punitProd: (α : Type u_1) → PUnit × α α
Equiv.punitProd
#align equiv.punit_prod_symm_apply
Equiv.punitProd_symm_apply: ∀ (α : Type u_1) (a : α), (punitProd α).symm a = (PUnit.unit, a)
Equiv.punitProd_symm_apply
#align equiv.punit_prod_apply
Equiv.punitProd_apply: ∀ (α : Type u_1) (a : PUnit × α), ↑(punitProd α) a = a.snd
Equiv.punitProd_apply
/-- Any `Unique` type is a right identity for type product up to equivalence. -/ def
prodUnique: (α : Type u_1) → (β : Type u_2) → [inst : Unique β] → α × β α
prodUnique
(
α: Type ?u.8324
α
β: Type ?u.8323
β
) [
Unique: Sort ?u.8318 → Sort (max1?u.8318)
Unique
β: ?m.8315
β
] :
α: ?m.8312
α
×
β: ?m.8315
β
α: ?m.8312
α
:= ((
Equiv.refl: (α : Sort ?u.8329) → α α
Equiv.refl
α: Type ?u.8324
α
).
prodCongr: {α₁ : Type ?u.8333} → {α₂ : Type ?u.8332} → {β₁ : Type ?u.8331} → {β₂ : Type ?u.8330} → α₁ α₂β₁ β₂α₁ × β₁ α₂ × β₂
prodCongr
<|
equivPUnit: (α : Sort ?u.8346) → [inst : Unique α] → α PUnit
equivPUnit
.{_,1}
β: Type ?u.8323
β
).
trans: {α : Sort ?u.8356} → {β : Sort ?u.8355} → {γ : Sort ?u.8354} → α ββ γα γ
trans
<|
prodPUnit: (α : Type ?u.8368) → α × PUnit α
prodPUnit
α: Type ?u.8324
α
#align equiv.prod_unique
Equiv.prodUnique: (α : Type u_1) → (β : Type u_2) → [inst : Unique β] → α × β α
Equiv.prodUnique
@[simp] theorem
coe_prodUnique: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β], ↑(prodUnique α β) = Prod.fst
coe_prodUnique
[
Unique: Sort ?u.8407 → Sort (max1?u.8407)
Unique
β: ?m.8404
β
] : (⇑(
prodUnique: (α : Type ?u.8429) → (β : Type ?u.8428) → [inst : Unique β] → α × β α
prodUnique
α: ?m.8416
α
β: ?m.8404
β
) :
α: ?m.8416
α
×
β: ?m.8404
β
α: ?m.8416
α
) =
Prod.fst: {α : Type ?u.8499} → {β : Type ?u.8498} → α × βα
Prod.fst
:=
rfl: ∀ {α : Sort ?u.8557} {a : α}, a = a
rfl
#align equiv.coe_prod_unique
Equiv.coe_prodUnique: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β], ↑(prodUnique α β) = Prod.fst
Equiv.coe_prodUnique
theorem
prodUnique_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : α × β), ↑(prodUnique α β) x = x.fst
prodUnique_apply
[
Unique: Sort ?u.8616 → Sort (max1?u.8616)
Unique
β: ?m.8604
β
] (
x: α × β
x
:
α: ?m.8613
α
×
β: ?m.8604
β
) :
prodUnique: (α : Type ?u.8625) → (β : Type ?u.8624) → [inst : Unique β] → α × β α
prodUnique
α: ?m.8613
α
β: ?m.8604
β
x: α × β
x
=
x: α × β
x
.
1: {α : Type ?u.8694} → {β : Type ?u.8693} → α × βα
1
:=
rfl: ∀ {α : Sort ?u.8706} {a : α}, a = a
rfl
#align equiv.prod_unique_apply
Equiv.prodUnique_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : α × β), ↑(prodUnique α β) x = x.fst
Equiv.prodUnique_apply
@[simp] theorem
prodUnique_symm_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : α), (prodUnique α β).symm x = (x, default)
prodUnique_symm_apply
[
Unique: Sort ?u.8732 → Sort (max1?u.8732)
Unique
β: ?m.8729
β
] (
x: α
x
:
α: ?m.8736
α
) : (
prodUnique: (α : Type ?u.8746) → (β : Type ?u.8745) → [inst : Unique β] → α × β α
prodUnique
α: ?m.8736
α
β: ?m.8729
β
).
symm: {α : Sort ?u.8752} → {β : Sort ?u.8751} → α ββ α
symm
x: α
x
= (
x: α
x
,
default: {α : Sort ?u.8833} → [self : Inhabited α] → α
default
) :=
rfl: ∀ {α : Sort ?u.9208} {a : α}, a = a
rfl
#align equiv.prod_unique_symm_apply
Equiv.prodUnique_symm_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : α), (prodUnique α β).symm x = (x, default)
Equiv.prodUnique_symm_apply
/-- Any `Unique` type is a left identity for type product up to equivalence. -/ def
uniqueProd: (α : Type ?u.9271) → (β : Type ?u.9272) → [inst : Unique β] → β × α α
uniqueProd
(
α: ?m.9260
α
β: Type ?u.9272
β
) [
Unique: Sort ?u.9266 → Sort (max1?u.9266)
Unique
β: ?m.9263
β
] :
β: ?m.9263
β
×
α: ?m.9260
α
α: ?m.9260
α
:= ((
equivPUnit: (α : Sort ?u.9277) → [inst : Unique α] → α PUnit
equivPUnit
.{_,1}
β: Type ?u.9272
β
).
prodCongr: {α₁ : Type ?u.9284} → {α₂ : Type ?u.9283} → {β₁ : Type ?u.9282} → {β₂ : Type ?u.9281} → α₁ α₂β₁ β₂α₁ × β₁ α₂ × β₂
prodCongr
<|
Equiv.refl: (α : Sort ?u.9297) → α α
Equiv.refl
α: Type ?u.9271
α
).
trans: {α : Sort ?u.9304} → {β : Sort ?u.9303} → {γ : Sort ?u.9302} → α ββ γα γ
trans
<|
punitProd: (α : Type ?u.9316) → PUnit × α α
punitProd
α: Type ?u.9271
α
#align equiv.unique_prod
Equiv.uniqueProd: (α : Type u_1) → (β : Type u_2) → [inst : Unique β] → β × α α
Equiv.uniqueProd
@[simp] theorem
coe_uniqueProd: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β], ↑(uniqueProd α β) = Prod.snd
coe_uniqueProd
[
Unique: Sort ?u.9355 → Sort (max1?u.9355)
Unique
β: ?m.9352
β
] : (⇑(
uniqueProd: (α : Type ?u.9377) → (β : Type ?u.9376) → [inst : Unique β] → β × α α
uniqueProd
α: ?m.9364
α
β: ?m.9352
β
) :
β: ?m.9352
β
×
α: ?m.9364
α
α: ?m.9364
α
) =
Prod.snd: {α : Type ?u.9447} → {β : Type ?u.9446} → α × ββ
Prod.snd
:=
rfl: ∀ {α : Sort ?u.9505} {a : α}, a = a
rfl
#align equiv.coe_unique_prod
Equiv.coe_uniqueProd: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β], ↑(uniqueProd α β) = Prod.snd
Equiv.coe_uniqueProd
theorem
uniqueProd_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : β × α), ↑(uniqueProd α β) x = x.snd
uniqueProd_apply
[
Unique: Sort ?u.9567 → Sort (max1?u.9567)
Unique
β: ?m.9555
β
] (
x: β × α
x
:
β: ?m.9555
β
×
α: ?m.9564
α
) :
uniqueProd: (α : Type ?u.9576) → (β : Type ?u.9575) → [inst : Unique β] → β × α α
uniqueProd
α: ?m.9564
α
β: ?m.9555
β
x: β × α
x
=
x: β × α
x
.
2: {α : Type ?u.9645} → {β : Type ?u.9644} → α × ββ
2
:=
rfl: ∀ {α : Sort ?u.9657} {a : α}, a = a
rfl
#align equiv.unique_prod_apply
Equiv.uniqueProd_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : β × α), ↑(uniqueProd α β) x = x.snd
Equiv.uniqueProd_apply
@[simp] theorem
uniqueProd_symm_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : α), (uniqueProd α β).symm x = (default, x)
uniqueProd_symm_apply
[
Unique: Sort ?u.9690 → Sort (max1?u.9690)
Unique
β: ?m.9680
β
] (
x: α
x
:
α: ?m.9687
α
) : (
uniqueProd: (α : Type ?u.9697) → (β : Type ?u.9696) → [inst : Unique β] → β × α α
uniqueProd
α: ?m.9687
α
β: ?m.9680
β
).
symm: {α : Sort ?u.9703} → {β : Sort ?u.9702} → α ββ α
symm
x: α
x
= (
default: {α : Sort ?u.9783} → [self : Inhabited α] → α
default
,
x: α
x
) :=
rfl: ∀ {α : Sort ?u.10158} {a : α}, a = a
rfl
#align equiv.unique_prod_symm_apply
Equiv.uniqueProd_symm_apply: ∀ {β : Type u_1} {α : Type u_2} [inst : Unique β] (x : α), (uniqueProd α β).symm x = (default, x)
Equiv.uniqueProd_symm_apply
/-- `Empty` type is a right absorbing element for type product up to an equivalence. -/ def
prodEmpty: (α : Type ?u.10216) → α × Empty Empty
prodEmpty
(
α: Type ?u.10216
α
) :
α: ?m.10210
α
×
Empty: Type
Empty
Empty: Type
Empty
:=
equivEmpty: (α : Sort ?u.10219) → [inst : IsEmpty α] → α Empty
equivEmpty
_: Sort ?u.10219
_
#align equiv.prod_empty
Equiv.prodEmpty: (α : Type u_1) → α × Empty Empty
Equiv.prodEmpty
/-- `Empty` type is a left absorbing element for type product up to an equivalence. -/ def
emptyProd: (α : Type ?u.10318) → Empty × α Empty
emptyProd
(
α: ?m.10313
α
) :
Empty: Type
Empty
×
α: ?m.10313
α
Empty: Type
Empty
:=
equivEmpty: (α : Sort ?u.10322) → [inst : IsEmpty α] → α Empty
equivEmpty
_: Sort ?u.10322
_
#align equiv.empty_prod
Equiv.emptyProd: (α : Type u_1) → Empty × α Empty
Equiv.emptyProd
/-- `PEmpty` type is a right absorbing element for type product up to an equivalence. -/ def
prodPEmpty: (α : Type ?u.10413) → α × PEmpty PEmpty
prodPEmpty
(
α: ?m.10407
α
) :
α: ?m.10407
α
×
PEmpty: Sort ?u.10414
PEmpty
PEmpty: Sort ?u.10415
PEmpty
:=
equivPEmpty: (α : Sort ?u.10418) → [inst : IsEmpty α] → α PEmpty
equivPEmpty
_: Sort ?u.10418
_
#align equiv.prod_pempty
Equiv.prodPEmpty: (α : Type u_1) → α × PEmpty PEmpty
Equiv.prodPEmpty
/-- `PEmpty` type is a left absorbing element for type product up to an equivalence. -/ def
pemptyProd: (α : Type ?u.10509) → PEmpty × α PEmpty
pemptyProd
(
α: ?m.10504
α
) :
PEmpty: Sort ?u.10511
PEmpty
×
α: ?m.10504
α
PEmpty: Sort ?u.10512
PEmpty
:=
equivPEmpty: (α : Sort ?u.10515) → [inst : IsEmpty α] → α PEmpty
equivPEmpty
_: Sort ?u.10515
_
#align equiv.pempty_prod
Equiv.pemptyProd: (α : Type u_1) → PEmpty × α PEmpty
Equiv.pemptyProd
end section open Sum /-- `PSum` is equivalent to `Sum`. -/ def
psumEquivSum: (α : Type u_1) → (β : Type u_2) → α ⊕' β α β
psumEquivSum
(
α: ?m.10604
α
β: ?m.10607
β
) :
PSum: Sort ?u.10613 → Sort ?u.10612 → Sort (max(max1?u.10613)?u.10612)
PSum
α: ?m.10604
α
β: ?m.10607
β
Sum: Type ?u.10615 → Type ?u.10614 → Type (max?u.10615?u.10614)
Sum
α: ?m.10604
α
β: ?m.10607
β
where toFun
s: ?m.10626
s
:=
PSum.casesOn: {α : Sort ?u.10629} → {β : Sort ?u.10628} → {motive : α ⊕' βSort ?u.10630} → (t : α ⊕' β) → ((val : α) → motive (PSum.inl val)) → ((val : β) → motive (PSum.inr val)) → motive t
PSum.casesOn
s: ?m.10626
s
inl: {α : Type ?u.10707} → {β : Type ?u.10706} → αα β
inl
inr: {α : Type ?u.10714} → {β : Type ?u.10713} → βα β
inr
invFun :=
Sum.elim: {α : Type ?u.10669} → {β : Type ?u.10668} → {γ : Sort ?u.10667} → (αγ) → (βγ) → α βγ
Sum.elim
PSum.inl: {α : Sort ?u.10678} → {β : Sort ?u.10677} → αα ⊕' β
PSum.inl
PSum.inr: {α : Sort ?u.10685} → {β : Sort ?u.10684} → βα ⊕' β
PSum.inr
left_inv
s: ?m.10695
s
:=

Goals accomplished! 🐙
α: Type ?u.10615

β: Type ?u.10614

s: α ⊕' β


Sum.elim PSum.inl PSum.inr ((fun s => PSum.casesOn s inl inr) s) = s
α: Type ?u.10615

β: Type ?u.10614

val✝: α


inl
Sum.elim PSum.inl PSum.inr ((fun s => PSum.casesOn s inl inr) (PSum.inl val✝)) = PSum.inl val✝
α: Type ?u.10615

β: Type ?u.10614

val✝: β


inr
Sum.elim PSum.inl PSum.inr ((fun s => PSum.casesOn s inl inr) (PSum.inr val✝)) = PSum.inr val✝
α: Type ?u.10615

β: Type ?u.10614

s: α ⊕' β


Sum.elim PSum.inl PSum.inr ((fun s => PSum.casesOn s inl inr) s) = s
α: Type ?u.10615

β: Type ?u.10614

val✝: α


inl
Sum.elim PSum.inl PSum.inr ((fun s => PSum.casesOn s inl inr) (PSum.inl val✝)) = PSum.inl val✝
α: Type ?u.10615

β: Type ?u.10614

val✝: β


inr
Sum.elim PSum.inl PSum.inr ((fun s => PSum.casesOn s inl inr) (PSum.inr val✝)) = PSum.inr val✝
α: Type ?u.10615

β: Type ?u.10614

s: α ⊕' β


Sum.elim PSum.inl PSum.inr ((fun s => PSum.casesOn s inl inr) s) = s

Goals accomplished! 🐙
right_inv
s: ?m.10701
s
:=

Goals accomplished! 🐙
α: Type ?u.10615

β: Type ?u.10614

s: α β


(fun s => PSum.casesOn s inl inr) (Sum.elim PSum.inl PSum.inr s) = s
α: Type ?u.10615

β: Type ?u.10614

val✝: α


inl
(fun s => PSum.casesOn s inl inr) (Sum.elim PSum.inl PSum.inr (inl val✝)) = inl val✝
α: Type ?u.10615

β: Type ?u.10614

val✝: β


inr
(fun s => PSum.casesOn s inl inr) (Sum.elim PSum.inl PSum.inr (inr val✝)) = inr val✝
α: Type ?u.10615

β: Type ?u.10614

s: α β


(fun s => PSum.casesOn s inl inr) (Sum.elim PSum.inl PSum.inr s) = s
α: Type ?u.10615

β: Type ?u.10614

val✝: α


inl
(fun s => PSum.casesOn s inl inr) (Sum.elim PSum.inl PSum.inr (inl val✝)) = inl val✝
α: Type ?u.10615

β: Type ?u.10614

val✝: β


inr
(fun s => PSum.casesOn s inl inr) (Sum.elim PSum.inl PSum.inr (inr val✝)) = inr val✝
α: Type ?u.10615

β: Type ?u.10614

s: α β


(fun s => PSum.casesOn s inl inr) (Sum.elim PSum.inl PSum.inr s) = s

Goals accomplished! 🐙
#align equiv.psum_equiv_sum
Equiv.psumEquivSum: (α : Type u_1) → (β : Type u_2) → α ⊕' β α β
Equiv.psumEquivSum
/-- If `α ≃ α'` and `β ≃ β'`, then `α ⊕ β ≃ α' ⊕ β'`. This is `Sum.map` as an equivalence. -/ @[simps
apply: ∀ {α₁ : Type u_1} {α₂ : Type u_2} {β₁ : Type u_3} {β₂ : Type u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : α₁ β₁), ↑(sumCongr ea eb) a = Sum.map (ea) (eb) a
apply
] def
sumCongr: {α₁ : Type u_1} → {α₂ : Type u_2} → {β₁ : Type u_3} → {β₂ : Type u_4} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
sumCongr
(
ea: α₁ α₂
ea
:
α₁: ?m.11002
α₁
α₂: ?m.11008
α₂
) (
eb: β₁ β₂
eb
:
β₁: ?m.11018
β₁
β₂: ?m.11028
β₂
) :
Sum: Type ?u.11042 → Type ?u.11041 → Type (max?u.11042?u.11041)
Sum
α₁: ?m.11002
α₁
β₁: ?m.11018
β₁
Sum: Type ?u.11044 → Type ?u.11043 → Type (max?u.11044?u.11043)
Sum
α₂: ?m.11008
α₂
β₂: ?m.11028
β₂
:= ⟨
Sum.map: {α : Type ?u.11067} → {α' : Type ?u.11065} → {β : Type ?u.11066} → {β' : Type ?u.11064} → (αα') → (ββ') → α βα' β'
Sum.map
ea: α₁ α₂
ea
eb: β₁ β₂
eb
,
Sum.map: {α : Type ?u.11220} → {α' : Type ?u.11218} → {β : Type ?u.11219} → {β' : Type ?u.11217} → (αα') → (ββ') → α βα' β'
Sum.map
ea: α₁ α₂
ea
.
symm: {α : Sort ?u.11228} → {β : Sort ?u.11227} → α ββ α
symm
eb: β₁ β₂
eb
.
symm: {α : Sort ?u.11302} → {β : Sort ?u.11301} → α ββ α
symm
, fun
x: ?m.11379
x
=>

Goals accomplished! 🐙
α₁: Type ?u.11042

α₂: Type ?u.11044

β₁: Type ?u.11041

β₂: Type ?u.11043

ea: α₁ α₂

eb: β₁ β₂

x: α₁ β₁


Sum.map (ea.symm) (eb.symm) (Sum.map (ea) (eb) x) = x

Goals accomplished! 🐙
, fun
x: ?m.11385
x
=>

Goals accomplished! 🐙
α₁: Type ?u.11042

α₂: Type ?u.11044

β₁: Type ?u.11041

β₂: Type ?u.11043

ea: α₁ α₂

eb: β₁ β₂

x: α₂ β₂


Sum.map (ea) (eb) (Sum.map (ea.symm) (eb.symm) x) = x

Goals accomplished! 🐙
#align equiv.sum_congr
Equiv.sumCongr: {α₁ : Type u_1} → {α₂ : Type u_2} → {β₁ : Type u_3} → {β₂ : Type u_4} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
#align equiv.sum_congr_apply
Equiv.sumCongr_apply: ∀ {α₁ : Type u_1} {α₂ : Type u_2} {β₁ : Type u_3} {β₂ : Type u_4} (ea : α₁ α₂) (eb : β₁ β₂) (a : α₁ β₁), ↑(sumCongr ea eb) a = Sum.map (ea) (eb) a
Equiv.sumCongr_apply
/-- If `α ≃ α'` and `β ≃ β'`, then `PSum α β ≃ PSum α' β'`. -/ def
psumCongr: {α : Sort u_1} → {β : Sort u_2} → {γ : Sort u_3} → {δ : Sort u_4} → α βγ δα ⊕' γ β ⊕' δ
psumCongr
(
e₁: α β
e₁
:
α: ?m.12539
α
β: ?m.12545
β
) (
e₂: γ δ
e₂
:
γ: ?m.12555
γ
δ: ?m.12565
δ
) :
PSum: Sort ?u.12579 → Sort ?u.12578 → Sort (max(max1?u.12579)?u.12578)
PSum
α: ?m.12539
α
γ: ?m.12555
γ
PSum: Sort ?u.12581 → Sort ?u.12580 → Sort (max(max1?u.12581)?u.12580)
PSum
β: ?m.12545
β
δ: ?m.12565
δ
where toFun
x: ?m.12596
x
:=
PSum.casesOn: {α : Sort ?u.12599} → {β : Sort ?u.12598} → {motive : α ⊕' βSort ?u.12600} → (t : α ⊕' β) → ((val : α) → motive (PSum.inl val)) → ((val : β) → motive (PSum.inr val)) → motive t
PSum.casesOn
x: ?m.12596
x
(
PSum.inl: {α : Sort ?u.12690} → {β : Sort ?u.12689} → αα ⊕' β
PSum.inl
e₁: α β
e₁
) (
PSum.inr: {α : Sort ?u.12771} → {β : Sort ?u.12770} → βα ⊕' β
PSum.inr
e₂: γ δ
e₂
) invFun
x: ?m.12638
x
:=
PSum.casesOn: {α : Sort ?u.12641} → {β : Sort ?u.12640} → {motive : α ⊕' βSort ?u.12642} → (t : α ⊕' β) → ((val : α) → motive (PSum.inl val)) → ((val : β) → motive (PSum.inr val)) → motive t
PSum.casesOn
x: ?m.12638
x
(
PSum.inl: {α : Sort ?u.12852} → {β : Sort ?u.12851} → αα ⊕' β
PSum.inl
e₁: α β
e₁
.
symm: {α : Sort ?u.12859} → {β : Sort ?u.12858} → α ββ α
symm
) (
PSum.inr: {α : Sort ?u.12949} → {β : Sort ?u.12948} → βα ⊕' β
PSum.inr
e₂: γ δ
e₂
.
symm: {α : Sort ?u.12956} → {β : Sort ?u.12955} → α ββ α
symm
) left_inv :=

Goals accomplished! 🐙
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ


LeftInverse (fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: α


inl
(fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) ((fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) (PSum.inl x)) = PSum.inl x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: γ


inr
(fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) ((fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) (PSum.inr x)) = PSum.inr x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ


LeftInverse (fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: α


inl
(fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) ((fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) (PSum.inl x)) = PSum.inl x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: γ


inr
(fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) ((fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) (PSum.inr x)) = PSum.inr x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ


LeftInverse (fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)

Goals accomplished! 🐙
right_inv :=

Goals accomplished! 🐙
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ


Function.RightInverse (fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: β


inl
(fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) ((fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) (PSum.inl x)) = PSum.inl x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: δ


inr
(fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) ((fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) (PSum.inr x)) = PSum.inr x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ


Function.RightInverse (fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: β


inl
(fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) ((fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) (PSum.inl x)) = PSum.inl x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ

x: δ


inr
(fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)) ((fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) (PSum.inr x)) = PSum.inr x
α: Sort ?u.12569

β: Sort ?u.12568

γ: Sort ?u.12573

δ: Sort ?u.12572

e₁: α β

e₂: γ δ


Function.RightInverse (fun x => PSum.casesOn x (PSum.inl e₁.symm) (PSum.inr e₂.symm)) fun x => PSum.casesOn x (PSum.inl e₁) (PSum.inr e₂)

Goals accomplished! 🐙
#align equiv.psum_congr
Equiv.psumCongr: {α : Sort u_1} → {β : Sort u_2} → {γ : Sort u_3} → {δ : Sort u_4} → α βγ δα ⊕' γ β ⊕' δ
Equiv.psumCongr
/-- Combine two `Equiv`s using `PSum` in the domain and `Sum` in the codomain. -/ def
psumSum: {α₁ : Sort u_1} → {α₂ : Type u_2} → {β₁ : Sort u_3} → {β₂ : Type u_4} → α₁ α₂β₁ β₂α₁ ⊕' β₁ α₂ β₂
psumSum
(
ea: α₁ α₂
ea
:
α₁: ?m.16857
α₁
α₂: ?m.16863
α₂
) (
eb: β₁ β₂
eb
:
β₁: ?m.16873
β₁
β₂: ?m.16883
β₂
) :
PSum: Sort ?u.16897 → Sort ?u.16896 → Sort (max(max1?u.16897)?u.16896)
PSum
α₁: ?m.16857
α₁
β₁: ?m.16873
β₁
Sum: Type ?u.16899 → Type ?u.16898 → Type (max?u.16899?u.16898)
Sum
α₂: ?m.16863
α₂
β₂: ?m.16883
β₂
:= (
ea: α₁ α₂
ea
.
psumCongr: {α : Sort ?u.16910} → {β : Sort ?u.16909} → {γ : Sort ?u.16908} → {δ : Sort ?u.16907} → α βγ δα ⊕' γ β ⊕' δ
psumCongr
eb: β₁ β₂
eb
).
trans: {α : Sort ?u.16929} → {β : Sort ?u.16928} → {γ : Sort ?u.16927} → α ββ γα γ
trans
(
psumEquivSum: (α : Type ?u.16941) → (β : Type ?u.16940) → α ⊕' β α β
psumEquivSum
_: Type ?u.16941
_
_: Type ?u.16940
_
) #align equiv.psum_sum
Equiv.psumSum: {α₁ : Sort u_1} → {α₂ : Type u_2} → {β₁ : Sort u_3} → {β₂ : Type u_4} → α₁ α₂β₁ β₂α₁ ⊕' β₁ α₂ β₂
Equiv.psumSum
/-- Combine two `Equiv`s using `Sum` in the domain and `PSum` in the codomain. -/ def
sumPSum: {α₁ : Type u_1} → {α₂ : Sort u_2} → {β₁ : Type u_3} → {β₂ : Sort u_4} → α₁ α₂β₁ β₂α₁ β₁ α₂ ⊕' β₂
sumPSum
(
ea: α₁ α₂
ea
:
α₁: ?m.17082
α₁
α₂: ?m.17088
α₂
) (
eb: β₁ β₂
eb
:
β₁: ?m.17098
β₁
β₂: ?m.17108
β₂
) :
Sum: Type ?u.17122 → Type ?u.17121 → Type (max?u.17122?u.17121)
Sum
α₁: ?m.17082
α₁
β₁: ?m.17098
β₁
PSum: Sort ?u.17124 → Sort ?u.17123 → Sort (max(max1?u.17124)?u.17123)
PSum
α₂: ?m.17088
α₂
β₂: ?m.17108
β₂
:= (
ea: α₁ α₂
ea
.
symm: {α : Sort ?u.17133} → {β : Sort ?u.17132} → α ββ α
symm
.
psumSum: {α₁ : Sort ?u.17141} → {α₂ : Type ?u.17140} → {β₁ : Sort ?u.17139} → {β₂ : Type ?u.17138} → α₁ α₂β₁ β₂α₁ ⊕' β₁ α₂ β₂
psumSum
eb: β₁ β₂
eb
.
symm: {α : Sort ?u.17155} → {β : Sort ?u.17154} → α ββ α
symm
).
symm: {α : Sort ?u.17168} → {β : Sort ?u.17167} → α ββ α
symm
#align equiv.sum_psum
Equiv.sumPSum: {α₁ : Type u_1} → {α₂ : Sort u_2} → {β₁ : Type u_3} → {β₂ : Sort u_4} → α₁ α₂β₁ β₂α₁ β₁ α₂ ⊕' β₂
Equiv.sumPSum
@[simp] theorem
sumCongr_trans: ∀ {α₁ : Type u_1} {β₁ : Type u_2} {α₂ : Type u_3} {β₂ : Type u_4} {γ₁ : Type u_5} {γ₂ : Type u_6} (e : α₁ β₁) (f : α₂ β₂) (g : β₁ γ₁) (h : β₂ γ₂), (sumCongr e f).trans (sumCongr g h) = sumCongr (e.trans g) (f.trans h)
sumCongr_trans
(
e: α₁ β₁
e
:
α₁: ?m.17320
α₁
β₁: ?m.17326
β₁
) (
f: α₂ β₂
f
:
α₂: ?m.17336
α₂
β₂: ?m.17346
β₂
) (
g: β₁ γ₁
g
:
β₁: ?m.17326
β₁
γ₁: ?m.17360
γ₁
) (
h: β₂ γ₂
h
:
β₂: ?m.17346
β₂
γ₂: ?m.17378
γ₂
) : (
Equiv.sumCongr: {α₁ : Type ?u.17401} → {α₂ : Type ?u.17400} → {β₁ : Type ?u.17399} → {β₂ : Type ?u.17398} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
e: α₁ β₁
e
f: α₂ β₂
f
).
trans: {α : Sort ?u.17412} → {β : Sort ?u.17411} → {γ : Sort ?u.17410} → α ββ γα γ
trans
(
Equiv.sumCongr: {α₁ : Type ?u.17426} → {α₂ : Type ?u.17425} → {β₁ : Type ?u.17424} → {β₂ : Type ?u.17423} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
g: β₁ γ₁
g
h: β₂ γ₂
h
) =
Equiv.sumCongr: {α₁ : Type ?u.17444} → {α₂ : Type ?u.17443} → {β₁ : Type ?u.17442} → {β₂ : Type ?u.17441} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
(
e: α₁ β₁
e
.
trans: {α : Sort ?u.17451} → {β : Sort ?u.17450} → {γ : Sort ?u.17449} → α ββ γα γ
trans
g: β₁ γ₁
g
) (
f: α₂ β₂
f
.
trans: {α : Sort ?u.17468} → {β : Sort ?u.17467} → {γ : Sort ?u.17466} → α ββ γα γ
trans
h: β₂ γ₂
h
) :=

Goals accomplished! 🐙
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂


(sumCongr e f).trans (sumCongr g h) = sumCongr (e.trans g) (f.trans h)
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂

i: α₁ α₂


H
↑((sumCongr e f).trans (sumCongr g h)) i = ↑(sumCongr (e.trans g) (f.trans h)) i
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂


(sumCongr e f).trans (sumCongr g h) = sumCongr (e.trans g) (f.trans h)
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂

val✝: α₁


H.inl
↑((sumCongr e f).trans (sumCongr g h)) (inl val✝) = ↑(sumCongr (e.trans g) (f.trans h)) (inl val✝)
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂

val✝: α₂


H.inr
↑((sumCongr e f).trans (sumCongr g h)) (inr val✝) = ↑(sumCongr (e.trans g) (f.trans h)) (inr val✝)
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂

i: α₁ α₂


H
↑((sumCongr e f).trans (sumCongr g h)) i = ↑(sumCongr (e.trans g) (f.trans h)) i
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂

val✝: α₁


H.inl
↑((sumCongr e f).trans (sumCongr g h)) (inl val✝) = ↑(sumCongr (e.trans g) (f.trans h)) (inl val✝)
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂

val✝: α₂


H.inr
↑((sumCongr e f).trans (sumCongr g h)) (inr val✝) = ↑(sumCongr (e.trans g) (f.trans h)) (inr val✝)
α₁: Type u_1

β₁: Type u_2

α₂: Type u_3

β₂: Type u_4

γ₁: Type u_5

γ₂: Type u_6

e: α₁ β₁

f: α₂ β₂

g: β₁ γ₁

h: β₂ γ₂

i: α₁ α₂


H
↑((sumCongr e f).trans (sumCongr g h)) i = ↑(sumCongr (e.trans g) (f.trans h)) i

Goals accomplished! 🐙
#align equiv.sum_congr_trans
Equiv.sumCongr_trans: ∀ {α₁ : Type u_1} {β₁ : Type u_2} {α₂ : Type u_3} {β₂ : Type u_4} {γ₁ : Type u_5} {γ₂ : Type u_6} (e : α₁ β₁) (f : α₂ β₂) (g : β₁ γ₁) (h : β₂ γ₂), (sumCongr e f).trans (sumCongr g h) = sumCongr (e.trans g) (f.trans h)
Equiv.sumCongr_trans
@[simp] theorem
sumCongr_symm: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} (e : α β) (f : γ δ), (sumCongr e f).symm = sumCongr e.symm f.symm
sumCongr_symm
(
e: α β
e
:
α: ?m.17681
α
β: ?m.17687
β
) (
f: γ δ
f
:
γ: ?m.17697
γ
δ: ?m.17707
δ
) : (
Equiv.sumCongr: {α₁ : Type ?u.17722} → {α₂ : Type ?u.17721} → {β₁ : Type ?u.17720} → {β₂ : Type ?u.17719} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
e: α β
e
f: γ δ
f
).
symm: {α : Sort ?u.17732} → {β : Sort ?u.17731} → α ββ α
symm
=
Equiv.sumCongr: {α₁ : Type ?u.17743} → {α₂ : Type ?u.17742} → {β₁ : Type ?u.17741} → {β₂ : Type ?u.17740} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
e: α β
e
.
symm: {α : Sort ?u.17749} → {β : Sort ?u.17748} → α ββ α
symm
f: γ δ
f
.
symm: {α : Sort ?u.17760} → {β : Sort ?u.17759} → α ββ α
symm
:=
rfl: ∀ {α : Sort ?u.17780} {a : α}, a = a
rfl
#align equiv.sum_congr_symm
Equiv.sumCongr_symm: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} {δ : Type u_4} (e : α β) (f : γ δ), (sumCongr e f).symm = sumCongr e.symm f.symm
Equiv.sumCongr_symm
@[simp] theorem
sumCongr_refl: ∀ {α : Type u_1} {β : Type u_2}, sumCongr (Equiv.refl α) (Equiv.refl β) = Equiv.refl (α β)
sumCongr_refl
:
Equiv.sumCongr: {α₁ : Type ?u.17932} → {α₂ : Type ?u.17931} → {β₁ : Type ?u.17930} → {β₂ : Type ?u.17929} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
(
Equiv.refl: (α : Sort ?u.17937) → α α
Equiv.refl
α: ?m.17906
α
) (
Equiv.refl: (α : Sort ?u.17942) → α α
Equiv.refl
β: ?m.17925
β
) =
Equiv.refl: (α : Sort ?u.17947) → α α
Equiv.refl
(
Sum: Type ?u.17949 → Type ?u.17948 → Type (max?u.17949?u.17948)
Sum
α: ?m.17906
α
β: ?m.17925
β
) :=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2


α: Type u_1

β: Type u_2

i: α β


H
↑(sumCongr (Equiv.refl α) (Equiv.refl β)) i = ↑(Equiv.refl (α β)) i
α: Type u_1

β: Type u_2


α: Type u_1

β: Type u_2

val✝: α


H.inl
↑(sumCongr (Equiv.refl α) (Equiv.refl β)) (inl val✝) = ↑(Equiv.refl (α β)) (inl val✝)
α: Type u_1

β: Type u_2

val✝: β


H.inr
↑(sumCongr (Equiv.refl α) (Equiv.refl β)) (inr val✝) = ↑(Equiv.refl (α β)) (inr val✝)
α: Type u_1

β: Type u_2

i: α β


H
↑(sumCongr (Equiv.refl α) (Equiv.refl β)) i = ↑(Equiv.refl (α β)) i
α: Type u_1

β: Type u_2

val✝: α


H.inl
↑(sumCongr (Equiv.refl α) (Equiv.refl β)) (inl val✝) = ↑(Equiv.refl (α β)) (inl val✝)
α: Type u_1

β: Type u_2

val✝: β


H.inr
↑(sumCongr (Equiv.refl α) (Equiv.refl β)) (inr val✝) = ↑(Equiv.refl (α β)) (inr val✝)
α: Type u_1

β: Type u_2

i: α β


H
↑(sumCongr (Equiv.refl α) (Equiv.refl β)) i = ↑(Equiv.refl (α β)) i

Goals accomplished! 🐙
#align equiv.sum_congr_refl
Equiv.sumCongr_refl: ∀ {α : Type u_1} {β : Type u_2}, sumCongr (Equiv.refl α) (Equiv.refl β) = Equiv.refl (α β)
Equiv.sumCongr_refl
namespace Perm /-- Combine a permutation of `α` and of `β` into a permutation of `α ⊕ β`. -/ @[reducible] def
sumCongr: {α : Type ?u.18119} → {β : Type ?u.18118} → Perm αPerm βPerm (α β)
sumCongr
(
ea: Perm α
ea
:
Equiv.Perm: Sort ?u.18111 → Sort (max1?u.18111)
Equiv.Perm
α: ?m.18100
α
) (
eb: Perm β
eb
:
Equiv.Perm: Sort ?u.18114 → Sort (max1?u.18114)
Equiv.Perm
β: ?m.18108
β
) :
Equiv.Perm: Sort ?u.18117 → Sort (max1?u.18117)
Equiv.Perm
(
Sum: Type ?u.18119 → Type ?u.18118 → Type (max?u.18119?u.18118)
Sum
α: ?m.18100
α
β: ?m.18108
β
) :=
Equiv.sumCongr: {α₁ : Type ?u.18132} → {α₂ : Type ?u.18131} → {β₁ : Type ?u.18130} → {β₂ : Type ?u.18129} → α₁ α₂β₁ β₂α₁ β₁ α₂ β₂
Equiv.sumCongr
ea: Perm α
ea
eb: Perm β
eb
#align equiv.perm.sum_congr
Equiv.Perm.sumCongr: {α : Type u_1} → {β : Type u_2} → Perm αPerm βPerm (α β)
Equiv.Perm.sumCongr
@[simp] theorem
sumCongr_apply: ∀ {α : Type u_1} {β : Type u_2} (ea : Perm α) (eb : Perm β) (x : α β), ↑(sumCongr ea eb) x = Sum.map (ea) (eb) x
sumCongr_apply
(
ea: Perm α
ea
:
Equiv.Perm: Sort ?u.18236 → Sort (max1?u.18236)
Equiv.Perm
α: ?m.18233
α
) (
eb: Perm β
eb
:
Equiv.Perm: Sort ?u.18247 → Sort (max1?u.18247)
Equiv.Perm
β: ?m.18241
β
) (
x: α β
x
:
Sum: Type ?u.18251 → Type ?u.18250 → Type (max?u.18251?u.18250)
Sum
α: ?m.18233
α
β: ?m.18241
β
) :
sumCongr: {α : Type ?u.18256} → {β : Type ?u.18255} → Perm αPerm βPerm (α β)
sumCongr
ea: Perm α
ea
eb: Perm β
eb
x: α β
x
=
Sum.map: {α : Type ?u.18334} → {α' : Type ?u.18332} → {β : Type ?u.18333} → {β' : Type ?u.18331} → (αα') → (ββ') → α βα' β'
Sum.map
(⇑
ea: Perm α
ea
) (⇑
eb: Perm β
eb
)
x: α β
x
:=
Equiv.sumCongr_apply: ∀ {α₁ : Type ?u.18486} {α₂ : Type ?u.18485} {β₁ : Type ?u.18484} {β₂ : Type ?u.18483} (ea : α₁ α₂) (eb : β₁ β₂) (a : α₁ β₁), ↑(Equiv.sumCongr ea eb) a = Sum.map (ea) (eb) a
Equiv.sumCongr_apply
ea: Perm α
ea
eb: Perm β
eb
x: α β
x
#align equiv.perm.sum_congr_apply
Equiv.Perm.sumCongr_apply: ∀ {α : Type u_1} {β : Type u_2} (ea : Perm α) (eb : Perm β) (x : α β), ↑(sumCongr ea eb) x = Sum.map (ea) (eb) x
Equiv.Perm.sumCongr_apply
-- porting note: it seems the general theorem about `Equiv` is now applied, so there's no need -- to have this version also have `@[simp]`. Similarly for below. theorem
sumCongr_trans: ∀ {α : Type u_1} {β : Type u_2} (e : Perm α) (f : Perm β) (g : Perm α) (h : Perm β), (sumCongr e f).trans (sumCongr g h) = sumCongr (e.trans g) (f.trans h)
sumCongr_trans
(
e: Perm α
e
:
Equiv.Perm: Sort ?u.18551 → Sort (max1?u.18551)
Equiv.Perm
α: ?m.18548
α
) (
f: Perm β
f
:
Equiv.Perm: Sort ?u.18562 → Sort (max1?u.18562)
Equiv.Perm
β: ?m.18556
β
) (
g: Perm α
g
:
Equiv.Perm: Sort ?u.18565 → Sort (max1?u.18565)
Equiv.Perm
α: ?m.18548
α
) (
h: Perm β
h
:
Equiv.Perm: Sort ?u.18568 → Sort (max1?u.18568)
Equiv.Perm
β: ?m.18556
β
) : (
sumCongr: {α : Type ?u.18573} → {β : Type ?u.18572} → Perm αPerm βPerm (α β)
sumCongr
e: Perm α
e
f: Perm β
f
).
trans: {α : Sort ?u.18580} → {β : Sort ?u.18579} → {γ : Sort ?u.18578} → α ββ γα γ
trans
(
sumCongr: {α : Type ?u.18592} → {β : Type ?u.18591} → Perm αPerm βPerm (α β)
sumCongr
g: Perm α
g
h: Perm β
h
) =
sumCongr: {α : Type ?u.18600} → {β : Type ?u.18599} → Perm αPerm βPerm (α β)
sumCongr
(
e: Perm α
e
.
trans: {α : Sort ?u.18605} → {β : Sort ?u.18604} → {γ : Sort ?u.18603} → α ββ γα γ
trans
g: Perm α
g
) (
f: Perm β
f
.
trans: {α : Sort ?u.18620} → {β : Sort ?u.18619} → {γ : Sort ?u.18618} → α ββ γα γ
trans
h: Perm β
h
) :=
Equiv.sumCongr_trans: ∀ {α₁ : Type ?u.18641} {β₁ : Type ?u.18642} {α₂ : Type ?u.18643} {β₂ : Type ?u.18644} {γ₁ : Type ?u.18645} {γ₂ : Type ?u.18646} (e : α₁ β₁) (f : α₂ β₂) (g : β₁ γ₁) (h : β₂ γ₂), (Equiv.sumCongr e f).trans (Equiv.sumCongr g h) = Equiv.sumCongr (e.trans g) (f.trans h)
Equiv.sumCongr_trans
e: Perm α
e
f: Perm β
f
g: Perm α
g
h: Perm β
h
#align equiv.perm.sum_congr_trans
Equiv.Perm.sumCongr_trans: ∀ {α : Type u_1} {β : Type u_2} (e : Perm α) (f : Perm β) (g : Perm α) (h : Perm β), (sumCongr e f).trans (sumCongr g h) = sumCongr (e.trans g) (f.trans h)
Equiv.Perm.sumCongr_trans
theorem
sumCongr_symm: ∀ {α : Type u_1} {β : Type u_2} (e : Perm α) (f : Perm β), (sumCongr e f).symm = sumCongr e.symm f.symm
sumCongr_symm
(
e: Perm α
e
:
Equiv.Perm: Sort ?u.18681 → Sort (max1?u.18681)
Equiv.Perm
α: ?m.18678
α
) (
f: Perm β
f
:
Equiv.Perm: Sort ?u.18692 → Sort (max1?u.18692)
Equiv.Perm
β: ?m.18686
β
) : (
sumCongr: {α : Type ?u.18697} → {β : Type ?u.18696} → Perm αPerm βPerm (α β)
sumCongr
e: Perm α
e
f: Perm β
f
).
symm: {α : Sort ?u.18703} → {β : Sort ?u.18702} → α ββ α
symm
=
sumCongr: {α : Type ?u.18712} → {β : Type ?u.18711} → Perm αPerm βPerm (α β)
sumCongr
e: Perm α
e
.
symm: {α : Sort ?u.18716} → {β : Sort ?u.18715} → α ββ α
symm
f: Perm β
f
.
symm: {α : Sort ?u.18727} → {β : Sort ?u.18726} → α ββ α
symm
:=
Equiv.sumCongr_symm: ∀ {α : Type ?u.18743} {β : Type ?u.18744} {γ : Type ?u.18745} {δ : Type ?u.18746} (e : α β) (f : γ δ), (Equiv.sumCongr e f).symm = Equiv.sumCongr e.symm f.symm
Equiv.sumCongr_symm
e: Perm α
e
f: Perm β
f
#align equiv.perm.sum_congr_symm
Equiv.Perm.sumCongr_symm: ∀ {α : Type u_1} {β : Type u_2} (e : Perm α) (f : Perm β), (sumCongr e f).symm = sumCongr e.symm f.symm
Equiv.Perm.sumCongr_symm
theorem
sumCongr_refl: ∀ {α : Type u_1} {β : Type u_2}, sumCongr (Equiv.refl α) (Equiv.refl β) = Equiv.refl (α β)
sumCongr_refl
:
sumCongr: {α : Type ?u.18791} → {β : Type ?u.18790} → Perm αPerm βPerm (α β)
sumCongr
(
Equiv.refl: (α : Sort ?u.18794) → α α
Equiv.refl
α: ?m.18773
α
) (
Equiv.refl: (α : Sort ?u.18797) → α α
Equiv.refl
β: ?m.18786
β
) =
Equiv.refl: (α : Sort ?u.18800) → α α
Equiv.refl
(
Sum: Type ?u.18802 → Type ?u.18801 → Type (max?u.18802?u.18801)
Sum
α: ?m.18773
α
β: ?m.18786
β
) :=
Equiv.sumCongr_refl: ∀ {α : Type ?u.18807} {β : Type ?u.18808}, Equiv.sumCongr (Equiv.refl α) (Equiv.refl β) = Equiv.refl (α β)
Equiv.sumCongr_refl
#align equiv.perm.sum_congr_refl
Equiv.Perm.sumCongr_refl: ∀ {α : Type u_1} {β : Type u_2}, sumCongr (Equiv.refl α) (Equiv.refl β) = Equiv.refl (α β)
Equiv.Perm.sumCongr_refl
end Perm /-- `Bool` is equivalent the sum of two `PUnit`s. -/ def
boolEquivPUnitSumPUnit: Bool PUnit PUnit
boolEquivPUnitSumPUnit
:
Bool: Type
Bool
Sum: Type ?u.18829 → Type ?u.18828 → Type (max?u.18829?u.18828)
Sum
PUnit: Type u
PUnit
.{u + 1}
PUnit: Type v
PUnit
.{v + 1} := ⟨fun
b: ?m.18844
b
=>
cond: {α : Type ?u.18846} → Boolααα
cond
b: ?m.18844
b
(
inr: {α : Type ?u.18849} → {β : Type ?u.18848} → βα β
inr
PUnit.unit: PUnit
PUnit.unit
) (
inl: {α : Type ?u.18856} → {β : Type ?u.18855} → αα β
inl
PUnit.unit: PUnit
PUnit.unit
),
Sum.elim: {α : Type ?u.18864} → {β : Type ?u.18863} → {γ : Sort ?u.18862} → (αγ) → (βγ) → α βγ
Sum.elim
(fun
_: ?m.18871
_
=>
false: Bool
false
) fun
_: ?m.18876
_
=>
true: Bool
true
, fun
b: ?m.18884
b
=>

Goals accomplished! 🐙
b: Bool


Sum.elim (fun x => false) (fun x => true) ((fun b => bif b then inr PUnit.unit else inl PUnit.unit) b) = b

false
Sum.elim (fun x => false) (fun x => true) ((fun b => bif b then inr PUnit.unit else inl PUnit.unit) false) = false

true
Sum.elim (fun x => false) (fun x => true) ((fun b => bif b then inr PUnit.unit else inl PUnit.unit) true) = true
b: Bool


Sum.elim (fun x => false) (fun x => true) ((fun b => bif b then inr PUnit.unit else inl PUnit.unit) b) = b

false
Sum.elim (fun x => false) (fun x => true) ((fun b => bif b then inr PUnit.unit else inl PUnit.unit) false) = false

true
Sum.elim (fun x => false) (fun x => true) ((fun b => bif b then inr PUnit.unit else inl PUnit.unit) true) = true
b: Bool


Sum.elim (fun x => false) (fun x => true) ((fun b => bif b then inr PUnit.unit else inl PUnit.unit) b) = b

Goals accomplished! 🐙
, fun
s: ?m.18890
s
=>

Goals accomplished! 🐙

(fun b => bif b then inr PUnit.unit else inl PUnit.unit) (Sum.elim (fun x => false) (fun x => true) s) = s

inl.unit
(fun b => bif b then inr PUnit.unit else inl PUnit.unit) (Sum.elim (fun x => false) (fun x => true) (inl PUnit.unit)) = inl PUnit.unit

inr.unit
(fun b => bif b then inr PUnit.unit else inl PUnit.unit) (Sum.elim (fun x => false) (fun x => true) (inr PUnit.unit)) = inr PUnit.unit

(fun b => bif b then inr PUnit.unit else inl PUnit.unit) (Sum.elim (fun x => false) (fun x => true) s) = s

inl.unit
(fun b => bif b then inr PUnit.unit else inl PUnit.unit) (Sum.elim (fun x => false) (fun x => true) (inl PUnit.unit)) = inl PUnit.unit

inr.unit
(fun b => bif b then inr PUnit.unit else inl PUnit.unit) (Sum.elim (fun x => false) (fun x => true) (inr PUnit.unit)) = inr PUnit.unit

(fun b => bif b then inr PUnit.unit else inl PUnit.unit) (Sum.elim (fun x => false) (fun x => true) s) = s

Goals accomplished! 🐙
#align equiv.bool_equiv_punit_sum_punit
Equiv.boolEquivPUnitSumPUnit: Bool PUnit PUnit
Equiv.boolEquivPUnitSumPUnit
/-- Sum of types is commutative up to an equivalence. This is `Sum.swap` as an equivalence. -/ @[simps (config := { fullyApplied :=
false: Bool
false
})
apply: ∀ (α : Type u_1) (β : Type u_2), ↑(sumComm α β) = Sum.swap
apply
] def
sumComm: (α : Type u_1) → (β : Type u_2) → α β β α
sumComm
(
α: ?m.19124
α
β: Type ?u.19132
β
) :
Sum: Type ?u.19133 → Type ?u.19132 → Type (max?u.19133?u.19132)
Sum
α: ?m.19124
α
β: ?m.19127
β
Sum: Type ?u.19135 → Type ?u.19134 → Type (max?u.19135?u.19134)
Sum
β: ?m.19127
β
α: ?m.19124
α
:= ⟨
Sum.swap: {α : Type ?u.19152} → {β : Type ?u.19151} → α ββ α
Sum.swap
,
Sum.swap: {α : Type ?u.19163} → {β : Type ?u.19162} → α ββ α
Sum.swap
,
Sum.swap_swap: ∀ {α : Type ?u.19170} {β : Type ?u.19169} (x : α β), Sum.swap (Sum.swap x) = x
Sum.swap_swap
,
Sum.swap_swap: ∀ {α : Type ?u.19183} {β : Type ?u.19182} (x : α β), Sum.swap (Sum.swap x) = x
Sum.swap_swap
#align equiv.sum_comm
Equiv.sumComm: (α : Type u_1) → (β : Type u_2) → α β β α
Equiv.sumComm
#align equiv.sum_comm_apply
Equiv.sumComm_apply: ∀ (α : Type u_1) (β : Type u_2), ↑(sumComm α β) = Sum.swap
Equiv.sumComm_apply
@[simp] theorem
sumComm_symm: ∀ (α : Type u_1) (β : Type u_2), (sumComm α β).symm = sumComm β α
sumComm_symm
(
α: ?m.19328
α
β: Type u_2
β
) : (
sumComm: (α : Type ?u.19336) → (β : Type ?u.19335) → α β β α
sumComm
α: ?m.19328
α
β: ?m.19331
β
).
symm: {α : Sort ?u.19338} → {β : Sort ?u.19337} → α ββ α
symm
=
sumComm: (α : Type ?u.19347) → (β : Type ?u.19346) → α β β α
sumComm
β: ?m.19331
β
α: ?m.19328
α
:=
rfl: ∀ {α : Sort ?u.19356} {a : α}, a = a
rfl
#align equiv.sum_comm_symm
Equiv.sumComm_symm: ∀ (α : Type u_1) (β : Type u_2), (sumComm α β).symm = sumComm β α
Equiv.sumComm_symm
/-- Sum of types is associative up to an equivalence. -/ def
sumAssoc: (α : Type u_1) → (β : Type u_2) → (γ : Type u_3) → (α β) γ α β γ
sumAssoc
(
α: Type ?u.19421
α
β: Type ?u.19420
β
γ: ?m.19413
γ
) :
Sum: Type ?u.19419 → Type ?u.19418 → Type (max?u.19419?u.19418)
Sum
(
Sum: Type ?u.19421 → Type ?u.19420 → Type (max?u.19421?u.19420)
Sum
α: ?m.19407
α
β: ?m.19410
β
)
γ: ?m.19413
γ
Sum: Type ?u.19423 → Type ?u.19422 → Type (max?u.19423?u.19422)
Sum
α: ?m.19407
α
(
Sum: Type ?u.19425 → Type ?u.19424 → Type (max?u.19425?u.19424)
Sum
β: ?m.19410
β
γ: ?m.19413
γ
) := ⟨
Sum.elim: {α : Type ?u.19444} → {β : Type ?u.19443} → {γ : Sort ?u.19442} → (αγ) → (βγ) → α βγ
Sum.elim
(
Sum.elim: {α : Type ?u.19454} → {β : Type ?u.19453} → {γ : Sort ?u.19452} → (αγ) → (βγ) → α βγ
Sum.elim
Sum.inl: {α : Type ?u.19463} → {β : Type ?u.19462} → αα β
Sum.inl
(
Sum.inr: {α : Type ?u.19480} → {β : Type ?u.19479} → βα β
Sum.inr
Sum.inl: {α : Type ?u.19487} → {β : Type ?u.19486} → αα β
Sum.inl
)) (
Sum.inr: {α : Type ?u.19510} → {β : Type ?u.19509} → βα β
Sum.inr
Sum.inr: {α : Type ?u.19517} → {β : Type ?u.19516} → βα β
Sum.inr
),
Sum.elim: {α : Type ?u.19531} → {β : Type ?u.19530} → {γ : Sort ?u.19529} → (αγ) → (βγ) → α βγ
Sum.elim
(
Sum.inl: {α : Type ?u.19546} → {β : Type ?u.19545} → αα β
Sum.inl
Sum.inl: {α : Type ?u.19553} → {β : Type ?u.19552} → αα β
Sum.inl
) <|
Sum.elim: {α : Type ?u.19564} → {β : Type ?u.19563} → {γ : Sort ?u.19562} → (αγ) → (βγ) → α βγ
Sum.elim
(
Sum.inl: {α : Type ?u.19579} → {β : Type ?u.19578} → αα β
Sum.inl
Sum.inr: {α : Type ?u.19586} → {β : Type ?u.19585} → βα β
Sum.inr
)
Sum.inr: {α : Type ?u.19596} → {β : Type ?u.19595} → βα β
Sum.inr
,

Goals accomplished! 🐙
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418


LeftInverse (Sum.elim (inl inl) (Sum.elim (inl inr) inr)) (Sum.elim (Sum.elim inl (inr inl)) (inr inr))
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: α


inl.inl
Sum.elim (inl inl) (Sum.elim (inl inr) inr) (Sum.elim (Sum.elim inl (inr inl)) (inr inr) (inl (inl val✝))) = inl (inl val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: β


inl.inr
Sum.elim (inl inl) (Sum.elim (inl inr) inr) (Sum.elim (Sum.elim inl (inr inl)) (inr inr) (inl (inr val✝))) = inl (inr val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: γ


inr
Sum.elim (inl inl) (Sum.elim (inl inr) inr) (Sum.elim (Sum.elim inl (inr inl)) (inr inr) (inr val✝)) = inr val✝
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418


LeftInverse (Sum.elim (inl inl) (Sum.elim (inl inr) inr)) (Sum.elim (Sum.elim inl (inr inl)) (inr inr))
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: α


inl.inl
Sum.elim (inl inl) (Sum.elim (inl inr) inr) (Sum.elim (Sum.elim inl (inr inl)) (inr inr) (inl (inl val✝))) = inl (inl val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: β


inl.inr
Sum.elim (inl inl) (Sum.elim (inl inr) inr) (Sum.elim (Sum.elim inl (inr inl)) (inr inr) (inl (inr val✝))) = inl (inr val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: γ


inr
Sum.elim (inl inl) (Sum.elim (inl inr) inr) (Sum.elim (Sum.elim inl (inr inl)) (inr inr) (inr val✝)) = inr val✝
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418


LeftInverse (Sum.elim (inl inl) (Sum.elim (inl inr) inr)) (Sum.elim (Sum.elim inl (inr inl)) (inr inr))

Goals accomplished! 🐙
,

Goals accomplished! 🐙
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418


Function.RightInverse (Sum.elim (inl inl) (Sum.elim (inl inr) inr)) (Sum.elim (Sum.elim inl (inr inl)) (inr inr))
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: α


inl
Sum.elim (Sum.elim inl (inr inl)) (inr inr) (Sum.elim (inl inl) (Sum.elim (inl inr) inr) (inl val✝)) = inl val✝
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: β


inr.inl
Sum.elim (Sum.elim inl (inr inl)) (inr inr) (Sum.elim (inl inl) (Sum.elim (inl inr) inr) (inr (inl val✝))) = inr (inl val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: γ


inr.inr
Sum.elim (Sum.elim inl (inr inl)) (inr inr) (Sum.elim (inl inl) (Sum.elim (inl inr) inr) (inr (inr val✝))) = inr (inr val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418


Function.RightInverse (Sum.elim (inl inl) (Sum.elim (inl inr) inr)) (Sum.elim (Sum.elim inl (inr inl)) (inr inr))
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: α


inl
Sum.elim (Sum.elim inl (inr inl)) (inr inr) (Sum.elim (inl inl) (Sum.elim (inl inr) inr) (inl val✝)) = inl val✝
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: β


inr.inl
Sum.elim (Sum.elim inl (inr inl)) (inr inr) (Sum.elim (inl inl) (Sum.elim (inl inr) inr) (inr (inl val✝))) = inr (inl val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418

val✝: γ


inr.inr
Sum.elim (Sum.elim inl (inr inl)) (inr inr) (Sum.elim (inl inl) (Sum.elim (inl inr) inr) (inr (inr val✝))) = inr (inr val✝)
α: Type ?u.19421

β: Type ?u.19420

γ: Type ?u.19418


Function.RightInverse (Sum.elim (inl inl) (Sum.elim (inl inr) inr)) (Sum.elim (Sum.elim inl (inr inl)) (inr inr))

Goals accomplished! 🐙
#align equiv.sum_assoc
Equiv.sumAssoc: (α : Type u_1) → (β : Type u_2) → (γ : Type u_3) → (α β) γ α β γ
Equiv.sumAssoc
@[simp] theorem
sumAssoc_apply_inl_inl: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (a : α), ↑(sumAssoc α β γ) (inl (inl a)) = inl a
sumAssoc_apply_inl_inl
(
a: unknown metavariable '?_uniq.19929'
a
) :
sumAssoc: (α : Type ?u.19946) → (β : Type ?u.19945) → (γ : Type ?u.19944) → (α β) γ α β γ
sumAssoc
α: ?m.19915
α
β: ?m.19926
β
γ: ?m.19937
γ
(
inl: {α : Type ?u.20019} → {β : Type ?u.20018} → αα β
inl
(
inl: {α : Type ?u.20025} → {β : Type ?u.20024} → αα β
inl
a: ?m.19940
a
)) =
inl: {α : Type ?u.20031} → {β : Type ?u.20030} → αα β
inl
a: ?m.19940
a
:=
rfl: ∀ {α : Sort ?u.20076} {a : α}, a = a
rfl
#align equiv.sum_assoc_apply_inl_inl
Equiv.sumAssoc_apply_inl_inl: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (a : α), ↑(sumAssoc α β γ) (inl (inl a)) = inl a
Equiv.sumAssoc_apply_inl_inl
@[simp] theorem
sumAssoc_apply_inl_inr: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (b : β), ↑(sumAssoc α β γ) (inl (inr b)) = inr (inl b)
sumAssoc_apply_inl_inr
(
b: unknown metavariable '?_uniq.20150'
b
) :
sumAssoc: (α : Type ?u.20167) → (β : Type ?u.20166) → (γ : Type ?u.20165) → (α β) γ α β γ
sumAssoc
α: ?m.20136
α
β: ?m.20147
β
γ: ?m.20158
γ
(
inl: {α : Type ?u.20240} → {β : Type ?u.20239} → αα β
inl
(
inr: {α : Type ?u.20246} → {β : Type ?u.20245} → βα β
inr
b: ?m.20161
b
)) =
inr: {α : Type ?u.20252} → {β : Type ?u.20251} → βα β
inr
(
inl: {α : Type ?u.20256} → {β : Type ?u.20255} → αα β
inl
b: ?m.20161
b
) :=
rfl: ∀ {α : Sort ?u.20303} {a : α}, a = a
rfl
#align equiv.sum_assoc_apply_inl_inr
Equiv.sumAssoc_apply_inl_inr: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (b : β), ↑(sumAssoc α β γ) (inl (inr b)) = inr (inl b)
Equiv.sumAssoc_apply_inl_inr
@[simp] theorem
sumAssoc_apply_inr: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (c : γ), ↑(sumAssoc α β γ) (inr c) = inr (inr c)
sumAssoc_apply_inr
(
c: unknown metavariable '?_uniq.20366'
c
) :
sumAssoc: (α : Type ?u.20394) → (β : Type ?u.20393) → (γ : Type ?u.20392) → (α β) γ α β γ
sumAssoc
α: ?m.20363
α
β: ?m.20374
β
γ: ?m.20385
γ
(
inr: {α : Type ?u.20467} → {β : Type ?u.20466} → βα β
inr
c: ?m.20388
c
) =
inr: {α : Type ?u.20473} → {β : Type ?u.20472} → βα β
inr
(
inr: {α : Type ?u.20477} → {β : Type ?u.20476} → βα β
inr
c: ?m.20388
c
) :=
rfl: ∀ {α : Sort ?u.20524} {a : α}, a = a
rfl
#align equiv.sum_assoc_apply_inr
Equiv.sumAssoc_apply_inr: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (c : γ), ↑(sumAssoc α β γ) (inr c) = inr (inr c)
Equiv.sumAssoc_apply_inr
@[simp] theorem
sumAssoc_symm_apply_inl: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (a : α), (sumAssoc α β γ).symm (inl a) = inl (inl a)
sumAssoc_symm_apply_inl
{
α: Type u_1
α
β: ?m.20576
β
γ: ?m.20579
γ
} (
a: ?m.20582
a
) : (
sumAssoc: (α : Type ?u.20588) → (β : Type ?u.20587) → (γ : Type ?u.20586) → (α β) γ α β γ
sumAssoc
α: ?m.20573
α
β: ?m.20576
β
γ: ?m.20579
γ
).
symm: {α : Sort ?u.20590} → {β : Sort ?u.20589} → α ββ α
symm
(
inl: {α : Type ?u.20668} → {β : Type ?u.20667} → αα β
inl
a: ?m.20582
a
) =
inl: {α : Type ?u.20674} → {β : Type ?u.20673} → αα β
inl
(
inl: {α : Type ?u.20678} → {β : Type ?u.20677} → αα β
inl
a: ?m.20582
a
) :=
rfl: ∀ {α : Sort ?u.20731} {a : α}, a = a
rfl
#align equiv.sum_assoc_symm_apply_inl
Equiv.sumAssoc_symm_apply_inl: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (a : α), (sumAssoc α β γ).symm (inl a) = inl (inl a)
Equiv.sumAssoc_symm_apply_inl
@[simp] theorem
sumAssoc_symm_apply_inr_inl: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (b : β), (sumAssoc α β γ).symm (inr (inl b)) = inl (inr b)
sumAssoc_symm_apply_inr_inl
{
α: ?m.20783
α
β: ?m.20786
β
γ: Type u_3
γ
} (
b: ?m.20792
b
) : (
sumAssoc: (α : Type ?u.20798) → (β : Type ?u.20797) → (γ : Type ?u.20796) → (α β) γ α β γ
sumAssoc
α: ?m.20783
α
β: ?m.20786
β
γ: ?m.20789
γ
).
symm: {α : Sort ?u.20800} → {β : Sort ?u.20799} → α ββ α
symm
(
inr: {α : Type ?u.20878} → {β : Type ?u.20877} → βα β
inr
(
inl: {α : Type ?u.20884} → {β : Type ?u.20883} → αα β
inl
b: ?m.20792
b
)) =
inl: {α : Type ?u.20890} → {β : Type ?u.20889} → αα β
inl
(
inr: {α : Type ?u.20894} → {β : Type ?u.20893} → βα β
inr
b: ?m.20792
b
) :=
rfl: ∀ {α : Sort ?u.20947} {a : α}, a = a
rfl
#align equiv.sum_assoc_symm_apply_inr_inl
Equiv.sumAssoc_symm_apply_inr_inl: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (b : β), (sumAssoc α β γ).symm (inr (inl b)) = inl (inr b)
Equiv.sumAssoc_symm_apply_inr_inl
@[simp] theorem
sumAssoc_symm_apply_inr_inr: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (c : γ), (sumAssoc α β γ).symm (inr (inr c)) = inr c
sumAssoc_symm_apply_inr_inr
{
α: Type u_1
α
β: ?m.21005
β
γ: Type u_3
γ
} (
c: ?m.21011
c
) : (
sumAssoc: (α : Type ?u.21017) → (β : Type ?u.21016) → (γ : Type ?u.21015) → (α β) γ α β γ
sumAssoc
α: ?m.21002
α
β: ?m.21005
β
γ: ?m.21008
γ
).
symm: {α : Sort ?u.21019} → {β : Sort ?u.21018} → α ββ α
symm
(
inr: {α : Type ?u.21097} → {β : Type ?u.21096} → βα β
inr
(
inr: {α : Type ?u.21103} → {β : Type ?u.21102} → βα β
inr
c: ?m.21011
c
)) =
inr: {α : Type ?u.21109} → {β : Type ?u.21108} → βα β
inr
c: ?m.21011
c
:=
rfl: ∀ {α : Sort ?u.21154} {a : α}, a = a
rfl
#align equiv.sum_assoc_symm_apply_inr_inr
Equiv.sumAssoc_symm_apply_inr_inr: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} (c : γ), (sumAssoc α β γ).symm (inr (inr c)) = inr c
Equiv.sumAssoc_symm_apply_inr_inr
/-- Sum with `IsEmpty` is equivalent to the original type. -/ @[simps
symm_apply: ∀ (α : Type u_1) (β : Type u_2) [inst : IsEmpty β] (val : α), (sumEmpty α β).symm val = inl val
symm_apply
] def
sumEmpty: (α : Type u_1) → (β : Type u_2) → [inst : IsEmpty β] → α β α
sumEmpty
(
α: Type ?u.21221
α
β: ?m.21212
β
) [
IsEmpty: Sort ?u.21215 → Prop
IsEmpty
β: ?m.21212
β
] :
Sum: Type ?u.21221 → Type ?u.21220 → Type (max?u.21221?u.21220)
Sum
α: ?m.21209
α
β: ?m.21212
β
α: ?m.21209
α
where toFun :=
Sum.elim: {α : Type ?u.21234} → {β : Type ?u.21233} → {γ : Sort ?u.21232} → (αγ) → (βγ) → α βγ
Sum.elim
id: {α : Sort ?u.21242} → αα
id
isEmptyElim: {α : Sort ?u.21248} → [inst : IsEmpty α] → {p : αSort ?u.21247} → (a : α) → p a
isEmptyElim
invFun :=
inl: {α : Type ?u.21295} → {β : Type ?u.21294} → αα β
inl
left_inv
s: ?m.21302
s
:=

Goals accomplished! 🐙
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

s: α β


inl (Sum.elim id (fun a => isEmptyElim a) s) = s
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

val✝: α


inl
inl (Sum.elim id (fun a => isEmptyElim a) (inl val✝)) = inl val✝
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

x: β


inr
inl (Sum.elim id (fun a => isEmptyElim a) (inr x)) = inr x
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

s: α β


inl (Sum.elim id (fun a => isEmptyElim a) s) = s
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

val✝: α


inl
inl (Sum.elim id (fun a => isEmptyElim a) (inl val✝)) = inl val✝
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

val✝: α


inl
inl (Sum.elim id (fun a => isEmptyElim a) (inl val✝)) = inl val✝
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

x: β


inr
inl (Sum.elim id (fun a => isEmptyElim a) (inr x)) = inr x

Goals accomplished! 🐙
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

s: α β


inl (Sum.elim id (fun a => isEmptyElim a) s) = s
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

x: β


inr
inl (Sum.elim id (fun a => isEmptyElim a) (inr x)) = inr x
α: Type ?u.21221

β: Type ?u.21220

inst✝: IsEmpty β

x: β


inr
inl (Sum.elim id (fun a => isEmptyElim a) (inr x)) = inr x

Goals accomplished! 🐙
right_inv
_: ?m.21308
_
:=
rfl: ∀ {α : Sort ?u.21310} {a : α}, a = a
rfl
#align equiv.sum_empty
Equiv.sumEmpty: (α : Type u_1) → (β : Type u_2) → [inst : IsEmpty β] → α β α
Equiv.sumEmpty
#align equiv.sum_empty_symm_apply
Equiv.sumEmpty_symm_apply: ∀ (α : Type u_1) (β : Type u_2) [inst : IsEmpty β] (val : α), (sumEmpty α β).symm val = inl val
Equiv.sumEmpty_symm_apply
@[simp] theorem
sumEmpty_apply_inl: ∀ {β : Type u_1} {α : Type u_2} [inst : IsEmpty β] (a : α), ↑(sumEmpty α β) (inl a) = a
sumEmpty_apply_inl
[
IsEmpty: Sort ?u.21482 → Prop
IsEmpty
β: ?m.21479
β
] (
a: α
a
:
α: ?m.21486
α
) :
sumEmpty: (α : Type ?u.21496) → (β : Type ?u.21495) → [inst : IsEmpty β] → α β α
sumEmpty
α: ?m.21486
α
β: ?m.21479
β
(
Sum.inl: {α : Type ?u.21563} → {β : Type ?u.21562} → αα β
Sum.inl
a: α
a
) =
a: α
a
:=
rfl: ∀ {α : Sort ?u.21575} {a : α}, a = a
rfl
#align equiv.sum_empty_apply_inl
Equiv.sumEmpty_apply_inl: ∀ {β : Type u_1} {α : Type u_2} [inst : IsEmpty β] (a : α), ↑(sumEmpty α β) (inl a) = a
Equiv.sumEmpty_apply_inl
/-- The sum of `IsEmpty` with any type is equivalent to that type. -/ @[simps!
symm_apply: ∀ (α : Type u_1) (β : Type u_2) [inst : IsEmpty α] (a : β), (emptySum α β).symm a = inr a
symm_apply
] def
emptySum: (α : Type ?u.21627) → (β : Type ?u.21626) → [inst : IsEmpty α] → α β β
emptySum
(
α: ?m.21615
α
β: Type ?u.21626
β
) [
IsEmpty: Sort ?u.21621 → Prop
IsEmpty
α: ?m.21615
α
] :
Sum: Type ?u.21627 → Type ?u.21626 → Type (max?u.21627?u.21626)
Sum
α: ?m.21615
α
β: ?m.21618
β
β: ?m.21618
β
:= (
sumComm: (α : Type ?u.21633) → (β : Type ?u.21632) → α β β α
sumComm
_: Type ?u.21633
_
_: Type ?u.21632
_
).
trans: {α : Sort ?u.21638} → {β : Sort ?u.21637} → {γ : Sort ?u.21636} → α ββ γα γ
trans
<|
sumEmpty: (α : Type ?u.21654) → (β : Type ?u.21653) → [inst : IsEmpty β] → α β α
sumEmpty
_: Type ?u.21654
_
_: Type ?u.21653
_
#align equiv.empty_sum
Equiv.emptySum: (α : Type u_1) → (β : Type u_2) → [inst : IsEmpty α] → α β β
Equiv.emptySum
#align equiv.empty_sum_symm_apply
Equiv.emptySum_symm_apply: ∀ (α : Type u_1) (β : Type u_2) [inst : IsEmpty α] (a : β), (emptySum α β).symm a = inr a
Equiv.emptySum_symm_apply
@[simp] theorem
emptySum_apply_inr: ∀ {α : Type u_1} {β : Type u_2} [inst : IsEmpty α] (b : β), ↑(emptySum α β) (inr b) = b
emptySum_apply_inr
[
IsEmpty: Sort ?u.21855 → Prop
IsEmpty
α: ?m.21852
α
] (
b: β
b
:
β: ?m.21859
β
) :
emptySum: (α : Type ?u.21869) → (β : Type ?u.21868) → [inst : IsEmpty α] → α β β
emptySum
α: ?m.21852
α
β: ?m.21859
β
(
Sum.inr: {α : Type ?u.21936} → {β : Type ?u.21935} → βα β
Sum.inr
b: β
b
) =
b: β
b
:=
rfl: ∀ {α : Sort ?u.21948} {a : α}, a = a
rfl
#align equiv.empty_sum_apply_inr
Equiv.emptySum_apply_inr: ∀ {α : Type u_1} {β : Type u_2} [inst : IsEmpty α] (b : β), ↑(emptySum α β) (inr b) = b
Equiv.emptySum_apply_inr
/-- `Option α` is equivalent to `α ⊕ PUnit` -/ def
optionEquivSumPUnit: (α : Type ?u.21993) → Option α α PUnit
optionEquivSumPUnit
(
α: ?m.21988
α
) :
Option: Type ?u.21993 → Type ?u.21993
Option
α: ?m.21988
α
Sum: Type ?u.21995 → Type ?u.21994 → Type (max?u.21995?u.21994)
Sum
α: ?m.21988
α
PUnit: Sort ?u.21996
PUnit
:= ⟨fun
o: ?m.22012
o
=>
o: ?m.22012
o
.
elim: {α : Type ?u.22015} → {β : Sort ?u.22014} → Option αβ(αβ) → β
elim
(
inr: {α : Type ?u.22025} → {β : Type ?u.22024} → βα β
inr
PUnit.unit: PUnit
PUnit.unit
)
inl: {α : Type ?u.22032} → {β : Type ?u.22031} → αα β
inl
, fun
s: ?m.22041
s
=>
s: ?m.22041
s
.
elim: {α : Type ?u.22045} → {β : Type ?u.22044} → {γ : Sort ?u.22043} → (αγ) → (βγ) → α βγ
elim
some: {α : Type ?u.22055} → αOption α
some
fun
_: ?m.22061
_
=>
none: {α : Type ?u.22063} → Option α
none
, fun
o: ?m.22070
o
=>

Goals accomplished! 🐙
α: Type ?u.21993

o: Option α


(fun s => Sum.elim some (fun x => none) s) ((fun o => Option.elim o (inr PUnit.unit) inl) o) = o
α: Type ?u.21993


none
(fun s => Sum.elim some (fun x => none) s) ((fun o => Option.elim o (inr PUnit.unit) inl) none) = none
α: Type ?u.21993

val✝: α


some
(fun s => Sum.elim some (fun x => none) s) ((fun o => Option.elim o (inr PUnit.unit) inl) (some val✝)) = some val✝
α: Type ?u.21993

o: Option α


(fun s => Sum.elim some (fun x => none) s) ((fun o => Option.elim o (inr PUnit.unit) inl) o) = o
α: Type ?u.21993


none
(fun s => Sum.elim some (fun x => none) s) ((fun o => Option.elim o (inr PUnit.unit) inl) none) = none
α: Type ?u.21993

val✝: α


some
(fun s => Sum.elim some (fun x => none) s) ((fun o => Option.elim o (inr PUnit.unit) inl) (some val✝)) = some val✝
α: Type ?u.21993

o: Option α


(fun s => Sum.elim some (fun x => none) s) ((fun o => Option.elim o (inr PUnit.unit) inl) o) = o

Goals accomplished! 🐙
, fun
s: ?m.22076
s
=>

Goals accomplished! 🐙
α: Type ?u.21993

s: α PUnit


(fun o => Option.elim o (inr PUnit.unit) inl) ((fun s => Sum.elim some (fun x => none) s) s) = s
α: Type ?u.21993

val✝: α


inl
(fun o => Option.elim o (inr PUnit.unit) inl) ((fun s => Sum.elim some (fun x => none) s) (inl val✝)) = inl val✝
α: Type ?u.21993


inr.unit
(fun o => Option.elim o (inr PUnit.unit) inl) ((fun s => Sum.elim some (fun x => none) s) (inr PUnit.unit)) = inr PUnit.unit
α: Type ?u.21993

s: α PUnit


(fun o => Option.elim o (inr PUnit.unit) inl) ((fun s => Sum.elim some (fun x => none) s) s) = s
α: Type ?u.21993

val✝: α


inl
(fun o => Option.elim o (inr PUnit.unit) inl) ((fun s => Sum.elim some (fun x => none) s) (inl val✝)) = inl val✝
α: Type ?u.21993


inr.unit
(fun o => Option.elim o (inr PUnit.unit) inl) ((fun s => Sum.elim some (fun x => none) s) (inr PUnit.unit)) = inr PUnit.unit
α: Type ?u.21993

s: α PUnit


(fun o => Option.elim o (inr PUnit.unit) inl) ((fun s => Sum.elim some (fun x => none) s) s) = s

Goals accomplished! 🐙
#align equiv.option_equiv_sum_punit
Equiv.optionEquivSumPUnit: (α : Type u_1) → Option α α PUnit
Equiv.optionEquivSumPUnit
@[simp] theorem
optionEquivSumPUnit_none: ∀ {α : Type u_1}, ↑(optionEquivSumPUnit α) none = inr PUnit.unit
optionEquivSumPUnit_none
:
optionEquivSumPUnit: (α : Type ?u.22367) → Option α α PUnit
optionEquivSumPUnit
α: ?m.22362
α
none: {α : Type ?u.22435} → Option α
none
=
Sum.inr: {α : Type ?u.22439} → {β : Type ?u.22438} → βα β
Sum.inr
PUnit.unit: PUnit
PUnit.unit
:=
rfl: ∀ {α : Sort ?u.22482} {a : α}, a = a
rfl
#align equiv.option_equiv_sum_punit_none
Equiv.optionEquivSumPUnit_none: ∀ {α : Type u_1}, ↑(optionEquivSumPUnit α) none = inr PUnit.unit
Equiv.optionEquivSumPUnit_none
@[simp] theorem
optionEquivSumPUnit_some: ∀ {α : Type u_1} (a : α), ↑(optionEquivSumPUnit α) (some a) = inl a
optionEquivSumPUnit_some
(
a: α
a
) :
optionEquivSumPUnit: (α : Type ?u.22540) → Option α α PUnit
optionEquivSumPUnit
α: ?m.22532
α
(
some: {α : Type ?u.22608} → αOption α
some
a: ?m.22535
a
) =
Sum.inl: {α : Type ?u.22612} → {β : Type ?u.22611} → αα β
Sum.inl
a: ?m.22535
a
:=
rfl: ∀ {α : Sort ?u.22655} {a : α}, a = a
rfl
#align equiv.option_equiv_sum_punit_some
Equiv.optionEquivSumPUnit_some: ∀ {α : Type u_1} (a : α), ↑(optionEquivSumPUnit α) (some a) = inl a
Equiv.optionEquivSumPUnit_some
@[simp] theorem
optionEquivSumPUnit_coe: ∀ {α : Type u_1} (a : α), ↑(optionEquivSumPUnit α) (some a) = inl a
optionEquivSumPUnit_coe
(
a: α
a
:
α: ?m.22703
α
) :
optionEquivSumPUnit: (α : Type ?u.22710) → Option α α PUnit
optionEquivSumPUnit
α: ?m.22703
α
a: α
a
=
Sum.inl: {α : Type ?u.22861} → {β : Type ?u.22860} → αα β
Sum.inl
a: α
a
:=
rfl: ∀ {α : Sort ?u.22904} {a : α}, a = a
rfl
#align equiv.option_equiv_sum_punit_coe
Equiv.optionEquivSumPUnit_coe: ∀ {α : Type u_1} (a : α), ↑(optionEquivSumPUnit α) (some a) = inl a
Equiv.optionEquivSumPUnit_coe
@[simp] theorem
optionEquivSumPUnit_symm_inl: ∀ {α : Type u_1} (a : α), (optionEquivSumPUnit α).symm (inl a) = some a
optionEquivSumPUnit_symm_inl
(
a: α
a
) : (
optionEquivSumPUnit: (α : Type ?u.22966) → Option α α PUnit
optionEquivSumPUnit
α: ?m.22958
α
).
symm: {α : Sort ?u.22968} → {β : Sort ?u.22967} → α ββ α
symm
(
Sum.inl: {α : Type ?u.23040} → {β : Type ?u.23039} → αα β
Sum.inl
a: ?m.22961
a
) =
a: ?m.22961
a
:=
rfl: ∀ {α : Sort ?u.23221} {a : α}, a = a
rfl
#align equiv.option_equiv_sum_punit_symm_inl
Equiv.optionEquivSumPUnit_symm_inl: ∀ {α : Type u_1} (a : α), (optionEquivSumPUnit α).symm (inl a) = some a
Equiv.optionEquivSumPUnit_symm_inl
@[simp] theorem
optionEquivSumPUnit_symm_inr: ∀ {α : Type u_1} (a : PUnit), (optionEquivSumPUnit α).symm (inr a) = none
optionEquivSumPUnit_symm_inr
(a) : (
optionEquivSumPUnit: (α : Type ?u.23272) → Option α α PUnit
optionEquivSumPUnit
α: ?m.23264
α
).
symm: {α : Sort ?u.23274} → {β : Sort ?u.23273} → α ββ α
symm
(
Sum.inr: {α : Type ?u.23346} → {β : Type ?u.23345} → βα β
Sum.inr
a: ?m.23267
a
) =
none: {α : Type ?u.23351} → Option α
none
:=
rfl: ∀ {α : Sort ?u.23389} {a : α}, a = a
rfl
#align equiv.option_equiv_sum_punit_symm_inr
Equiv.optionEquivSumPUnit_symm_inr: ∀ {α : Type u_1} (a : PUnit), (optionEquivSumPUnit α).symm (inr a) = none
Equiv.optionEquivSumPUnit_symm_inr
/-- The set of `x : Option α` such that `isSome x` is equivalent to `α`. -/ @[
simps: ∀ (α : Type u_1) (x : α), ↑((optionIsSomeEquiv α).symm x) = some x
simps
] def
optionIsSomeEquiv: (α : Type u_1) → { x // Option.isSome x = true } α
optionIsSomeEquiv
(
α: Type ?u.23433
α
) : {
x: Option α
x
:
Option: Type ?u.23433 → Type ?u.23433
Option
α: ?m.23425
α
//
x: Option α
x
.
isSome: {α : Type ?u.23435} → Option αBool
isSome
} ≃
α: ?m.23425
α
where toFun
o: ?m.23530
o
:=
Option.get: {α : Type ?u.23532} → (o : Option α) → Option.isSome o = trueα
Option.get
_: Option ?m.23533
_
o: ?m.23530
o
.
2: ∀ {α : Sort ?u.23535} {p : αProp} (self : Subtype p), p self
2
invFun
x: ?m.23551
x
:= ⟨
some: {α : Type ?u.23562} → αOption α
some
x: ?m.23551
x
,
rfl: ∀ {α : Sort ?u.23564} {a : α}, a = a
rfl
⟩ left_inv
_: ?m.23584
_
:=
Subtype.eq: ∀ {α : Type ?u.23586} {p : αProp} {a1 a2 : { x // p x }}, a1 = a2a1 = a2
Subtype.eq
<|