Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - feat: port Logic.Equiv.Option #674

Closed
wants to merge 155 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
155 commits
Select commit Hold shift + click to select a range
6631370
port of data.funlike.*
kim-em Nov 6, 2022
7700ecf
long line
kim-em Nov 7, 2022
df8ac7f
docBlame
kim-em Nov 7, 2022
4f074d3
import
kim-em Nov 7, 2022
6170aab
copy and paste mathport output
kim-em Nov 7, 2022
76bc3e2
restore lemmas
kim-em Nov 7, 2022
9bac811
Merge branch 'fun_like' into equiv_defs
kim-em Nov 7, 2022
f240c63
starting
kim-em Nov 7, 2022
246a5c8
rename
kim-em Nov 7, 2022
b21f8e8
Fix: `Function.Surjective.unique` was inferring `α : Prop` when it ca…
Vierkantor Nov 8, 2022
d88f4d8
Builds until the Quot section
Vierkantor Nov 8, 2022
aa3e0d1
Move to appropriate file
Vierkantor Nov 8, 2022
465c82b
Revert wrong implicitness
Vierkantor Nov 8, 2022
487f8b6
`to_fun_as_coe` is useless
Vierkantor Nov 8, 2022
bef5f97
merge master
kim-em Nov 11, 2022
1239fed
long lines
kim-em Nov 11, 2022
95ad701
finish last part + capitalisation
dwarn Nov 13, 2022
462f3d9
Merge remote-tracking branch 'origin/master' into equiv_defs
kim-em Nov 13, 2022
5ecbbc1
long lines, fix error
kim-em Nov 13, 2022
bfb9fe4
some additional aligns
kim-em Nov 13, 2022
685ac7a
Merge remote-tracking branch 'origin/master' into equiv_defs
kim-em Nov 14, 2022
889dce5
?
kim-em Nov 14, 2022
d5fa3ff
fix right_inv proof
pechersky Nov 14, 2022
be11406
fix again
kim-em Nov 14, 2022
d6d3b83
Use Logic.Equiv.Defs instead of Data.Equiv.Basic
pechersky Nov 14, 2022
8fa0ee6
fix and speed up Functor `map_equiv`
pechersky Nov 14, 2022
5f8ae4c
revert change that hides the simp failure
kim-em Nov 14, 2022
97c6582
comment out potentially bad simps
kim-em Nov 14, 2022
2b43c57
merge
kim-em Nov 15, 2022
6c79022
Merge branch 'master' into equiv_defs
Ruben-VandeVelde Nov 17, 2022
3e6f4d1
initial commit
77Tigers Nov 17, 2022
2a6c0a1
add Trans instance for Equiv
77Tigers Nov 17, 2022
5f4889b
Merge branch 'equiv_defs' into logic_equiv_basic
77Tigers Nov 17, 2022
8299dc9
fix prodComm
77Tigers Nov 17, 2022
78c142a
Merge remote-tracking branch 'origin/master' into equiv_defs
kim-em Nov 17, 2022
04d962a
linting
kim-em Nov 17, 2022
c74802b
lint
kim-em Nov 17, 2022
a067a60
Mathlib.lean
kim-em Nov 17, 2022
4f566ca
style
digama0 Nov 18, 2022
b775485
Merge branch 'equiv_defs' into logic_equiv_basic
kim-em Nov 18, 2022
ad7097b
Merge remote-tracking branch 'origin/equiv_defs' into logic_equiv_basic
kim-em Nov 18, 2022
c574c3a
Merge remote-tracking branch 'origin/master' into logic_equiv_basic
kim-em Nov 18, 2022
ac33b9d
add Logic.Equiv.Basic to Mathlib.lean
kbuzzard Nov 18, 2022
c387d53
epsilon
kbuzzard Nov 18, 2022
809e0ec
Merge branch 'master' into logic_equiv_basic
kbuzzard Nov 18, 2022
f935c14
epsilon more
kbuzzard Nov 18, 2022
d3af301
epsilon more
kbuzzard Nov 18, 2022
8c43b71
Update Mathlib/Logic/Equiv/Basic.lean
77Tigers Nov 18, 2022
f209c6c
satisfy long line linter (mostly)
77Tigers Nov 18, 2022
c18a129
up to line 632
kbuzzard Nov 18, 2022
2ef04b4
"fixed" weird universe errors in prodUnique, etc.
77Tigers Nov 18, 2022
3363c15
Merge branch 'logic_equiv_basic' of github.com:leanprover-community/m…
kbuzzard Nov 18, 2022
cc9f085
up to line 650
kbuzzard Nov 18, 2022
235f172
Merge branch 'logic_equiv_basic' of github.com:leanprover-community/m…
kbuzzard Nov 18, 2022
92aff85
renaming
77Tigers Nov 18, 2022
ae8e431
finish renames and aligns
kim-em Nov 19, 2022
d1cb507
unused arguments
kim-em Nov 19, 2022
ef22eca
fix a proof
kim-em Nov 19, 2022
df011cf
add import to fix proof
kim-em Nov 19, 2022
654677a
add import to fix proof
kim-em Nov 19, 2022
785081a
fix some proofs
kim-em Nov 19, 2022
24fac8e
candidate translation of subtypeEquivCodomain
kim-em Nov 19, 2022
22987fd
work on swapCore lemmas
kim-em Nov 19, 2022
e096b32
report issue
kim-em Nov 19, 2022
93b69f9
add note about subtypeEquivCodomain
kim-em Nov 19, 2022
ee97368
Merge remote-tracking branch 'origin/master' into logic_equiv_basic
kim-em Nov 19, 2022
b0f817a
fix subtypeEquivCodomain after gebner
kim-em Nov 19, 2022
1f91792
add import
kim-em Nov 19, 2022
b2a7cc3
piCongrLeft'
kim-em Nov 19, 2022
faab506
fix some proofs
kim-em Nov 19, 2022
eab8484
port missing init file for Sigma.eq
kim-em Nov 19, 2022
e318283
fix semiconj2_conj
77Tigers Nov 19, 2022
8d808d5
Quotient.inductionOn, not Quotient.induction_on
77Tigers Nov 19, 2022
3d6718e
Merge remote-tracking branch 'origin/master' into logic_equiv_basic
kim-em Nov 19, 2022
90d6eba
cleanup after nightly-2022-11-19
kim-em Nov 19, 2022
4400ecd
mostly fixed
ericrbg Nov 20, 2022
9e8b910
fix big error
ericrbg Nov 20, 2022
a17bbf9
some linting errors still but I don't understand them
ericrbg Nov 20, 2022
327b6d8
cleanup imports
kim-em Nov 20, 2022
0079d83
linter
kim-em Nov 20, 2022
7795164
linter
kim-em Nov 20, 2022
67a7141
long lines
kim-em Nov 20, 2022
b18058d
Merge remote-tracking branch 'origin/master' into logic_equiv_basic
kim-em Nov 20, 2022
8606881
import all files
kim-em Nov 20, 2022
ad8510d
feat: port Logic.Equiv.Option
arienmalec Nov 22, 2022
2aae5fd
Add to Mathlib.lean
arienmalec Nov 22, 2022
f4c9a49
name fix
arienmalec Nov 22, 2022
0cc1afd
cosmetic changes
dwarn Nov 22, 2022
ed43228
use autoimplicits + some casing + whitespace
dwarn Nov 22, 2022
70f7b0e
addresed a theorem failure
arienmalec Nov 22, 2022
525bbad
naming fix & style fixes
arienmalec Nov 22, 2022
615cc29
doc fix for linting
arienmalec Nov 22, 2022
fe4d58d
Merge remote-tracking branch 'origin/master' into logic_equiv_basic
kim-em Nov 22, 2022
83e63fb
remove bad (?) simp lemmas
dwarn Nov 22, 2022
1c482e3
fix one lint error
kim-em Nov 22, 2022
a01d23e
remove #lint
kim-em Nov 22, 2022
193d8f8
merge
kim-em Nov 22, 2022
097865a
don't making the coercion twice
kim-em Nov 22, 2022
84cfc0e
merge
kim-em Nov 22, 2022
9e43f15
almost there
kim-em Nov 22, 2022
b967812
and lints!
kim-em Nov 22, 2022
b6a4098
bump
kim-em Nov 22, 2022
a3a8b25
fixed coe
mcdoll Nov 23, 2022
053a10e
fix casing issue
kim-em Nov 23, 2022
41e4084
fixed naming
arienmalec Nov 23, 2022
f4479e4
style fix of rfl proofs
arienmalec Nov 23, 2022
0ce71ae
explicit type ascriptions
kim-em Nov 23, 2022
c9ba6e7
remove unneeded simps
kim-em Nov 23, 2022
4a7b7fc
lint
kim-em Nov 23, 2022
c4824fa
add a linink to a Lean 4 issue
kim-em Nov 23, 2022
c2f70bd
Update Mathlib/Logic/Equiv/Basic.lean
Ruben-VandeVelde Nov 23, 2022
7ce749c
fix a bunch of names, long line
kbuzzard Nov 23, 2022
89327d4
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
6cb4aba
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
aa15dfe
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
5e8fbbd
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
3adebd0
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
0c46476
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
f7b4227
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
f9423ba
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
4639b4e
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
a820ebd
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
976292e
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
1fc9f81
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
dc4a4cd
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
095f877
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
a085bcb
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
57363d6
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
6e84e14
Update Mathlib/Logic/Equiv/Basic.lean
kbuzzard Nov 23, 2022
3a7d6ec
Merge remote-tracking branch 'origin/master' into logic_equiv_basic
kim-em Nov 23, 2022
469e8cf
Merge branch 'logic_equiv_basic' into port-logic-equiv-option
kbuzzard Nov 23, 2022
6e8e74e
Update Mathlib/Logic/Equiv/Basic.lean
kim-em Nov 23, 2022
5e06896
Update Mathlib/Logic/Equiv/Basic.lean
kim-em Nov 23, 2022
d3d27f1
syntax
kim-em Nov 23, 2022
05f6e4f
Merge branch 'logic_equiv_basic' into port-logic-equiv-option
kbuzzard Nov 23, 2022
3fe9f4c
use where more often
kim-em Nov 23, 2022
980920f
Merge branch 'logic_equiv_basic' of github.com:leanprover-community/m…
kim-em Nov 23, 2022
7b61a9a
comment about mwe
kim-em Nov 23, 2022
277e12a
don't touch manifest
kim-em Nov 23, 2022
d9109cd
compiling
kbuzzard Nov 23, 2022
e0dfed4
Merge remote-tracking branch 'origin/master' into logic_equiv_basic
kim-em Nov 23, 2022
5e7eb57
cleanup
kim-em Nov 23, 2022
913e469
oops
kim-em Nov 23, 2022
8bc0328
long line
kim-em Nov 23, 2022
d067b28
Merge branch 'logic_equiv_basic' into port-logic-equiv-option
kim-em Nov 23, 2022
1b34795
Merge remote-tracking branch 'origin/master' into port-logic-equiv-op…
kim-em Nov 23, 2022
563a6bc
naming fix & minor docu fix
arienmalec Nov 25, 2022
c019069
naming fix per review
arienmalec Nov 25, 2022
1b7ea46
fix naming issue
arienmalec Nov 25, 2022
205213b
fix indentation issue
arienmalec Nov 25, 2022
1c25519
fixed naming (+ remove lake_packages)
arienmalec Nov 28, 2022
13dcbdc
Merge remote-tracking branch 'origin/master' into port-logic-equiv-op…
kim-em Nov 28, 2022
5e66077
replace slow simp
kim-em Nov 28, 2022
1af3b36
Merge remote-tracking branch 'origin/master' into port-logic-equiv-op…
kim-em Nov 28, 2022
2527966
Apply suggestions from code review
kim-em Nov 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ import Mathlib.Logic.Equiv.Basic
import Mathlib.Logic.Equiv.Defs
import Mathlib.Logic.Equiv.LocalEquiv
import Mathlib.Logic.Equiv.MfldSimpsAttr
import Mathlib.Logic.Equiv.Option
import Mathlib.Logic.Function.Basic
import Mathlib.Logic.Function.Conjugate
import Mathlib.Logic.Function.Iterate
Expand Down
264 changes: 264 additions & 0 deletions Mathlib/Logic/Equiv/Option.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,264 @@
/-
Copyright (c) 2021 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
-/
import Mathlib.Control.EquivFunctor
import Mathlib.Data.Option.Basic
import Mathlib.Data.Subtype
import Mathlib.Logic.Equiv.Defs

/-!
# Equivalences for `Option α`


We define
* `Equiv.optionCongr`: the `Option α ≃ Option β` constructed from `e : α ≃ β` by sending `none` to
`none`, and applying `e` elsewhere.
* `Equiv.removeNone`: the `α ≃ β` constructed from `Option α ≃ Option β` by removing `none` from
both sides.
-/


namespace Equiv

open Option

variable {α β γ : Type _}

section OptionCongr

/-- A universe-polymorphic version of `EquivFunctor.mapEquiv Option e`. -/
@[simps apply]
def optionCongr (e : α ≃ β) : Option α ≃ Option β where
toFun := Option.map e
invFun := Option.map e.symm
left_inv x := (Option.map_map _ _ _).trans <| e.symm_comp_self.symm ▸ congr_fun Option.map_id x
right_inv x := (Option.map_map _ _ _).trans <| e.self_comp_symm.symm ▸ congr_fun Option.map_id x
#align equiv.option_congr Equiv.optionCongr

@[simp]
theorem optionCongr_refl : optionCongr (Equiv.refl α) = Equiv.refl _ :=
ext <| congr_fun Option.map_id
#align equiv.option_congr_refl Equiv.optionCongr_refl

@[simp]
theorem optionCongr_symm (e : α ≃ β) : (optionCongr e).symm = optionCongr e.symm :=
rfl
#align equiv.option_congr_symm Equiv.optionCongr_symm

@[simp]
theorem optionCongr_trans (e₁ : α ≃ β) (e₂ : β ≃ γ) :
(optionCongr e₁).trans (optionCongr e₂) = optionCongr (e₁.trans e₂) :=
ext <| Option.map_map _ _
#align equiv.option_congr_trans Equiv.optionCongr_trans

/-- When `α` and `β` are in the same universe, this is the same as the result of
`EquivFunctor.mapEquiv`. -/
theorem optionCongr_eq_equivFunctor_mapEquiv {α β : Type _} (e : α ≃ β) :
optionCongr e = EquivFunctor.mapEquiv Option e :=
rfl
#align equiv.option_congr_eq_equiv_function_map_equiv Equiv.optionCongr_eq_equivFunctor_mapEquiv

end OptionCongr

section RemoveNone

variable (e : Option α ≃ Option β)

/-- If we have a value on one side of an `Equiv` of `Option`
we also have a value on the other side of the equivalence
-/
def removeNone_aux (x : α) : β :=
if h : (e (some x)).isSome then Option.get _ h
else
Option.get _ <|
show (e none).isSome by
rw [← Option.ne_none_iff_isSome]
intro hn
rw [Option.not_isSome_iff_eq_none, ← hn] at h
exact Option.some_ne_none _ (e.injective h)

#align equiv.remove_none_aux Equiv.removeNone_aux

theorem removeNone_aux_some {x : α} (h : ∃ x', e (some x) = some x') :
some (removeNone_aux e x) = e (some x) :=
by simp [removeNone_aux, Option.isSome_iff_exists.mpr h]
#align equiv.remove_none_aux_some Equiv.removeNone_aux_some

theorem removeNone_aux_none {x : α} (h : e (some x) = none) :
some (removeNone_aux e x) = e none := by
simp [removeNone_aux, Option.not_isSome_iff_eq_none.mpr h]
#align equiv.remove_none_aux_none Equiv.removeNone_aux_none

theorem removeNone_aux_inv (x : α) : removeNone_aux e.symm (removeNone_aux e x) = x :=
Option.some_injective _
(by
cases h1 : e.symm (some (removeNone_aux e x)) <;> cases h2 : e (some x)
· rw [removeNone_aux_none _ h1]
exact (e.eq_symm_apply.mpr h2).symm

· rw [removeNone_aux_some _ ⟨_, h2⟩] at h1
simp at h1

· rw [removeNone_aux_none _ h2] at h1
simp at h1

· rw [removeNone_aux_some _ ⟨_, h1⟩]
rw [removeNone_aux_some _ ⟨_, h2⟩]
simp
)
#align equiv.remove_none_aux_inv Equiv.removeNone_aux_inv

/-- Given an equivalence between two `Option` types, eliminate `none` from that equivalence by
mapping `e.symm none` to `e none`. -/
def removeNone : α ≃ β where
toFun := removeNone_aux e
invFun := removeNone_aux e.symm
left_inv := removeNone_aux_inv e
right_inv := removeNone_aux_inv e.symm
#align equiv.remove_none Equiv.removeNone

@[simp]
theorem removeNone_symm : (removeNone e).symm = removeNone e.symm :=
rfl
#align equiv.remove_none_symm Equiv.removeNone_symm

theorem removeNone_some {x : α} (h : ∃ x', e (some x) = some x') :
some (removeNone e x) = e (some x) :=
removeNone_aux_some e h
#align equiv.remove_none_some Equiv.removeNone_some

theorem removeNone_none {x : α} (h : e (some x) = none) : some (removeNone e x) = e none :=
removeNone_aux_none e h
#align equiv.remove_none_none Equiv.removeNone_none

@[simp]
theorem option_symm_apply_none_iff : e.symm none = none ↔ e none = none :=
⟨fun h => by simpa using (congr_arg e h).symm, fun h => by simpa using (congr_arg e.symm h).symm⟩
#align equiv.option_symm_apply_none_iff Equiv.option_symm_apply_none_iff

theorem some_removeNone_iff {x : α} : some (removeNone e x) = e none ↔ e.symm none = some x := by
cases' h : e (some x) with a
· rw [removeNone_none _ h]
simpa using (congr_arg e.symm h).symm

· rw [removeNone_some _ ⟨a, h⟩]
have h1 := congr_arg e.symm h
rw [symm_apply_apply] at h1
simp only [false_iff_iff, apply_eq_iff_eq]
simp [h1, apply_eq_iff_eq]

#align equiv.some_remove_none_iff Equiv.some_removeNone_iff

@[simp]
theorem removeNone_optionCongr (e : α ≃ β) : removeNone e.optionCongr = e :=
Equiv.ext fun x => Option.some_injective _ <| removeNone_some _ ⟨e x, by simp [EquivFunctor.map]⟩
#align equiv.remove_none_option_congr Equiv.removeNone_optionCongr

end RemoveNone

theorem optionCongr_injective : Function.Injective (optionCongr : α ≃ β → Option α ≃ Option β) :=
Function.LeftInverse.injective removeNone_optionCongr
#align equiv.option_congr_injective Equiv.optionCongr_injective

/-- Equivalences between `Option α` and `β` that send `none` to `x` are equivalent to
equivalences between `α` and `{y : β // y ≠ x}`. -/
def optionSubtype [DecidableEq β] (x : β) :
{ e : Option α ≃ β // e none = x } ≃ (α ≃ { y : β // y ≠ x }) where
toFun e :=
{ toFun := fun a =>
⟨(e : Option α ≃ β) a, ((EquivLike.injective _).ne_iff' e.property).2 (some_ne_none _)⟩,
invFun := fun b =>
get _
(ne_none_iff_isSome.1
(((EquivLike.injective _).ne_iff'
((apply_eq_iff_eq_symm_apply _).1 e.property).symm).2 b.property)),
left_inv := fun a => by
rw [← some_inj, some_get]
exact symm_apply_apply (e : Option α ≃ β) a,
right_inv := fun b => by
ext
simp }
invFun e :=
⟨{ toFun := fun a => casesOn' a x (Subtype.val ∘ e),
invFun := fun b => if h : b = x then none else e.symm ⟨b, h⟩,
left_inv := fun a => by
cases a with
| none => simp
| some a =>
simp only [casesOn'_some, Function.comp_apply, Subtype.coe_eta,
symm_apply_apply, dite_eq_ite]
exact if_neg (e a).property,
right_inv := fun b => by
by_cases h : b = x <;> simp [h] },
rfl⟩
left_inv e := by
ext a
cases a
· simpa using e.property.symm
-- Porting note: this cases had been by `simpa`,
-- but `simp` here is mysteriously slow, even after squeezing.
-- `rfl` closes the goal quickly, so we use that.
· rfl
right_inv e := by
ext a
rfl
#align equiv.option_subtype Equiv.optionSubtype

@[simp]
theorem optionSubtype_apply_apply
[DecidableEq β] (x : β)
(e : { e : Option α ≃ β // e none = x })
(a : α)
(h) : optionSubtype x e a = ⟨(e : Option α ≃ β) a, h⟩ := rfl
#align equiv.option_subtype_apply_apply Equiv.optionSubtype_apply_apply

@[simp]
theorem coe_optionSubtype_apply_apply
[DecidableEq β] (x : β)
(e : { e : Option α ≃ β // e none = x })
(a : α) : ↑(optionSubtype x e a) = (e : Option α ≃ β) a := rfl
#align equiv.coe_option_subtype_apply_apply Equiv.coe_optionSubtype_apply_apply

@[simp]
theorem optionSubtype_apply_symm_apply
[DecidableEq β] (x : β)
(e : { e : Option α ≃ β // e none = x })
(b : { y : β // y ≠ x }) : ↑((optionSubtype x e).symm b) = (e : Option α ≃ β).symm b := by
dsimp only [optionSubtype]
simp
#align equiv.option_subtype_apply_symm_apply Equiv.optionSubtype_apply_symm_apply

@[simp]
theorem optionSubtype_symm_apply_apply_coe [DecidableEq β] (x : β) (e : α ≃ { y : β // y ≠ x })
(a : α) : ((optionSubtype x).symm e : Option α ≃ β) a = e a :=
rfl
#align equiv.option_subtype_symm_apply_apply_coe Equiv.optionSubtype_symm_apply_apply_coe

@[simp]
theorem optionSubtype_symm_apply_apply_some
[DecidableEq β]
(x : β)
(e : α ≃ { y : β // y ≠ x })
(a : α) : ((optionSubtype x).symm e : Option α ≃ β) (some a) = e a :=
rfl
#align equiv.option_subtype_symm_apply_apply_some Equiv.optionSubtype_symm_apply_apply_some

@[simp]
theorem optionSubtype_symm_apply_apply_none
[DecidableEq β]
(x : β)
(e : α ≃ { y : β // y ≠ x }) : ((optionSubtype x).symm e : Option α ≃ β) none = x :=
rfl
#align equiv.option_subtype_symm_apply_apply_none Equiv.optionSubtype_symm_apply_apply_none

@[simp]
theorem optionSubtype_symm_apply_symm_apply [DecidableEq β] (x : β) (e : α ≃ { y : β // y ≠ x })
(b : { y : β // y ≠ x }) : ((optionSubtype x).symm e : Option α ≃ β).symm b = e.symm b := by
simp only [optionSubtype, coe_fn_symm_mk, Subtype.coe_mk,
Subtype.coe_eta, dite_eq_ite, ite_eq_right_iff]
exact fun h => False.elim (b.property h)
#align equiv.option_subtype_symm_apply_symm_apply Equiv.optionSubtype_symm_apply_symm_apply

end Equiv