Equivalence between types #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file we define two types:
-
equiv α β
a.k.a.α ≃ β
: a bijective mapα → β
bundled with its inverse map; we use this (and not equality!) to express that variousType
s orSort
s are equivalent. -
equiv.perm α
: the group of permutationsα ≃ α
. More lemmas aboutequiv.perm
can be found ingroup_theory/perm
.
Then we define
-
canonical isomorphisms between various types: e.g.,
equiv.refl α
is the identity map interpreted asα ≃ α
;
-
operations on equivalences: e.g.,
-
equiv.symm e : β ≃ α
is the inverse ofe : α ≃ β
; -
equiv.trans e₁ e₂ : α ≃ γ
is the composition ofe₁ : α ≃ β
ande₂ : β ≃ γ
(note the order of the arguments!);
-
-
definitions that transfer some instances along an equivalence. By convention, we transfer instances from right to left.
equiv.inhabited
takese : α ≃ β
and[inhabited β]
and returnsinhabited α
;equiv.unique
takese : α ≃ β
and[unique β]
and returnsunique α
;equiv.decidable_eq
takese : α ≃ β
and[decidable_eq β]
and returnsdecidable_eq α
.
More definitions of this kind can be found in other files. E.g.,
data/equiv/transfer_instance
does it for many algebraic type classes likegroup
,module
, etc.
Many more such isomorphisms and operations are defined in logic/equiv/basic
.
Tags #
equivalence, congruence, bijective map
- to_fun : α → β
- inv_fun : β → α
- left_inv : function.left_inverse self.inv_fun self.to_fun
- right_inv : function.right_inverse self.inv_fun self.to_fun
α ≃ β
is the type of functions from α → β
with a two-sided inverse.
Instances for equiv
- equiv.has_sizeof_inst
- equiv.has_coe_t
- equiv.equiv_like
- equiv.has_coe_to_fun
- equiv.inhabited'
- equiv.equiv_subsingleton_cod
- equiv.equiv_subsingleton_dom
- equiv.perm_unique
- equiv.function.bijective.can_lift
- equiv.coe_embedding
- equiv.perm.coe_embedding
- equiv.perm.perm_group
- equiv.perm.apply_mul_action
- equiv.perm.apply_has_faithful_smul
- equiv.finite_right
- equiv.finite_left
- nonempty_equiv_of_countable
- affine_equiv.equiv.has_coe
- equiv.fintype
- equiv.perm.disjoint.is_symm
Equations
- equiv.equiv_like = {coe := equiv.to_fun β, inv := equiv.inv_fun β, left_inv := _, right_inv := _, coe_injective' := _}
Equations
The map coe_fn : (r ≃ s) → (r → s)
is injective.
Equations
- equiv.inhabited' = {default := equiv.refl α}
See Note [custom simps projection]
Equations
- equiv.simps.symm_apply e = ⇑(e.symm)
Equations
This cannot be a simp
lemmas as it incorrectly matches against e : α ≃ synonym α
, when
synonym α
is semireducible. This makes a mess of multiplicative.of_add
etc.
If α
is equivalent to β
and γ
is equivalent to δ
, then the type of equivalences α ≃ γ
is equivalent to the type of equivalences β ≃ δ
.
If α
is equivalent to β
, then perm α
is equivalent to perm β
.
Equations
- e.perm_congr = e.equiv_congr e
Two empty types are equivalent.
Equations
- equiv.equiv_of_is_empty α β = {to_fun := is_empty_elim (λ (a : α), β), inv_fun := is_empty_elim (λ (a : β), α), left_inv := _, right_inv := _}
If α
is an empty type, then it is equivalent to the empty
type.
Equations
If α
is an empty type, then it is equivalent to the pempty
type in any universe.
Equations
α
is equivalent to an empty type iff α
is empty.
Equations
- equiv.equiv_empty_equiv α = {to_fun := _, inv_fun := equiv.equiv_empty α, left_inv := _, right_inv := _}
The Sort
of proofs of a false proposition is equivalent to pempty
.
Equations
If both α
and β
have a unique element, then α ≃ β
.
Equations
- equiv.equiv_of_unique α β = {to_fun := inhabited.default (pi.inhabited α), inv_fun := inhabited.default (pi.inhabited β), left_inv := _, right_inv := _}
If α
has a unique element, then it is equivalent to any punit
.
Equations
The Sort
of proofs of a true proposition is equivalent to punit
.
Equations
ulift α
is equivalent to α
.
Equations
- equiv.ulift = {to_fun := ulift.down α, inv_fun := ulift.up α, left_inv := _, right_inv := _}
plift α
is equivalent to α
.
Equations
- equiv.plift = {to_fun := plift.down α, inv_fun := plift.up α, left_inv := _, right_inv := _}
If α₁
is equivalent to α₂
and β₁
is equivalent to β₂
, then the type of maps α₁ → β₁
is equivalent to the type of maps α₂ → β₂
.
A version of equiv.arrow_congr
in Type
, rather than Sort
.
The equiv_rw
tactic is not able to use the default Sort
level equiv.arrow_congr
,
because Lean's universe rules will not unify ?l_1
with imax (1 ?m_1)
.
Equations
- hα.arrow_congr' hβ = hα.arrow_congr hβ
Conjugate a map f : α → α
by an equivalence α ≃ β
.
Equations
- e.conj = e.arrow_congr e
punit
sorts in any two universes are equivalent.
If α
is subsingleton
and a : α
, then the type of dependent functions Π (i : α), β i
is equivalent to β i
.
Equations
- equiv.Pi_subsingleton β a = {to_fun := function.eval a, inv_fun := λ (x : β a) (b : α), cast _ x, left_inv := _, right_inv := _}
If α
has a unique term, then the type of function α → β
is equivalent to β
.
Equations
- equiv.fun_unique α β = equiv.Pi_subsingleton (λ (ᾰ : α), β) inhabited.default
The sort of maps from punit
is equivalent to the codomain.
Equations
The sort of maps from true
is equivalent to the codomain.
Equations
A psigma
-type is equivalent to the corresponding sigma
-type.
A family of equivalences Π a, β₁ a ≃ β₂ a
generates an equivalence between Σ' a, β₁ a
and
Σ' a, β₂ a
.
A family of equivalences Π a, β₁ a ≃ β₂ a
generates an equivalence between Σ a, β₁ a
and
Σ a, β₂ a
.
A psigma
with Prop
fibers is equivalent to the subtype.
A sigma
with plift
fibers is equivalent to the subtype.
Equations
- equiv.sigma_plift_equiv_subtype P = ((equiv.psigma_equiv_sigma (λ (i : α), plift (P i))).symm.trans (equiv.psigma_congr_right (λ (a : α), equiv.plift))).trans (equiv.psigma_equiv_subtype P)
A sigma
with λ i, ulift (plift (P i))
fibers is equivalent to { x // P x }
.
Variant of sigma_plift_equiv_subtype
.
Equations
A family of permutations Π a, perm (β a)
generates a permuation perm (Σ a, β₁ a)
.
Equations
An equivalence f : α₁ ≃ α₂
generates an equivalence between Σ a, β (f a)
and Σ a, β a
.
Transporting a sigma type through an equivalence of the base
Equations
Transporting a sigma type through an equivalence of the base and a family of equivalences of matching fibers
Equations
- f.sigma_congr F = (equiv.sigma_congr_right F).trans f.sigma_congr_left
sigma
type with a constant fiber is equivalent to the product.
If each fiber of a sigma
type is equivalent to a fixed type, then the sigma type
is equivalent to the product.
Equations
Dependent product of types is associative up to an equivalence.
Quotients are congruent on equivalences under equality of their relation.
An alternative is just to use rewriting with eq
, but then computational proofs get stuck.
Equations
- quot.congr_right eq = quot.congr (equiv.refl α) eq
An equivalence e : α ≃ β
generates an equivalence between the quotient space of α
by a relation ra
and the quotient space of β
by the image of this relation under e
.
Equations
- quot.congr_left e = quot.congr e _
An equivalence e : α ≃ β
generates an equivalence between quotient spaces,
if `ra a₁ a₂ ↔ rb (e a₁) (e a₂).
Equations
- quotient.congr e eq = quot.congr e eq