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

! This file was ported from Lean 3 source module data.fun_like.equiv
! leanprover-community/mathlib commit f340f229b1f461aa1c8ee11e0a172d0a3b301a4a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.FunLike.Embedding

/-!
# Typeclass for a type `F` with an injective map to `A ≃ B`

This typeclass is primarily for use by isomorphisms like `MonoidEquiv` and `LinearEquiv`.

## Basic usage of `EquivLike`

A typical type of morphisms should be declared as:
```
structure MyIso (A B : Type _) [MyClass A] [MyClass B]
  extends Equiv A B :=
(map_op' : ∀ {x y : A}, toFun (MyClass.op x y) = MyClass.op (toFun x) (toFun y))

namespace MyIso

variables (A B : Type _) [MyClass A] [MyClass B]

-- This instance is optional if you follow the "Isomorphism class" design below:
instance : EquivLike (MyIso A B) A (λ _, B) :=
{ coe := MyIso.toEquiv.toFun,
  inv := MyIso.toEquiv.invFun,
  left_inv := MyIso.toEquiv.left_inv,
  right_inv := MyIso.toEquiv.right_inv,
  coe_injective' := λ f g h, by cases f; cases g; congr' }

/-- Helper instance for when there's too many metavariables to apply `EquivLike.coe` directly. -/
instance : CoeFun (MyIso A B) := FunLike.instCoeFunForAll

@[ext] theorem ext {f g : MyIso A B} (h : ∀ x, f x = g x) : f = g := FunLike.ext f g h

/-- Copy of a `MyIso` with a new `toFun` equal to the old one. Useful to fix definitional
equalities. -/
protected def copy (f : MyIso A B) (f' : A → B) (f_inv : B → A) (h : f' = ⇑f) : MyIso A B :=
{ toFun := f',
  invFun := f_inv,
  left_inv := h.symm ▸ f.left_inv,
  right_inv := h.symm ▸ f.right_inv,
  map_op' := h.symm ▸ f.map_op' }

end MyIso
```

This file will then provide a `CoeFun` instance and various
extensionality and simp lemmas.

## Isomorphism classes extending `EquivLike`

The `EquivLike` design provides further benefits if you put in a bit more work.
The first step is to extend `EquivLike` to create a class of those types satisfying
the axioms of your new type of isomorphisms.
Continuing the example above:

```

/-- `MyIsoClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyIso`. -/
class MyIsoClass (F : Type _) (A B : outParam <| Type _) [MyClass A] [MyClass B]
  extends EquivLike F A (λ _, B), MyHomClass F A B

end

-- You can replace `MyIso.EquivLike` with the below instance:
instance : MyIsoClass (MyIso A B) A B :=
{ coe := MyIso.toFun,
  inv := MyIso.invFun,
  left_inv := MyIso.left_inv,
  right_inv := MyIso.right_inv,
  coe_injective' := λ f g h, by cases f; cases g; congr',
  map_op := MyIso.map_op' }

-- [Insert `CoeFun`, `ext` and `copy` here]
```

The second step is to add instances of your new `MyIsoClass` for all types extending `MyIso`.
Typically, you can just declare a new class analogous to `MyIsoClass`:

```
structure CoolerIso (A B : Type _) [CoolClass A] [CoolClass B]
  extends MyIso A B :=
(map_cool' : toFun CoolClass.cool = CoolClass.cool)

section
set_option old_structure_cmd true

class CoolerIsoClass (F : Type _) (A B : outParam <| Type _) [CoolClass A] [CoolClass B]
  extends MyIsoClass F A B :=
(map_cool : ∀ (f : F), f CoolClass.cool = CoolClass.cool)

end

@[simp] lemma map_cool {F A B : Type _} [CoolClass A] [CoolClass B] [CoolerIsoClass F A B]
  (f : F) : f CoolClass.cool = CoolClass.cool :=
CoolerIsoClass.map_cool

instance : CoolerIsoClass (CoolerIso A B) A B :=
{ coe := CoolerIso.toFun,
  coe_injective' := λ f g h, by cases f; cases g; congr',
  map_op := CoolerIso.map_op',
  map_cool := CoolerIso.map_cool' }

-- [Insert `CoeFun`, `ext` and `copy` here]
```

Then any declaration taking a specific type of morphisms as parameter can instead take the
class you just defined:
```
-- Compare with: lemma do_something (f : MyIso A B) : sorry := sorry
lemma do_something {F : Type _} [MyIsoClass F A B] (f : F) : sorry := sorry
```

This means anything set up for `MyIso`s will automatically work for `CoolerIsoClass`es,
and defining `CoolerIsoClass` only takes a constant amount of effort,
instead of linearly increasing the work per `MyIso`-related declaration.

-/


/-- The class `EquivLike E α β` expresses that terms of type `E` have an
injective coercion to bijections between `α` and `β`.

This typeclass is used in the definition of the homomorphism typeclasses,
such as `ZeroEquivClass`, `MulEquivClass`, `MonoidEquivClass`, ....
-/
class 
EquivLike: {E : Sort u_1} → {α : outParam (Sort u_2)} → {β : outParam (Sort u_3)} → (coe : Eαβ) → (inv : Eβα) → (∀ (e : E), Function.LeftInverse (inv e) (coe e)) → (∀ (e : E), Function.RightInverse (inv e) (coe e)) → (∀ (e g : E), coe e = coe ginv e = inv ge = g) → EquivLike E α β
EquivLike
(
E: Sort ?u.2
E
:
Sort _: Type ?u.2
Sort
Sort _: Type ?u.2
_
) (
α: outParam (Sort ?u.6)
α
β: outParam (Sort ?u.10)
β
:
outParam: Sort ?u.5 → Sort ?u.5
outParam
(
Sort _: Type ?u.6
Sort
Sort _: Type ?u.6
_
)) where /-- The coercion to a function in the forward direction. -/
coe: {E : Sort u_1} → {α : outParam (Sort u_2)} → {β : outParam (Sort u_3)} → [self : EquivLike E α β] → Eαβ
coe
:
E: Sort ?u.2
E
α: outParam (Sort ?u.6)
α
β: outParam (Sort ?u.10)
β
/-- The coercion to a function in the backwards direction. -/
inv: {E : Sort u_1} → {α : outParam (Sort u_2)} → {β : outParam (Sort u_3)} → [self : EquivLike E α β] → Eβα
inv
:
E: Sort ?u.2
E
β: outParam (Sort ?u.10)
β
α: outParam (Sort ?u.6)
α
/-- The coercions are left inverses. -/
left_inv: ∀ {E : Sort u_1} {α : outParam (Sort u_2)} {β : outParam (Sort u_3)} [self : EquivLike E α β] (e : E), Function.LeftInverse (EquivLike.inv e) (EquivLike.coe e)
left_inv
: ∀
e: ?m.28
e
,
Function.LeftInverse: {α : Sort ?u.32} → {β : Sort ?u.31} → (βα) → (αβ) → Prop
Function.LeftInverse
(
inv: Eβα
inv
e: ?m.28
e
) (
coe: Eαβ
coe
e: ?m.28
e
) /-- The coercions are right inverses. -/
right_inv: ∀ {E : Sort u_1} {α : outParam (Sort u_2)} {β : outParam (Sort u_3)} [self : EquivLike E α β] (e : E), Function.RightInverse (EquivLike.inv e) (EquivLike.coe e)
right_inv
: ∀
e: ?m.49
e
,
Function.RightInverse: {α : Sort ?u.53} → {β : Sort ?u.52} → (βα) → (αβ) → Prop
Function.RightInverse
(
inv: Eβα
inv
e: ?m.49
e
) (
coe: Eαβ
coe
e: ?m.49
e
) /-- If two coercions to functions are jointly injective. -/
coe_injective': ∀ {E : Sort u_1} {α : outParam (Sort u_2)} {β : outParam (Sort u_3)} [self : EquivLike E α β] (e g : E), EquivLike.coe e = EquivLike.coe gEquivLike.inv e = EquivLike.inv ge = g
coe_injective'
: ∀
e: ?m.70
e
g: ?m.73
g
,
coe: Eαβ
coe
e: ?m.70
e
=
coe: Eαβ
coe
g: ?m.73
g
inv: Eβα
inv
e: ?m.70
e
=
inv: Eβα
inv
g: ?m.73
g
e: ?m.70
e
=
g: ?m.73
g
-- This is mathematically equivalent to either of the coercions to functions being injective, but -- the `inv` hypothesis makes this easier to prove with `congr'` #align equiv_like
EquivLike: Sort u_1 → outParam (Sort u_2)outParam (Sort u_3)Sort (max(max(max1u_1)u_2)u_3)
EquivLike
namespace EquivLike variable {
E: Sort ?u.1244
E
F: Sort ?u.1060
F
α: Sort ?u.135
α
β: Sort ?u.3382
β
γ: Sort ?u.116
γ
:
Sort _: Type ?u.2023
Sort
Sort _: Type ?u.2023
_
} [
iE: EquivLike E α β
iE
:
EquivLike: Sort ?u.121 → outParam (Sort ?u.120)outParam (Sort ?u.119)Sort (max(max(max1?u.121)?u.120)?u.119)
EquivLike
E: Sort ?u.1765
E
α: Sort ?u.1771
α
β: Sort ?u.1774
β
] [
iF: EquivLike F β γ
iF
:
EquivLike: Sort ?u.126 → outParam (Sort ?u.125)outParam (Sort ?u.124)Sort (max(max(max1?u.126)?u.125)?u.124)
EquivLike
F: Sort ?u.1768
F
β: Sort ?u.138
β
γ: Sort ?u.116
γ
] theorem
inv_injective: ∀ {E : Sort u_1} {α : Sort u_3} {β : Sort u_2} [iE : EquivLike E α β], Function.Injective inv
inv_injective
:
Function.Injective: {α : Sort ?u.155} → {β : Sort ?u.154} → (αβ) → Prop
Function.Injective
(
EquivLike.inv: {E : Sort ?u.165} → {α : outParam (Sort ?u.164)} → {β : outParam (Sort ?u.163)} → [self : EquivLike E α β] → Eβα
EquivLike.inv
:
E: Sort ?u.129
E
β: Sort ?u.138
β
α: Sort ?u.135
α
) := fun
e: ?m.194
e
g: ?m.197
g
h: ?m.200
h
coe_injective': ∀ {E : Sort ?u.204} {α : outParam (Sort ?u.203)} {β : outParam (Sort ?u.202)} [self : EquivLike E α β] (e g : E), coe e = coe ginv e = inv ge = g
coe_injective'
e: ?m.194
e
g: ?m.197
g
((
right_inv: ∀ {E : Sort ?u.226} {α : outParam (Sort ?u.225)} {β : outParam (Sort ?u.224)} [self : EquivLike E α β] (e : E), Function.RightInverse (inv e) (coe e)
right_inv
e: ?m.194
e
).
eq_rightInverse: ∀ {α : Sort ?u.241} {β : Sort ?u.242} {f : αβ} {g₁ g₂ : βα}, Function.LeftInverse g₁ fFunction.RightInverse g₂ fg₁ = g₂
eq_rightInverse
(
h: ?m.200
h
.
symm: ∀ {α : Sort ?u.267} {a b : α}, a = bb = a
symm
left_inv: ∀ {E : Sort ?u.281} {α : outParam (Sort ?u.280)} {β : outParam (Sort ?u.279)} [self : EquivLike E α β] (e : E), Function.LeftInverse (inv e) (coe e)
left_inv
g: ?m.197
g
))
h: ?m.200
h
#align equiv_like.inv_injective
EquivLike.inv_injective: ∀ {E : Sort u_1} {α : Sort u_3} {β : Sort u_2} [iE : EquivLike E α β], Function.Injective inv
EquivLike.inv_injective
instance (priority := 100)
toEmbeddingLike: EmbeddingLike E α β
toEmbeddingLike
:
EmbeddingLike: Sort ?u.356 → outParam (Sort ?u.355)outParam (Sort ?u.354)Sort (max(max(max1?u.356)?u.355)?u.354)
EmbeddingLike
E: Sort ?u.329
E
α: Sort ?u.335
α
β: Sort ?u.338
β
where coe := (
coe: {E : Sort ?u.387} → {α : outParam (Sort ?u.386)} → {β : outParam (Sort ?u.385)} → [self : EquivLike E α β] → Eαβ
coe
:
E: Sort ?u.329
E
α: Sort ?u.335
α
β: Sort ?u.338
β
) coe_injective'
e: ?m.406
e
g: ?m.409
g
h: ?m.412
h
:=
coe_injective': ∀ {E : Sort ?u.416} {α : outParam (Sort ?u.415)} {β : outParam (Sort ?u.414)} [self : EquivLike E α β] (e g : E), coe e = coe ginv e = inv ge = g
coe_injective'
e: ?m.406
e
g: ?m.409
g
h: ?m.412
h
((
left_inv: ∀ {E : Sort ?u.446} {α : outParam (Sort ?u.445)} {β : outParam (Sort ?u.444)} [self : EquivLike E α β] (e : E), Function.LeftInverse (inv e) (coe e)
left_inv
e: ?m.406
e
).
eq_rightInverse: ∀ {α : Sort ?u.461} {β : Sort ?u.462} {f : αβ} {g₁ g₂ : βα}, Function.LeftInverse g₁ fFunction.RightInverse g₂ fg₁ = g₂
eq_rightInverse
(
h: ?m.412
h
.
symm: ∀ {α : Sort ?u.493} {a b : α}, a = bb = a
symm
right_inv: ∀ {E : Sort ?u.504} {α : outParam (Sort ?u.503)} {β : outParam (Sort ?u.502)} [self : EquivLike E α β] (e : E), Function.RightInverse (inv e) (coe e)
right_inv
g: ?m.409
g
)) injective'
e: ?m.543
e
:= (
left_inv: ∀ {E : Sort ?u.547} {α : outParam (Sort ?u.546)} {β : outParam (Sort ?u.545)} [self : EquivLike E α β] (e : E), Function.LeftInverse (inv e) (coe e)
left_inv
e: ?m.543
e
).
injective: ∀ {α : Sort ?u.563} {β : Sort ?u.562} {g : βα} {f : αβ}, Function.LeftInverse g fFunction.Injective f
injective
protected theorem
injective: ∀ (e : E), Function.Injective e
injective
(
e: E
e
:
E: Sort ?u.711
E
) :
Function.Injective: {α : Sort ?u.739} → {β : Sort ?u.738} → (αβ) → Prop
Function.Injective
e: E
e
:=
EmbeddingLike.injective: ∀ {F : Sort ?u.836} {α : Sort ?u.834} {β : Sort ?u.835} [i : EmbeddingLike F α β] (f : F), Function.Injective f
EmbeddingLike.injective
e: E
e
#align equiv_like.injective
EquivLike.injective: ∀ {E : Sort u_3} {α : Sort u_1} {β : Sort u_2} [iE : EquivLike E α β] (e : E), Function.Injective e
EquivLike.injective
protected theorem
surjective: ∀ {E : Sort u_3} {α : Sort u_1} {β : Sort u_2} [iE : EquivLike E α β] (e : E), Function.Surjective e
surjective
(
e: E
e
:
E: Sort ?u.882
E
) :
Function.Surjective: {α : Sort ?u.910} → {β : Sort ?u.909} → (αβ) → Prop
Function.Surjective
e: E
e
:= (
right_inv: ∀ {E : Sort ?u.1008} {α : outParam (Sort ?u.1007)} {β : outParam (Sort ?u.1006)} [self : EquivLike E α β] (e : E), Function.RightInverse (inv e) (coe e)
right_inv
e: E
e
).
surjective: ∀ {α : Sort ?u.1027} {β : Sort ?u.1026} {f : αβ} {g : βα}, Function.RightInverse g fFunction.Surjective f
surjective
#align equiv_like.surjective
EquivLike.surjective: ∀ {E : Sort u_3} {α : Sort u_1} {β : Sort u_2} [iE : EquivLike E α β] (e : E), Function.Surjective e
EquivLike.surjective
protected theorem
bijective: ∀ {E : Sort u_3} {α : Sort u_1} {β : Sort u_2} [iE : EquivLike E α β] (e : E), Function.Bijective e
bijective
(
e: E
e
:
E: Sort ?u.1057
E
) :
Function.Bijective: {α : Sort ?u.1085} → {β : Sort ?u.1084} → (αβ) → Prop
Function.Bijective
(
e: E
e
:
α: Sort ?u.1063
α
β: Sort ?u.1066
β
) := ⟨
EquivLike.injective: ∀ {E : Sort ?u.1194} {α : Sort ?u.1192} {β : Sort ?u.1193} [iE : EquivLike E α β] (e : E), Function.Injective e
EquivLike.injective
e: E
e
,
EquivLike.surjective: ∀ {E : Sort ?u.1217} {α : Sort ?u.1215} {β : Sort ?u.1216} [iE : EquivLike E α β] (e : E), Function.Surjective e
EquivLike.surjective
e: E
e
#align equiv_like.bijective
EquivLike.bijective: ∀ {E : Sort u_3} {α : Sort u_1} {β : Sort u_2} [iE : EquivLike E α β] (e : E), Function.Bijective e
EquivLike.bijective
theorem
apply_eq_iff_eq: ∀ (f : E) {x y : α}, f x = f y x = y
apply_eq_iff_eq
(
f: E
f
:
E: Sort ?u.1244
E
) {
x: α
x
y: α
y
:
α: Sort ?u.1250
α
} :
f: E
f
x: α
x
=
f: E
f
y: α
y
x: α
x
=
y: α
y
:=
EmbeddingLike.apply_eq_iff_eq: ∀ {F : Sort ?u.1453} {α : Sort ?u.1454} {β : Sort ?u.1452} [i : EmbeddingLike F α β] (f : F) {x y : α}, f x = f y x = y
EmbeddingLike.apply_eq_iff_eq
f: E
f
#align equiv_like.apply_eq_iff_eq
EquivLike.apply_eq_iff_eq: ∀ {E : Sort u_2} {α : Sort u_3} {β : Sort u_1} [iE : EquivLike E α β] (f : E) {x y : α}, f x = f y x = y
EquivLike.apply_eq_iff_eq
@[simp] theorem
injective_comp: ∀ {E : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iE : EquivLike E α β] (e : E) (f : βγ), Function.Injective (f e) Function.Injective f
injective_comp
(
e: E
e
:
E: Sort ?u.1516
E
) (
f: βγ
f
:
β: Sort ?u.1525
β
γ: Sort ?u.1528
γ
) :
Function.Injective: {α : Sort ?u.1548} → {β : Sort ?u.1547} → (αβ) → Prop
Function.Injective
(
f: βγ
f
e: E
e
) ↔
Function.Injective: {α : Sort ?u.1655} → {β : Sort ?u.1654} → (αβ) → Prop
Function.Injective
f: βγ
f
:=
Function.Injective.of_comp_iff': ∀ {α : Sort ?u.1665} {β : Sort ?u.1666} {γ : Sort ?u.1664} (f : αβ) {g : γα}, Function.Bijective g → (Function.Injective (f g) Function.Injective f)
Function.Injective.of_comp_iff'
f: βγ
f
(
EquivLike.bijective: ∀ {E : Sort ?u.1690} {α : Sort ?u.1688} {β : Sort ?u.1689} [iE : EquivLike E α β] (e : E), Function.Bijective e
EquivLike.bijective
e: E
e
) #align equiv_like.injective_comp
EquivLike.injective_comp: ∀ {E : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iE : EquivLike E α β] (e : E) (f : βγ), Function.Injective (f e) Function.Injective f
EquivLike.injective_comp
@[simp] theorem
surjective_comp: ∀ {E : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iE : EquivLike E α β] (e : E) (f : βγ), Function.Surjective (f e) Function.Surjective f
surjective_comp
(
e: E
e
:
E: Sort ?u.1765
E
) (
f: βγ
f
:
β: Sort ?u.1774
β
γ: Sort ?u.1777
γ
) :
Function.Surjective: {α : Sort ?u.1797} → {β : Sort ?u.1796} → (αβ) → Prop
Function.Surjective
(
f: βγ
f
e: E
e
) ↔
Function.Surjective: {α : Sort ?u.1904} → {β : Sort ?u.1903} → (αβ) → Prop
Function.Surjective
f: βγ
f
:= (
EquivLike.surjective: ∀ {E : Sort ?u.1915} {α : Sort ?u.1913} {β : Sort ?u.1914} [iE : EquivLike E α β] (e : E), Function.Surjective e
EquivLike.surjective
e: E
e
).
of_comp_iff: ∀ {α : Sort ?u.1934} {β : Sort ?u.1935} {γ : Sort ?u.1933} (f : αβ) {g : γα}, Function.Surjective g → (Function.Surjective (f g) Function.Surjective f)
of_comp_iff
f: βγ
f
#align equiv_like.surjective_comp
EquivLike.surjective_comp: ∀ {E : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iE : EquivLike E α β] (e : E) (f : βγ), Function.Surjective (f e) Function.Surjective f
EquivLike.surjective_comp
@[simp] theorem
bijective_comp: ∀ (e : E) (f : βγ), Function.Bijective (f e) Function.Bijective f
bijective_comp
(
e: E
e
:
E: Sort ?u.2011
E
) (
f: βγ
f
:
β: Sort ?u.2020
β
γ: Sort ?u.2023
γ
) :
Function.Bijective: {α : Sort ?u.2043} → {β : Sort ?u.2042} → (αβ) → Prop
Function.Bijective
(
f: βγ
f
e: E
e
) ↔
Function.Bijective: {α : Sort ?u.2150} → {β : Sort ?u.2149} → (αβ) → Prop
Function.Bijective
f: βγ
f
:= (
EquivLike.bijective: ∀ {E : Sort ?u.2161} {α : Sort ?u.2159} {β : Sort ?u.2160} [iE : EquivLike E α β] (e : E), Function.Bijective e
EquivLike.bijective
e: E
e
).
of_comp_iff: ∀ {α : Sort ?u.2179} {β : Sort ?u.2180} {γ : Sort ?u.2178} (f : αβ) {g : γα}, Function.Bijective g → (Function.Bijective (f g) Function.Bijective f)
of_comp_iff
f: βγ
f
#align equiv_like.bijective_comp
EquivLike.bijective_comp: ∀ {E : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iE : EquivLike E α β] (e : E) (f : βγ), Function.Bijective (f e) Function.Bijective f
EquivLike.bijective_comp
/-- This lemma is only supposed to be used in the generic context, when working with instances of classes extending `EquivLike`. For concrete isomorphism types such as `Equiv`, you should use `Equiv.symm_apply_apply` or its equivalent. TODO: define a generic form of `Equiv.symm`. -/ @[simp] theorem
inv_apply_apply: ∀ {E : Sort u_2} {α : Sort u_1} {β : Sort u_3} [iE : EquivLike E α β] (e : E) (a : α), inv e (e a) = a
inv_apply_apply
(
e: E
e
:
E: Sort ?u.2255
E
) (
a: α
a
:
α: Sort ?u.2261
α
) :
EquivLike.inv: {E : Sort ?u.2287} → {α : outParam (Sort ?u.2286)} → {β : outParam (Sort ?u.2285)} → [self : EquivLike E α β] → Eβα
EquivLike.inv
e: E
e
(
e: E
e
a: α
a
) =
a: α
a
:=
left_inv: ∀ {E : Sort ?u.2396} {α : outParam (Sort ?u.2395)} {β : outParam (Sort ?u.2394)} [self : EquivLike E α β] (e : E), Function.LeftInverse (inv e) (coe e)
left_inv
_: ?m.2397
_
_: ?m.2398
_
#align equiv_like.inv_apply_apply
EquivLike.inv_apply_apply: ∀ {E : Sort u_2} {α : Sort u_1} {β : Sort u_3} [iE : EquivLike E α β] (e : E) (a : α), inv e (e a) = a
EquivLike.inv_apply_apply
/-- This lemma is only supposed to be used in the generic context, when working with instances of classes extending `EquivLike`. For concrete isomorphism types such as `Equiv`, you should use `Equiv.apply_symm_apply` or its equivalent. TODO: define a generic form of `Equiv.symm`. -/ @[simp] theorem
apply_inv_apply: ∀ {E : Sort u_2} {α : Sort u_3} {β : Sort u_1} [iE : EquivLike E α β] (e : E) (b : β), e (inv e b) = b
apply_inv_apply
(
e: E
e
:
E: Sort ?u.2470
E
) (
b: β
b
:
β: Sort ?u.2479
β
) :
e: E
e
(
EquivLike.inv: {E : Sort ?u.2589} → {α : outParam (Sort ?u.2588)} → {β : outParam (Sort ?u.2587)} → [self : EquivLike E α β] → Eβα
EquivLike.inv
e: E
e
b: β
b
) =
b: β
b
:=
right_inv: ∀ {E : Sort ?u.2611} {α : outParam (Sort ?u.2610)} {β : outParam (Sort ?u.2609)} [self : EquivLike E α β] (e : E), Function.RightInverse (inv e) (coe e)
right_inv
_: ?m.2612
_
_: ?m.2614
_
#align equiv_like.apply_inv_apply
EquivLike.apply_inv_apply: ∀ {E : Sort u_2} {α : Sort u_3} {β : Sort u_1} [iE : EquivLike E α β] (e : E) (b : β), e (inv e b) = b
EquivLike.apply_inv_apply
theorem
comp_injective: ∀ (f : αβ) (e : F), Function.Injective (e f) Function.Injective f
comp_injective
(
f: αβ
f
:
α: Sort ?u.2691
α
β: Sort ?u.2694
β
) (
e: F
e
:
F: Sort ?u.2688
F
) :
Function.Injective: {α : Sort ?u.2717} → {β : Sort ?u.2716} → (αβ) → Prop
Function.Injective
(
e: F
e
f: αβ
f
) ↔
Function.Injective: {α : Sort ?u.2824} → {β : Sort ?u.2823} → (αβ) → Prop
Function.Injective
f: αβ
f
:=
EmbeddingLike.comp_injective: ∀ {α : Sort ?u.2836} {β : Sort ?u.2834} {γ : Sort ?u.2835} {F : Sort ?u.2833} [inst : EmbeddingLike F β γ] (f : αβ) (e : F), Function.Injective (e f) Function.Injective f
EmbeddingLike.comp_injective
f: αβ
f
e: F
e
#align equiv_like.comp_injective
EquivLike.comp_injective: ∀ {F : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iF : EquivLike F β γ] (f : αβ) (e : F), Function.Injective (e f) Function.Injective f
EquivLike.comp_injective
@[simp] theorem
comp_surjective: ∀ {F : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iF : EquivLike F β γ] (f : αβ) (e : F), Function.Surjective (e f) Function.Surjective f
comp_surjective
(
f: αβ
f
:
α: Sort ?u.2893
α
β: Sort ?u.2896
β
) (
e: F
e
:
F: Sort ?u.2890
F
) :
Function.Surjective: {α : Sort ?u.2919} → {β : Sort ?u.2918} → (αβ) → Prop
Function.Surjective
(
e: F
e
f: αβ
f
) ↔
Function.Surjective: {α : Sort ?u.3026} → {β : Sort ?u.3025} → (αβ) → Prop
Function.Surjective
f: αβ
f
:=
Function.Surjective.of_comp_iff': ∀ {α : Sort ?u.3035} {β : Sort ?u.3036} {γ : Sort ?u.3037} {f : αβ}, Function.Bijective f∀ (g : γα), Function.Surjective (f g) Function.Surjective g
Function.Surjective.of_comp_iff'
(
EquivLike.bijective: ∀ {E : Sort ?u.3044} {α : Sort ?u.3042} {β : Sort ?u.3043} [iE : EquivLike E α β] (e : E), Function.Bijective e
EquivLike.bijective
e: F
e
)
f: αβ
f
#align equiv_like.comp_surjective
EquivLike.comp_surjective: ∀ {F : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iF : EquivLike F β γ] (f : αβ) (e : F), Function.Surjective (e f) Function.Surjective f
EquivLike.comp_surjective
@[simp] theorem
comp_bijective: ∀ {F : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iF : EquivLike F β γ] (f : αβ) (e : F), Function.Bijective (e f) Function.Bijective f
comp_bijective
(
f: αβ
f
:
α: Sort ?u.3135
α
β: Sort ?u.3138
β
) (
e: F
e
:
F: Sort ?u.3132
F
) :
Function.Bijective: {α : Sort ?u.3161} → {β : Sort ?u.3160} → (αβ) → Prop
Function.Bijective
(
e: F
e
f: αβ
f
) ↔
Function.Bijective: {α : Sort ?u.3268} → {β : Sort ?u.3267} → (αβ) → Prop
Function.Bijective
f: αβ
f
:= (
EquivLike.bijective: ∀ {E : Sort ?u.3279} {α : Sort ?u.3277} {β : Sort ?u.3278} [iE : EquivLike E α β] (e : E), Function.Bijective e
EquivLike.bijective
e: F
e
).
of_comp_iff': ∀ {α : Sort ?u.3296} {β : Sort ?u.3297} {γ : Sort ?u.3298} {f : αβ}, Function.Bijective f∀ (g : γα), Function.Bijective (f g) Function.Bijective g
of_comp_iff'
f: αβ
f
#align equiv_like.comp_bijective
EquivLike.comp_bijective: ∀ {F : Sort u_4} {α : Sort u_1} {β : Sort u_3} {γ : Sort u_2} [iF : EquivLike F β γ] (f : αβ) (e : F), Function.Bijective (e f) Function.Bijective f
EquivLike.comp_bijective
/-- This is not an instance to avoid slowing down every single `Subsingleton` typeclass search.-/ lemma
subsingleton_dom: ∀ {F : Sort u_2} {β : Sort u_1} {γ : Sort u_3} [iF : EquivLike F β γ] [inst : Subsingleton β], Subsingleton F
subsingleton_dom
[
Subsingleton: Sort ?u.3398 → Prop
Subsingleton
β: Sort ?u.3382
β
] :
Subsingleton: Sort ?u.3401 → Prop
Subsingleton
F: Sort ?u.3376
F
:= ⟨fun
f: ?m.3410
f
g: ?m.3413
g
FunLike.ext: ∀ {F : Sort ?u.3416} {α : Sort ?u.3417} {β : αSort ?u.3415} [i : FunLike F α β] (f g : F), (∀ (x : α), f x = g x) → f = g
FunLike.ext
f: ?m.3410
f
g: ?m.3413
g
$ fun
_: ?m.3481
_
↦ (
right_inv: ∀ {E : Sort ?u.3485} {α : outParam (Sort ?u.3484)} {β : outParam (Sort ?u.3483)} [self : EquivLike E α β] (e : E), Function.RightInverse (inv e) (coe e)
right_inv
f: ?m.3410
f
).
injective: ∀ {α : Sort ?u.3501} {β : Sort ?u.3500} {f : αβ} {g : βα}, Function.RightInverse f gFunction.Injective f
injective
$
Subsingleton.elim: ∀ {α : Sort ?u.3527} [h : Subsingleton α] (a b : α), a = b
Subsingleton.elim
_: ?m.3528
_
_: ?m.3528
_
#align equiv_like.subsingleton_dom
EquivLike.subsingleton_dom: ∀ {F : Sort u_2} {β : Sort u_1} {γ : Sort u_3} [iF : EquivLike F β γ] [inst : Subsingleton β], Subsingleton F
EquivLike.subsingleton_dom
end EquivLike