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
Cmd instead of
Ctrl .
/-
Copyright (c) 2018 Simon Hudon. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Simon Hudon, Patrick Massot
! This file was ported from Lean 3 source module algebra.ring.pi
! leanprover-community/mathlib commit ba2245edf0c8bb155f1569fd9b9492a9b384cde6
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Group.Pi
import Mathlib.Algebra.Hom.Ring
/-!
# Pi instances for ring
This file defines instances for ring, semiring and related structures on Pi Types
-/
-- Porting notes: used to import `tactic.pi_instances`
namespace Pi
universe u v w
variable { I : Type u }
-- The indexing type
variable { f : I β Type v }
-- The family of types already equipped with instances
variable ( x y : β i , f i ) ( i : I )
-- Porting note: All these instances used `refine_struct` and `pi_instance_derive_field`
instance distrib : {I : Type u} β {f : I β Type v } β [inst : (i : I ) β Distrib (f i ) ] β Distrib ((i : I ) β f i ) distrib [β i , Distrib <| f i ] : Distrib (β i : I , f i ) :=
{ add := (Β· + Β·) : ((i : I ) β f i ) β ((i : I ) β f i ) β (i : I ) β f i
(Β· + Β·)
mul := (Β· * Β·) : ((i : I ) β f i ) β ((i : I ) β f i ) β (i : I ) β f i
(Β· * Β·)
left_distrib := by I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) β (a b c : (i : I ) β f i ), a * (b + c ) = a * b + a * c intros I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i aβ * (bβ + cβ ) = aβ * bβ + aβ * cβ ; I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i aβ * (bβ + cβ ) = aβ * bβ + aβ * cβ I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) β (a b c : (i : I ) β f i ), a * (b + c ) = a * b + a * c ext I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i xβ : I h ; I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i xβ : I h I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) β (a b c : (i : I ) β f i ), a * (b + c ) = a * b + a * c exact mul_add _ _ _
right_distrib := by I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) β (a b c : (i : I ) β f i ), (a + b ) * c = a * c + b * c intros I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i (aβ + bβ ) * cβ = aβ * cβ + bβ * cβ ; I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i (aβ + bβ ) * cβ = aβ * cβ + bβ * cβ I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) β (a b c : (i : I ) β f i ), (a + b ) * c = a * c + b * c ext I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i xβ : I h ; I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) aβ, bβ, cβ : (i : I ) β f i xβ : I h I : Type uf : I β Type vx, y : (i : I ) β f i i : I instβ : (i : I ) β Distrib (f i ) β (a b c : (i : I ) β f i ), (a + b ) * c = a * c + b * c exact add_mul _ _ _ }
#align pi.distrib Pi.distrib : {I : Type u} β {f : I β Type v } β [inst : (i : I ) β Distrib (f i ) ] β Distrib ((i : I ) β f i ) Pi.distrib
instance nonUnitalNonAssocSemiring [β i , NonUnitalNonAssocSemiring : Type ?u.1429 β Type ?u.1429 NonUnitalNonAssocSemiring <| f i ] :
NonUnitalNonAssocSemiring : Type ?u.1433 β Type ?u.1433 NonUnitalNonAssocSemiring (β i : I , f i ) :=
{ Pi.distrib : {I : Type ?u.1444} β {f : I β Type ?u.1443 } β [inst : (i : I ) β Distrib (f i ) ] β Distrib ((i : I ) β f i ) Pi.distrib, Pi.addCommMonoid , Pi.mulZeroClass with }
#align pi.non_unital_non_assoc_semiring Pi.nonUnitalNonAssocSemiring
instance nonUnitalSemiring [β i , NonUnitalSemiring : Type ?u.1985 β Type ?u.1985 NonUnitalSemiring <| f i ] : NonUnitalSemiring : Type ?u.1989 β Type ?u.1989 NonUnitalSemiring (β i : I , f i ) :=
{ Pi.nonUnitalNonAssocSemiring, Pi.semigroupWithZero with } : NonUnitalSemiring ?m.2066 { Pi.nonUnitalNonAssocSemiring { Pi.nonUnitalNonAssocSemiring, Pi.semigroupWithZero with } : NonUnitalSemiring ?m.2066 , Pi.semigroupWithZero { Pi.nonUnitalNonAssocSemiring, Pi.semigroupWithZero with } : NonUnitalSemiring ?m.2066 { Pi.nonUnitalNonAssocSemiring, Pi.semigroupWithZero with } : NonUnitalSemiring ?m.2066 with { Pi.nonUnitalNonAssocSemiring, Pi.semigroupWithZero with } : NonUnitalSemiring ?m.2066 }
#align pi.non_unital_semiring Pi.nonUnitalSemiring
instance nonAssocSemiring [β i , NonAssocSemiring : Type ?u.2498 β Type ?u.2498 NonAssocSemiring <| f i ] : NonAssocSemiring : Type ?u.2502 β Type ?u.2502 NonAssocSemiring (β i : I , f i ) :=
{ Pi.nonUnitalNonAssocSemiring, Pi.mulZeroOneClass, Pi.addMonoidWithOne with } : NonAssocSemiring ?m.2612 { Pi.nonUnitalNonAssocSemiring { Pi.nonUnitalNonAssocSemiring, Pi.mulZeroOneClass, Pi.addMonoidWithOne with } : NonAssocSemiring ?m.2612 , Pi.mulZeroOneClass { Pi.nonUnitalNonAssocSemiring, Pi.mulZeroOneClass, Pi.addMonoidWithOne with } : NonAssocSemiring ?m.2612 , Pi.addMonoidWithOne { Pi.nonUnitalNonAssocSemiring, Pi.mulZeroOneClass, Pi.addMonoidWithOne with } : NonAssocSemiring ?m.2612 { Pi.nonUnitalNonAssocSemiring, Pi.mulZeroOneClass, Pi.addMonoidWithOne with } : NonAssocSemiring ?m.2612 with { Pi.nonUnitalNonAssocSemiring, Pi.mulZeroOneClass, Pi.addMonoidWithOne with } : NonAssocSemiring ?m.2612 }
#align pi.non_assoc_semiring Pi.nonAssocSemiring
instance semiring [β i , Semiring <| f i ] : Semiring (β i : I , f i ) :=
{ Pi.nonUnitalSemiring, Pi.nonAssocSemiring, Pi.monoidWithZero with } : Semiring ?m.3404 { Pi.nonUnitalSemiring { Pi.nonUnitalSemiring, Pi.nonAssocSemiring, Pi.monoidWithZero with } : Semiring ?m.3404 , Pi.nonAssocSemiring { Pi.nonUnitalSemiring, Pi.nonAssocSemiring, Pi.monoidWithZero with } : Semiring ?m.3404 , Pi.monoidWithZero { Pi.nonUnitalSemiring, Pi.nonAssocSemiring, Pi.monoidWithZero with } : Semiring ?m.3404 { Pi.nonUnitalSemiring, Pi.nonAssocSemiring, Pi.monoidWithZero with } : Semiring ?m.3404 with { Pi.nonUnitalSemiring, Pi.nonAssocSemiring, Pi.monoidWithZero with } : Semiring ?m.3404 }
#align pi.semiring Pi.semiring
instance nonUnitalCommSemiring [β i , NonUnitalCommSemiring : Type ?u.4089 β Type ?u.4089 NonUnitalCommSemiring <| f i ] :
NonUnitalCommSemiring : Type ?u.4093 β Type ?u.4093 NonUnitalCommSemiring (β i : I , f i ) :=
{ Pi.nonUnitalSemiring , Pi.commSemigroup with }
#align pi.non_unital_comm_semiring Pi.nonUnitalCommSemiring
instance commSemiring [β i , CommSemiring : Type ?u.4457 β Type ?u.4457 CommSemiring <| f i ] : CommSemiring : Type ?u.4461 β Type ?u.4461 CommSemiring (β i : I , f i ) :=
{ Pi.semiring : {I : Type ?u.4472} β {f : I β Type ?u.4471 } β [inst : (i : I ) β Semiring (f i ) ] β Semiring ((i : I ) β f i ) Pi.semiring, Pi.commMonoid with }
#align pi.comm_semiring Pi.commSemiring
instance nonUnitalNonAssocRing [β i , NonUnitalNonAssocRing : Type ?u.4899 β Type ?u.4899 NonUnitalNonAssocRing <| f i ] :
NonUnitalNonAssocRing : Type ?u.4903 β Type ?u.4903 NonUnitalNonAssocRing (β i : I , f i ) :=
{ Pi.addCommGroup , Pi.nonUnitalNonAssocSemiring with }
#align pi.non_unital_non_assoc_ring Pi.nonUnitalNonAssocRing
instance nonUnitalRing [β i , NonUnitalRing : Type ?u.5366 β Type ?u.5366 NonUnitalRing <| f i ] : NonUnitalRing : Type ?u.5370 β Type ?u.5370 NonUnitalRing (β i : I , f i ) :=
{ Pi.nonUnitalNonAssocRing, Pi.nonUnitalSemiring with } : NonUnitalRing ?m.5447 { Pi.nonUnitalNonAssocRing { Pi.nonUnitalNonAssocRing, Pi.nonUnitalSemiring with } : NonUnitalRing ?m.5447 , Pi.nonUnitalSemiring { Pi.nonUnitalNonAssocRing, Pi.nonUnitalSemiring with } : NonUnitalRing ?m.5447 { Pi.nonUnitalNonAssocRing, Pi.nonUnitalSemiring with } : NonUnitalRing ?m.5447 with { Pi.nonUnitalNonAssocRing, Pi.nonUnitalSemiring with } : NonUnitalRing ?m.5447 }
#align pi.non_unital_ring Pi.nonUnitalRing
instance nonAssocRing [β i , NonAssocRing : Type ?u.5861 β Type ?u.5861 NonAssocRing <| f i ] : NonAssocRing : Type ?u.5865 β Type ?u.5865 NonAssocRing (β i : I , f i ) :=
{ Pi.nonUnitalNonAssocRing, Pi.nonAssocSemiring, Pi.addGroupWithOne with } : NonAssocRing ?m.5973 { Pi.nonUnitalNonAssocRing { Pi.nonUnitalNonAssocRing, Pi.nonAssocSemiring, Pi.addGroupWithOne with } : NonAssocRing ?m.5973 , Pi.nonAssocSemiring { Pi.nonUnitalNonAssocRing, Pi.nonAssocSemiring, Pi.addGroupWithOne with } : NonAssocRing ?m.5973 , Pi.addGroupWithOne { Pi.nonUnitalNonAssocRing, Pi.nonAssocSemiring, Pi.addGroupWithOne with } : NonAssocRing ?m.5973 { Pi.nonUnitalNonAssocRing, Pi.nonAssocSemiring, Pi.addGroupWithOne with } : NonAssocRing ?m.5973 with { Pi.nonUnitalNonAssocRing, Pi.nonAssocSemiring, Pi.addGroupWithOne with } : NonAssocRing ?m.5973 }
#align pi.non_assoc_ring Pi.nonAssocRing
instance ring : [inst : (i : I ) β Ring (f i ) ] β Ring ((i : I ) β f i ) ring [β i , Ring <| f i ] : Ring (β i : I , f i ) :=
{ Pi.semiring, Pi.addCommGroup, Pi.addGroupWithOne with } : Ring ?m.6844 { Pi.semiring : {I : Type ?u.6735} β {f : I β Type ?u.6734 } β [inst : (i : I ) β Semiring (f i ) ] β Semiring ((i : I ) β f i ) Pi.semiring{ Pi.semiring, Pi.addCommGroup, Pi.addGroupWithOne with } : Ring ?m.6844 , Pi.addCommGroup { Pi.semiring, Pi.addCommGroup, Pi.addGroupWithOne with } : Ring ?m.6844 , Pi.addGroupWithOne { Pi.semiring, Pi.addCommGroup, Pi.addGroupWithOne with } : Ring ?m.6844 { Pi.semiring, Pi.addCommGroup, Pi.addGroupWithOne with } : Ring ?m.6844 with { Pi.semiring, Pi.addCommGroup, Pi.addGroupWithOne with } : Ring ?m.6844 }
#align pi.ring Pi.ring : {I : Type u} β {f : I β Type v } β [inst : (i : I ) β Ring (f i ) ] β Ring ((i : I ) β f i ) Pi.ring
instance nonUnitalCommRing [β i , NonUnitalCommRing : Type ?u.7699 β Type ?u.7699 NonUnitalCommRing <| f i ] : NonUnitalCommRing : Type ?u.7703 β Type ?u.7703 NonUnitalCommRing (β i : I , f i ) :=
{ Pi.nonUnitalRing , Pi.commSemigroup with }
#align pi.non_unital_comm_ring Pi.nonUnitalCommRing
instance commRing [β i , CommRing <| f i ] : CommRing (β i : I , f i ) :=
{ Pi.ring, Pi.commSemiring with } : CommRing ?m.8122 { Pi.ring : {I : Type ?u.8062} β {f : I β Type ?u.8061 } β [inst : (i : I ) β Ring (f i ) ] β Ring ((i : I ) β f i ) Pi.ring{ Pi.ring, Pi.commSemiring with } : CommRing ?m.8122 , Pi.commSemiring { Pi.ring, Pi.commSemiring with } : CommRing ?m.8122 { Pi.ring, Pi.commSemiring with } : CommRing ?m.8122 with { Pi.ring, Pi.commSemiring with } : CommRing ?m.8122 }
#align pi.comm_ring Pi.commRing
/-- A family of non-unital ring homomorphisms `f a : Ξ³ ββ+* Ξ² a` defines a non-unital ring
homomorphism `Pi.nonUnitalRingHom f : Ξ³ β+* Ξ a, Ξ² a` given by
`Pi.nonUnitalRingHom f x b = f b x`. -/
@[ simps ]
protected def nonUnitalRingHom { Ξ³ : Type w } [β i , NonUnitalNonAssocSemiring : Type ?u.8500 β Type ?u.8500 NonUnitalNonAssocSemiring ( f i )]
[ NonUnitalNonAssocSemiring : Type ?u.8504 β Type ?u.8504 NonUnitalNonAssocSemiring Ξ³ ] ( g : β i , Ξ³ ββ+* f i ) : Ξ³ ββ+* β i , f i :=
{ Pi.mulHom : {I : Type ?u.8586} β
{f : I β Type ?u.8585 } β
{Ξ³ : Type ?u.8584} β [inst : (i : I ) β Mul (f i ) ] β [inst_1 : Mul Ξ³ ] β ((i : I ) β Ξ³ ββ* f i ) β Ξ³ ββ* (i : I ) β f i Pi.mulHom fun i => ( g i ). toMulHom , Pi.addMonoidHom : {I : Type ?u.8827} β
{f : I β Type ?u.8826 } β
{Ξ³ : Type ?u.8825} β
[inst : (i : I ) β AddZeroClass (f i ) ] β [inst_1 : AddZeroClass Ξ³ ] β ((i : I ) β Ξ³ β+ f i ) β Ξ³ β+ (i : I ) β f i Pi.addMonoidHom fun i => ( g i ). toAddMonoidHom with
toFun := fun x b => g b x }
#align pi.non_unital_ring_hom Pi.nonUnitalRingHom
theorem nonUnitalRingHom_injective { Ξ³ : Type w } [ Nonempty I ]
[β i , NonUnitalNonAssocSemiring : Type ?u.11113 β Type ?u.11113 NonUnitalNonAssocSemiring ( f i )] [ NonUnitalNonAssocSemiring : Type ?u.11117 β Type ?u.11117 NonUnitalNonAssocSemiring Ξ³ ] ( g : β i , Ξ³ ββ+* f i )
( hg : β i , Function.Injective : {Ξ± : Sort ?u.11151} β {Ξ² : Sort ?u.11150} β (Ξ± β Ξ² ) β Prop Function.Injective ( g i )) : Function.Injective : {Ξ± : Sort ?u.11358} β {Ξ² : Sort ?u.11357} β (Ξ± β Ξ² ) β Prop Function.Injective ( Pi.nonUnitalRingHom g ) :=
mulHom_injective ( fun i => ( g i ). toMulHom ) hg
#align pi.non_unital_ring_hom_injective Pi.nonUnitalRingHom_injective
/-- A family of ring homomorphisms `f a : Ξ³ β+* Ξ² a` defines a ring homomorphism
`Pi.ringHom f : Ξ³ β+* Ξ a, Ξ² a` given by `Pi.ringHom f x b = f b x`. -/
@[ simps ]
protected def ringHom { Ξ³ : Type w } [β i , NonAssocSemiring : Type ?u.11914 β Type ?u.11914 NonAssocSemiring ( f i )] [ NonAssocSemiring : Type ?u.11918 β Type ?u.11918 NonAssocSemiring Ξ³ ]
( g : (i : I ) β Ξ³ β+* f i g : β i , Ξ³ β+* f i ) : Ξ³ β+* β i , f i :=
{ Pi.monoidHom : {I : Type ?u.11996} β
{f : I β Type ?u.11995 } β
{Ξ³ : Type ?u.11994} β
[inst : (i : I ) β MulOneClass (f i ) ] β [inst_1 : MulOneClass Ξ³ ] β ((i : I ) β Ξ³ β* f i ) β Ξ³ β* (i : I ) β f i Pi.monoidHom fun i => ( g : (i : I ) β Ξ³ β+* f i g i ). toMonoidHom , Pi.addMonoidHom : {I : Type ?u.12122} β
{f : I β Type ?u.12121 } β
{Ξ³ : Type ?u.12120} β
[inst : (i : I ) β AddZeroClass (f i ) ] β [inst_1 : AddZeroClass Ξ³ ] β ((i : I ) β Ξ³ β+ f i ) β Ξ³ β+ (i : I ) β f i Pi.addMonoidHom fun i => ( g : (i : I ) β Ξ³ β+* f i g i ). toAddMonoidHom with
toFun := fun x b => g : (i : I ) β Ξ³ β+* f i g b x }
#align pi.ring_hom Pi.ringHom
#align pi.ring_hom_apply Pi.ringHom_apply
theorem ringHom_injective { Ξ³ : Type w } [ Nonempty I ] [β i , NonAssocSemiring : Type ?u.13740 β Type ?u.13740 NonAssocSemiring ( f i )]
[ NonAssocSemiring : Type ?u.13744 β Type ?u.13744 NonAssocSemiring Ξ³ ] ( g : (i : I ) β Ξ³ β+* f i g : β i , Ξ³ β+* f i ) ( hg : β i , Function.Injective : {Ξ± : Sort ?u.13776} β {Ξ² : Sort ?u.13775} β (Ξ± β Ξ² ) β Prop Function.Injective ( g : (i : I ) β Ξ³ β+* f i g i )) :
Function.Injective : {Ξ± : Sort ?u.14042} β {Ξ² : Sort ?u.14041} β (Ξ± β Ξ² ) β Prop Function.Injective ( Pi.ringHom g : (i : I ) β Ξ³ β+* f i g ) :=
monoidHom_injective ( fun i => ( g : (i : I ) β Ξ³ β+* f i g i ). toMonoidHom ) hg
#align pi.ring_hom_injective Pi.ringHom_injective
end Pi
section NonUnitalRingHom
universe u v
variable { I : Type u }
/-- Evaluation of functions into an indexed collection of non-unital rings at a point is a
non-unital ring homomorphism. This is `Function.eval` as a `NonUnitalRingHom`. -/
@[ simps ]
def Pi.evalNonUnitalRingHom ( f : I β Type v ) [β i , NonUnitalNonAssocSemiring : Type ?u.14543 β Type ?u.14543 NonUnitalNonAssocSemiring ( f i )] ( i : I ) :
(β i , f i ) ββ+* f i :=
{ Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 { Pi.evalMulHom : {I : Type ?u.14608} β (f : I β Type ?u.14607 ) β [inst : (i : I ) β Mul (f i ) ] β (i : I ) β ((i : I ) β f i ) ββ* f i Pi.evalMulHom{ Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 f { Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 i { Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 , Pi.evalAddMonoidHom : {I : Type ?u.14725} β (f : I β Type ?u.14724 ) β [inst : (i : I ) β AddZeroClass (f i ) ] β (i : I ) β ((i : I ) β f i ) β+ f i Pi.evalAddMonoidHom{ Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 f { Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 i { Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 { Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 with { Pi.evalMulHom f i, Pi.evalAddMonoidHom f i with } : ?m.15151 ββ+* ?m.15152 }
#align pi.eval_non_unital_ring_hom Pi.evalNonUnitalRingHom
/-- `Function.const` as a `NonUnitalRingHom`. -/
@[ simps ]
def Pi.constNonUnitalRingHom ( Ξ± Ξ² : Type _ : Type (?u.16566+1) Type _) [ NonUnitalNonAssocSemiring : Type ?u.16569 β Type ?u.16569 NonUnitalNonAssocSemiring Ξ² ] : Ξ² ββ+* Ξ± β Ξ² :=
{ Pi.nonUnitalRingHom fun _ => NonUnitalRingHom.id Ξ² with toFun := Function.const : {Ξ± : Sort ?u.16871} β (Ξ² : Sort ?u.16870) β Ξ± β Ξ² β Ξ± Function.const _ }
#align pi.const_non_unital_ring_hom Pi.constNonUnitalRingHom
/-- Non-unital ring homomorphism between the function spaces `I β Ξ±` and `I β Ξ²`, induced by a
non-unital ring homomorphism `f` between `Ξ±` and `Ξ²`. -/
@[ simps ]
protected def NonUnitalRingHom.compLeft { Ξ± Ξ² : Type _ : Type (?u.17203+1) Type _} [ NonUnitalNonAssocSemiring : Type ?u.17206 β Type ?u.17206 NonUnitalNonAssocSemiring Ξ± ]
[ NonUnitalNonAssocSemiring : Type ?u.17209 β Type ?u.17209 NonUnitalNonAssocSemiring Ξ² ] ( f : Ξ± ββ+* Ξ² ) ( I : Type _ : Type (?u.17230+1) Type _) : ( I β Ξ± ) ββ+* I β Ξ² :=
{ f . toMulHom . compLeft : {Ξ± : Type ?u.17338} β
{Ξ² : Type ?u.17337} β [inst : Mul Ξ± ] β [inst_1 : Mul Ξ² ] β (Ξ± ββ* Ξ² ) β (I : Type ?u.17336) β (I β Ξ± ) ββ* I β Ξ² compLeft I , f . toAddMonoidHom . compLeft I with toFun := fun h => f β h }
#align non_unital_ring_hom.comp_left NonUnitalRingHom.compLeft
end NonUnitalRingHom
section RingHom
universe u v
variable { I : Type u }
/-- Evaluation of functions into an indexed collection of rings at a point is a ring
homomorphism. This is `Function.eval` as a `RingHom`. -/
@[ simps! ]
def Pi.evalRingHom ( f : I β Type v ) [β i , NonAssocSemiring : Type ?u.19440 β Type ?u.19440 NonAssocSemiring ( f i )] ( i : I ) : (β i , f i ) β+* f i :=
{ Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 { Pi.evalMonoidHom : {I : Type ?u.19502} β (f : I β Type ?u.19501 ) β [inst : (i : I ) β MulOneClass (f i ) ] β (i : I ) β ((i : I ) β f i ) β* f i Pi.evalMonoidHom{ Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 f { Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 i { Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 , Pi.evalAddMonoidHom : {I : Type ?u.19556} β (f : I β Type ?u.19555 ) β [inst : (i : I ) β AddZeroClass (f i ) ] β (i : I ) β ((i : I ) β f i ) β+ f i Pi.evalAddMonoidHom{ Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 f { Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 i { Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 { Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 with { Pi.evalMonoidHom f i, Pi.evalAddMonoidHom f i with } : ?m.19696 β+* ?m.19697 }
#align pi.eval_ring_hom Pi.evalRingHom
#align pi.eval_ring_hom_apply Pi.evalRingHom_apply
/-- `Function.const` as a `RingHom`. -/
@[ simps ]
def Pi.constRingHom ( Ξ± Ξ² : Type _ : Type (?u.20506+1) Type _) [ NonAssocSemiring : Type ?u.20509 β Type ?u.20509 NonAssocSemiring Ξ² ] : Ξ² β+* Ξ± β Ξ² :=
{ Pi.ringHom fun _ => RingHom.id Ξ² with toFun := Function.const : {Ξ± : Sort ?u.20893} β (Ξ² : Sort ?u.20892) β Ξ± β Ξ² β Ξ± Function.const _ }
#align pi.const_ring_hom Pi.constRingHom
#align pi.const_ring_hom_apply Pi.constRingHom_apply
/-- Ring homomorphism between the function spaces `I β Ξ±` and `I β Ξ²`, induced by a ring
homomorphism `f` between `Ξ±` and `Ξ²`. -/
@[ simps ]
protected def RingHom.compLeft { Ξ± Ξ² : Type _ : Type (?u.21381+1) Type _} [ NonAssocSemiring : Type ?u.21387 β Type ?u.21387 NonAssocSemiring Ξ± ] [ NonAssocSemiring : Type ?u.21390 β Type ?u.21390 NonAssocSemiring Ξ² ]
( f : Ξ± β+* Ξ² ) ( I : Type _ : Type (?u.21409+1) Type _) : ( I β Ξ± ) β+* I β Ξ² :=
{ f . toMonoidHom . compLeft I , f . toAddMonoidHom . compLeft I with toFun := fun h => f β h }
#align ring_hom.comp_left RingHom.compLeft
#align ring_hom.comp_left_apply RingHom.compLeft_apply
end RingHom