Transfer algebraic structures across equiv
s #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file we prove theorems of the following form: if β
has a
group structure and α ≃ β
then α
has a group structure, and
similarly for monoids, semigroups, rings, integral domains, fields and
so on.
Note that most of these constructions can also be obtained using the transport
tactic.
Implementation details #
When adding new definitions that transfer type-classes across an equivalence, please mark them
@[reducible]
. See note [reducible non-instances].
Tags #
equiv, group, ring, field, module, algebra
An equivalence e : α ≃ β
gives a multiplicative equivalence α ≃* β
where the multiplicative structure on α
is
the one obtained by transporting a multiplicative structure on β
back along e
.
An equivalence e : α ≃ β
gives a additive equivalence α ≃+ β
where the additive structure on α
is
the one obtained by transporting an additive structure on β
back along e
.
Transfer add_semigroup
across an equiv
Equations
- e.add_semigroup = let mul : has_add α := e.has_add in function.injective.add_semigroup ⇑e _ _
Transfer semigroup_with_zero
across an equiv
Equations
- e.semigroup_with_zero = let mul : has_mul α := e.has_mul, zero : has_zero α := e.has_zero in function.injective.semigroup_with_zero ⇑e _ _ _
Transfer comm_semigroup
across an equiv
Equations
- e.comm_semigroup = let mul : has_mul α := e.has_mul in function.injective.comm_semigroup ⇑e _ _
Transfer add_comm_semigroup
across an equiv
Equations
- e.add_comm_semigroup = let mul : has_add α := e.has_add in function.injective.add_comm_semigroup ⇑e _ _
Transfer mul_zero_class
across an equiv
Equations
- e.mul_zero_class = let zero : has_zero α := e.has_zero, mul : has_mul α := e.has_mul in function.injective.mul_zero_class ⇑e _ _ _
Transfer mul_one_class
across an equiv
Equations
- e.mul_one_class = let one : has_one α := e.has_one, mul : has_mul α := e.has_mul in function.injective.mul_one_class ⇑e _ _ _
Transfer add_zero_class
across an equiv
Equations
- e.add_zero_class = let one : has_zero α := e.has_zero, mul : has_add α := e.has_add in function.injective.add_zero_class ⇑e _ _ _
Transfer mul_zero_one_class
across an equiv
Equations
- e.mul_zero_one_class = let zero : has_zero α := e.has_zero, one : has_one α := e.has_one, mul : has_mul α := e.has_mul in function.injective.mul_zero_one_class ⇑e _ _ _ _
Transfer add_monoid
across an equiv
Transfer comm_monoid
across an equiv
Transfer add_comm_monoid
across an equiv
Transfer add_comm_group
across an equiv
Transfer comm_group
across an equiv
Transfer non_unital_non_assoc_semiring
across an equiv
Transfer non_unital_semiring
across an equiv
Transfer add_monoid_with_one
across an equiv
Equations
- e.add_monoid_with_one = {nat_cast := λ (n : ℕ), ⇑(e.symm) ↑n, add := add_monoid.add e.add_monoid, add_assoc := _, zero := add_monoid.zero e.add_monoid, zero_add := _, add_zero := _, nsmul := add_monoid.nsmul e.add_monoid, nsmul_zero' := _, nsmul_succ' := _, one := 1, nat_cast_zero := _, nat_cast_succ := _}
Transfer add_group_with_one
across an equiv
Equations
- e.add_group_with_one = {int_cast := λ (n : ℤ), ⇑(e.symm) ↑n, add := add_monoid_with_one.add e.add_monoid_with_one, add_assoc := _, zero := add_monoid_with_one.zero e.add_monoid_with_one, zero_add := _, add_zero := _, nsmul := add_monoid_with_one.nsmul e.add_monoid_with_one, nsmul_zero' := _, nsmul_succ' := _, neg := add_group.neg e.add_group, sub := add_group.sub e.add_group, sub_eq_add_neg := _, zsmul := add_group.zsmul e.add_group, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, nat_cast := add_monoid_with_one.nat_cast e.add_monoid_with_one, one := add_monoid_with_one.one e.add_monoid_with_one, nat_cast_zero := _, nat_cast_succ := _, int_cast_of_nat := _, int_cast_neg_succ_of_nat := _}
Transfer non_assoc_semiring
across an equiv
Equations
- e.non_assoc_semiring = let mul : has_mul α := e.has_mul, add_monoid_with_one_1 : add_monoid_with_one α := e.add_monoid_with_one in function.injective.non_assoc_semiring ⇑e _ _ _ _ _ _ _
Transfer semiring
across an equiv
Equations
- e.semiring = let mul : has_mul α := e.has_mul, add_monoid_with_one_1 : add_monoid_with_one α := e.add_monoid_with_one, npow : has_pow α ℕ := e.has_pow ℕ in function.injective.semiring ⇑e _ _ _ _ _ _ _ _
Transfer non_unital_comm_semiring
across an equiv
Transfer comm_semiring
across an equiv
Equations
- e.comm_semiring = let mul : has_mul α := e.has_mul, add_monoid_with_one_1 : add_monoid_with_one α := e.add_monoid_with_one, npow : has_pow α ℕ := e.has_pow ℕ in function.injective.comm_semiring ⇑e _ _ _ _ _ _ _ _
Transfer non_unital_non_assoc_ring
across an equiv
Equations
- e.non_unital_non_assoc_ring = let zero : has_zero α := e.has_zero, add : has_add α := e.has_add, mul : has_mul α := e.has_mul, neg : has_neg α := e.has_neg, sub : has_sub α := e.has_sub, nsmul : has_smul ℕ α := e.has_smul ℕ, zsmul : has_smul ℤ α := e.has_smul ℤ in function.injective.non_unital_non_assoc_ring ⇑e _ _ _ _ _ _ _ _
Transfer non_unital_ring
across an equiv
Equations
- e.non_unital_ring = let zero : has_zero α := e.has_zero, add : has_add α := e.has_add, mul : has_mul α := e.has_mul, neg : has_neg α := e.has_neg, sub : has_sub α := e.has_sub, nsmul : has_smul ℕ α := e.has_smul ℕ, zsmul : has_smul ℤ α := e.has_smul ℤ in function.injective.non_unital_ring ⇑e _ _ _ _ _ _ _ _
Transfer non_assoc_ring
across an equiv
Equations
- e.non_assoc_ring = let add_group_with_one_1 : add_group_with_one α := e.add_group_with_one, mul : has_mul α := e.has_mul in function.injective.non_assoc_ring ⇑e _ _ _ _ _ _ _ _ _ _ _
Equations
- e.ring = let mul : has_mul α := e.has_mul, add_group_with_one_1 : add_group_with_one α := e.add_group_with_one, npow : has_pow α ℕ := e.has_pow ℕ in function.injective.ring ⇑e _ _ _ _ _ _ _ _ _ _ _ _
Transfer non_unital_comm_ring
across an equiv
Equations
- e.non_unital_comm_ring = let zero : has_zero α := e.has_zero, add : has_add α := e.has_add, mul : has_mul α := e.has_mul, neg : has_neg α := e.has_neg, sub : has_sub α := e.has_sub, nsmul : has_smul ℕ α := e.has_smul ℕ, zsmul : has_smul ℤ α := e.has_smul ℤ in function.injective.non_unital_comm_ring ⇑e _ _ _ _ _ _ _ _
Transfer comm_ring
across an equiv
Equations
- e.comm_ring = let mul : has_mul α := e.has_mul, add_group_with_one_1 : add_group_with_one α := e.add_group_with_one, npow : has_pow α ℕ := e.has_pow ℕ in function.injective.comm_ring ⇑e _ _ _ _ _ _ _ _ _ _ _ _
Transfer nontrivial
across an equiv
Transfer has_rat_cast
across an equiv
Transfer division_ring
across an equiv
Equations
- e.division_ring = let add_group_with_one_1 : add_group_with_one α := e.add_group_with_one, mul : has_mul α := e.has_mul, inv : has_inv α := e.has_inv, div : has_div α := e.has_div, mul : has_mul α := e.has_mul, npow : has_pow α ℕ := e.has_pow ℕ, zpow : has_pow α ℤ := e.has_pow ℤ, rat_cast : has_rat_cast α := e.has_rat_cast, qsmul : has_smul ℚ α := e.has_smul ℚ in function.injective.division_ring ⇑e _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Transfer field
across an equiv
Equations
- e.field = let add_group_with_one_1 : add_group_with_one α := e.add_group_with_one, mul : has_mul α := e.has_mul, neg : has_neg α := e.has_neg, inv : has_inv α := e.has_inv, div : has_div α := e.has_div, mul : has_mul α := e.has_mul, npow : has_pow α ℕ := e.has_pow ℕ, zpow : has_pow α ℤ := e.has_pow ℤ, rat_cast : has_rat_cast α := e.has_rat_cast, qsmul : has_smul ℚ α := e.has_smul ℚ in function.injective.field ⇑e _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Transfer mul_action
across an equiv
Equations
- equiv.mul_action R e = {to_has_smul := {smul := has_smul.smul (e.has_smul R)}, one_smul := _, mul_smul := _}
Transfer distrib_mul_action
across an equiv
Equations
- equiv.distrib_mul_action R e = let _inst : add_comm_monoid α := e.add_comm_monoid in λ (_inst_3 : distrib_mul_action R β), let _inst_4 : add_comm_monoid α := e.add_comm_monoid in {to_mul_action := {to_has_smul := mul_action.to_has_smul (equiv.mul_action R e), one_smul := _, mul_smul := _}, smul_zero := _, smul_add := _}
Transfer module
across an equiv
Equations
- equiv.module R e = let _inst : add_comm_monoid α := e.add_comm_monoid in λ (_inst_3 : module R β), {to_distrib_mul_action := {to_mul_action := distrib_mul_action.to_mul_action (equiv.distrib_mul_action R e), smul_zero := _, smul_add := _}, add_smul := _, zero_smul := _}
An equivalence e : α ≃ β
gives a linear equivalence α ≃ₗ[R] β
where the R
-module structure on α
is
the one obtained by transporting an R
-module structure on β
back along e
.
Equations
- equiv.linear_equiv R e = let _inst : add_comm_monoid α := e.add_comm_monoid, _inst_4 : module R α := equiv.module R e in {to_fun := e.add_equiv.to_fun, map_add' := _, map_smul' := _, inv_fun := e.add_equiv.inv_fun, left_inv := _, right_inv := _}
Transfer algebra
across an equiv
Equations
- equiv.algebra R e = let _inst : semiring α := e.semiring in λ (_inst_3 : algebra R β), (↑(ring_equiv.symm e.ring_equiv).comp (algebra_map R β)).to_algebra' _
An equivalence e : α ≃ β
gives an algebra equivalence α ≃ₐ[R] β
where the R
-algebra structure on α
is
the one obtained by transporting an R
-algebra structure on β
back along e
.
Equations
- equiv.alg_equiv R e = let _inst : semiring α := e.semiring, _inst_4 : algebra R α := equiv.algebra R e in {to_fun := e.ring_equiv.to_fun, inv_fun := e.ring_equiv.inv_fun, left_inv := _, right_inv := _, map_mul' := _, map_add' := _, commutes' := _}