/- Copyright (c) 2021 Damiano Testa. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Damiano Testa ! This file was ported from Lean 3 source module algebra.smul_with_zero ! leanprover-community/mathlib commit 966e0cf0685c9cedf8a3283ac69eef4d5f2eaca2 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Algebra.GroupPower.Basic import Mathlib.Algebra.Ring.Opposite import Mathlib.GroupTheory.GroupAction.Opposite import Mathlib.GroupTheory.GroupAction.Prod /-! # Introduce `SMulWithZero` In analogy with the usual monoid action on a Type `M`, we introduce an action of a `MonoidWithZero` on a Type with `0`. In particular, for Types `R` and `M`, both containing `0`, we define `SMulWithZero R M` to be the typeclass where the products `r • 0` and `0 • m` vanish for all `r : R` and all `m : M`. Moreover, in the case in which `R` is a `MonoidWithZero`, we introduce the typeclass `MulActionWithZero R M`, mimicking group actions and having an absorbing `0` in `R`. Thus, the action is required to be compatible with * the unit of the monoid, acting as the identity; * the zero of the `MonoidWithZero`, acting as zero; * associativity of the monoid. We also add an `instance`: * any `MonoidWithZero` has a `MulActionWithZero R R` acting on itself. ## Main declarations * `smulMonoidWithZeroHom`: Scalar multiplication bundled as a morphism of monoids with zero. -/ variable {RR: Type ?u.16491R'R': Type ?u.17MM: Type ?u.20M' :M': Type ?u.3539Type _} section Zero variable (Type _: Type (?u.23+1)RR: ?m.26M) /-- `SMulWithZero` is a class consisting of a Type `R` with `0 ∈ R` and a scalar multiplication of `R` on a Type `M` with `0`, such that the equality `r • m = 0` holds if at least one among `r` or `m` equals `0`. -/ class SMulWithZero [ZeroM: ?m.29R] [ZeroR: Type ?u.32M] extends SMulZeroClassM: Type ?u.38RR: Type ?u.32M where /-- Scalar multiplication by the scalar `0` is `0`. -/ zero_smul : ∀M: Type ?u.38m :m: MM, (M: Type ?u.380 :0: ?m.88R) •R: Type ?u.32m =m: M0 #align smul_with_zero SMulWithZero instance0: ?m.141MulZeroClass.toSMulWithZero [MulZeroClassMulZeroClass.toSMulWithZero: [inst : MulZeroClass R] → SMulWithZero R RR] : SMulWithZeroR: Type ?u.223RR: Type ?u.223R where smul :=R: Type ?u.223(· * ·) smul_zero :=(· * ·): R → R → Rmul_zero zero_smul :=mul_zero: ∀ {M₀ : Type ?u.757} [self : MulZeroClass M₀] (a : M₀), a * 0 = 0zero_mul #align mul_zero_class.to_smul_with_zerozero_mul: ∀ {M₀ : Type ?u.794} [self : MulZeroClass M₀] (a : M₀), 0 * a = 0MulZeroClass.toSMulWithZero /-- Like `MulZeroClass.toSMulWithZero`, but multiplies on the right. -/ instanceMulZeroClass.toSMulWithZero: (R : Type u_1) → [inst : MulZeroClass R] → SMulWithZero R RMulZeroClass.toOppositeSMulWithZero [MulZeroClassMulZeroClass.toOppositeSMulWithZero: (R : Type u_1) → [inst : MulZeroClass R] → SMulWithZero Rᵐᵒᵖ RR] : SMulWithZeroR: Type ?u.908RᵐᵒᵖR: Type ?u.908R where smul :=R: Type ?u.908(· • ·) smul_zero(· • ·): Rᵐᵒᵖ → R → R_ :=_: ?m.1628zero_mulzero_mul: ∀ {M₀ : Type ?u.1630} [self : MulZeroClass M₀] (a : M₀), 0 * a = 0_ zero_smul :=_: ?m.1631mul_zero #align mul_zero_class.to_opposite_smul_with_zeromul_zero: ∀ {M₀ : Type ?u.1667} [self : MulZeroClass M₀] (a : M₀), a * 0 = 0MulZeroClass.toOppositeSMulWithZero variable {MulZeroClass.toOppositeSMulWithZero: (R : Type u_1) → [inst : MulZeroClass R] → SMulWithZero Rᵐᵒᵖ RM} [ZeroM: ?m.1773R] [ZeroR: Type ?u.1761M] [SMulWithZeroM: Type ?u.3233RR: Type ?u.1761M] @[simp] theoremM: ?m.1773zero_smul (m :m: MM) : (M: Type ?u.18210 :0: ?m.1880R) •R: Type ?u.1815m =m: M0 := SMulWithZero.zero_smul0: ?m.1988m #align zero_smul zero_smul variable {m: MR} {R: ?m.2205a :a: RR} {R: Type ?u.2212b :b: MM} lemmaM: Type ?u.2946smul_eq_zero_of_left (h :h: a = 0a =a: R0) (0: ?m.2270b :b: MM) :M: Type ?u.2218a •a: Rb =b: M0 :=0: ?m.2405h.symm ▸ zero_smulh: a = 0__: Type ?u.2456b #align smul_eq_zero_of_left smul_eq_zero_of_left lemma smul_eq_zero_of_right (b: Ma :a: RR) (R: Type ?u.2577h :h: b = 0b =b: M0) :0: ?m.2637a •a: Rb =b: M0 :=0: ?m.2770h.symm ▸ smul_zeroh: b = 0a #align smul_eq_zero_of_right smul_eq_zero_of_right lemmaa: Rleft_ne_zero_of_smul :a •a: Rb ≠b: M0 →0: ?m.3093a ≠a: R0 := mt $ fun0: ?m.3119h ↦ smul_eq_zero_of_lefth: ?m.3150hh: ?m.3150b #align left_ne_zero_of_smul left_ne_zero_of_smul lemmab: Mright_ne_zero_of_smul :a •a: Rb ≠b: M0 →0: ?m.3380b ≠b: M0 := mt $ smul_eq_zero_of_right0: ?m.3406a #align right_ne_zero_of_smul right_ne_zero_of_smul variable [Zeroa: RR'] [ZeroR': Type ?u.3533M'] [SMulM': Type ?u.3539RR: Type ?u.3596M'] /-- Pullback a `SMulWithZero` structure along an injective zero-preserving homomorphism. See note [reducible non-instances]. -/ @[reducible] protected defM': Type ?u.7924Function.Injective.smulWithZero (f : ZeroHomf: ZeroHom M' MM'M': Type ?u.3605M) (M: Type ?u.3602hf : Function.Injectivehf: Injective ↑ff) (smul : ∀ (f: ZeroHom M' Ma :a: RR) (R: Type ?u.3596b),b: ?m.4495f (f: ZeroHom M' Ma •a: Rb) =b: ?m.4495a •a: Rff: ZeroHom M' Mb) : SMulWithZerob: ?m.4495RR: Type ?u.3596M' where smul :=M': Type ?u.3605(· • ·) zero_smul(· • ·): R → M' → M'a :=a: ?m.6399hf <|hf: Injective ↑fGoals accomplished! 🐙smul_zeroGoals accomplished! 🐙a :=a: ?m.6387hf <|hf: Injective ↑fGoals accomplished! 🐙#align function.injective.smul_with_zeroGoals accomplished! 🐙Function.Injective.smulWithZero /-- Pushforward a `SMulWithZero` structure along a surjective zero-preserving homomorphism. See note [reducible non-instances]. -/ @[reducible] protected defFunction.Injective.smulWithZero: {R : Type u_1} → {M : Type u_2} → {M' : Type u_3} → [inst : Zero R] → [inst_1 : Zero M] → [inst_2 : SMulWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M' M) → Function.Injective ↑f → (∀ (a : R) (b : M'), ↑f (a • b) = a • ↑f b) → SMulWithZero R M'Function.Surjective.smulWithZero (Function.Surjective.smulWithZero: {R : Type u_1} → {M : Type u_2} → {M' : Type u_3} → [inst : Zero R] → [inst_1 : Zero M] → [inst_2 : SMulWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M M') → Surjective ↑f → (∀ (a : R) (b : M), ↑f (a • b) = a • ↑f b) → SMulWithZero R M'f : ZeroHomf: ZeroHom M M'MM: Type ?u.7921M') (M': Type ?u.7924hf : Function.Surjectivehf: Surjective ↑ff) (smul : ∀ (f: ZeroHom M M'a :a: RR) (R: Type ?u.7915b),b: ?m.8820f (f: ZeroHom M M'a •a: Rb) =b: ?m.8820a •a: Rff: ZeroHom M M'b) : SMulWithZerob: ?m.8820RR: Type ?u.7915M' where smul :=M': Type ?u.7924(· • ·) zero_smul(· • ·): R → M' → M'm :=m: ?m.10719Goals accomplished! 🐙smul_zeroGoals accomplished! 🐙c :=c: ?m.10709Goals accomplished! 🐙#align function.surjective.smul_with_zeroGoals accomplished! 🐙Function.Surjective.smulWithZero variable (Function.Surjective.smulWithZero: {R : Type u_1} → {M : Type u_2} → {M' : Type u_3} → [inst : Zero R] → [inst_1 : Zero M] → [inst_2 : SMulWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M M') → Function.Surjective ↑f → (∀ (a : R) (b : M), ↑f (a • b) = a • ↑f b) → SMulWithZero R M'M) /-- Compose a `SMulWithZero` with a `ZeroHom`, with action `f r' • m` -/ defM: ?m.11662SMulWithZero.compHom (SMulWithZero.compHom: {R : Type u_1} → {R' : Type u_2} → (M : Type u_3) → [inst : Zero R] → [inst_1 : Zero M] → [inst_2 : SMulWithZero R M] → [inst_3 : Zero R'] → ZeroHom R' R → SMulWithZero R' Mf : ZeroHomf: ZeroHom R' RR'R': Type ?u.11668R) : SMulWithZeroR: Type ?u.11665R'R': Type ?u.11668M where smul :=M: Type ?u.11671(· • ·) ∘(· • ·): R → M → Mf smul_zerof: ZeroHom R' Rm := smul_zero (m: ?m.12705ff: ZeroHom R' Rm) zero_smulm: ?m.12705m :=m: ?m.13667Goals accomplished! 🐙#align smul_with_zero.comp_homGoals accomplished! 🐙SMulWithZero.compHom end Zero instanceSMulWithZero.compHom: {R : Type u_1} → {R' : Type u_2} → (M : Type u_3) → [inst : Zero R] → [inst_1 : Zero M] → [inst_2 : SMulWithZero R M] → [inst_3 : Zero R'] → ZeroHom R' R → SMulWithZero R' MAddMonoid.natSMulWithZero [AddMonoidAddMonoid.natSMulWithZero: {M : Type u_1} → [inst : AddMonoid M] → SMulWithZero ℕ MM] : SMulWithZeroM: Type ?u.15199ℕℕ: TypeM where smul_zero := _root_.nsmul_zero zero_smul := zero_nsmul #align add_monoid.nat_smul_with_zeroM: Type ?u.15199AddMonoid.natSMulWithZero instanceAddMonoid.natSMulWithZero: {M : Type u_1} → [inst : AddMonoid M] → SMulWithZero ℕ MAddGroup.intSMulWithZero [AddGroupAddGroup.intSMulWithZero: {M : Type u_1} → [inst : AddGroup M] → SMulWithZero ℤ MM] : SMulWithZeroM: Type ?u.16497ℤℤ: TypeM where smul_zero :=M: Type ?u.16497zsmul_zero zero_smul :=zsmul_zero: ∀ {α : Type ?u.17577} [inst : SubtractionMonoid α] (n : ℤ), n • 0 = 0zero_zsmul #align add_group.int_smul_with_zerozero_zsmul: ∀ {G : Type ?u.17673} [inst : SubNegMonoid G] (a : G), 0 • a = 0AddGroup.intSMulWithZero section MonoidWithZero variable [MonoidWithZeroAddGroup.intSMulWithZero: {M : Type u_1} → [inst : AddGroup M] → SMulWithZero ℤ MR] [MonoidWithZeroR: Type ?u.17760R'] [ZeroR': Type ?u.17763M] variable (M: Type ?u.17766RR: ?m.17802M) /-- An action of a monoid with zero `R` on a Type `M`, also with `0`, extends `MulAction` and is compatible with `0` (both in `R` and in `M`), with `1 ∈ R`, and with associativity of multiplication on the monoid `M`. -/ classM: ?m.17805MulActionWithZero extends MulActionMulActionWithZero: (R : Type u_1) → (M : Type u_2) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (maxu_1u_2)RR: Type ?u.17808M where -- these fields are copied from `SMulWithZero`, as `extends` behaves poorly /-- Scalar multiplication by any element send `0` to `0`. -/M: Type ?u.17814smul_zero : ∀smul_zero: ∀ {R : Type u_1} {M : Type u_2} [inst : MonoidWithZero R] [inst_1 : Zero M] [self : MulActionWithZero R M] (r : R), r • 0 = 0r :r: RR,R: Type ?u.17808r • (r: R0 :0: ?m.17871M) =M: Type ?u.178140 /-- Scalar multiplication by the scalar `0` is `0`. -/0: ?m.17924zero_smul : ∀zero_smul: ∀ {R : Type u_1} {M : Type u_2} [inst : MonoidWithZero R] [inst_1 : Zero M] [self : MulActionWithZero R M] (m : M), 0 • m = 0m :m: MM, (M: Type ?u.178140 :0: ?m.17956R) •R: Type ?u.17808m =m: M0 #align mul_action_with_zero0: ?m.18028MulActionWithZero -- see Note [lower instance priority] instance (priority := 100)MulActionWithZero: (R : Type u_1) → (M : Type u_2) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (maxu_1u_2)MulActionWithZero.toSMulWithZero [MulActionWithZero.toSMulWithZero: (R : Type u_1) → (M : Type u_2) → [inst : MonoidWithZero R] → [inst_1 : Zero M] → [m : MulActionWithZero R M] → SMulWithZero R Mm :m: MulActionWithZero R MMulActionWithZeroMulActionWithZero: (R : Type ?u.18124) → (M : Type ?u.18123) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.18124?u.18123)RR: Type ?u.18102M] : SMulWithZeroM: Type ?u.18108RR: Type ?u.18102M := {M: Type ?u.18108m with } #align mul_action_with_zero.to_smul_with_zerom: MulActionWithZero R MMulActionWithZero.toSMulWithZero /-- See also `Semiring.toModule` -/ instanceMulActionWithZero.toSMulWithZero: (R : Type u_1) → (M : Type u_2) → [inst : MonoidWithZero R] → [inst_1 : Zero M] → [m : MulActionWithZero R M] → SMulWithZero R MMonoidWithZero.toMulActionWithZero :MonoidWithZero.toMulActionWithZero: (R : Type u_1) → [inst : MonoidWithZero R] → MulActionWithZero R RMulActionWithZeroMulActionWithZero: (R : Type ?u.18457) → (M : Type ?u.18456) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.18457?u.18456)RR: Type ?u.18435R :=R: Type ?u.18435{{ MulZeroClass.toSMulWithZero R, Monoid.toMulAction R with }: MulActionWithZero ?m.18650 ?m.18651MulZeroClass.toSMulWithZeroMulZeroClass.toSMulWithZero: (R : Type ?u.18514) → [inst : MulZeroClass R] → SMulWithZero R R{ MulZeroClass.toSMulWithZero R, Monoid.toMulAction R with }: MulActionWithZero ?m.18650 ?m.18651RR: Type ?u.18435, Monoid.toMulAction{ MulZeroClass.toSMulWithZero R, Monoid.toMulAction R with }: MulActionWithZero ?m.18650 ?m.18651{ MulZeroClass.toSMulWithZero R, Monoid.toMulAction R with }: MulActionWithZero ?m.18650 ?m.18651RR: Type ?u.18435{ MulZeroClass.toSMulWithZero R, Monoid.toMulAction R with }: MulActionWithZero ?m.18650 ?m.18651with{ MulZeroClass.toSMulWithZero R, Monoid.toMulAction R with }: MulActionWithZero ?m.18650 ?m.18651} #align monoid_with_zero.to_mul_action_with_zero{ MulZeroClass.toSMulWithZero R, Monoid.toMulAction R with }: MulActionWithZero ?m.18650 ?m.18651MonoidWithZero.toMulActionWithZero /-- Like `MonoidWithZero.toMulActionWithZero`, but multiplies on the right. See also `Semiring.toOppositeModule` -/ instanceMonoidWithZero.toMulActionWithZero: (R : Type u_1) → [inst : MonoidWithZero R] → MulActionWithZero R RMonoidWithZero.toOppositeMulActionWithZero :MonoidWithZero.toOppositeMulActionWithZero: MulActionWithZero Rᵐᵒᵖ RMulActionWithZeroMulActionWithZero: (R : Type ?u.18873) → (M : Type ?u.18872) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.18873?u.18872)RᵐᵒᵖR: Type ?u.18851R :=R: Type ?u.18851{{ MulZeroClass.toOppositeSMulWithZero R, Monoid.toOppositeMulAction R with }: MulActionWithZero ?m.19075 ?m.19076MulZeroClass.toOppositeSMulWithZeroMulZeroClass.toOppositeSMulWithZero: (R : Type ?u.18939) → [inst : MulZeroClass R] → SMulWithZero Rᵐᵒᵖ R{ MulZeroClass.toOppositeSMulWithZero R, Monoid.toOppositeMulAction R with }: MulActionWithZero ?m.19075 ?m.19076RR: Type ?u.18851, Monoid.toOppositeMulAction{ MulZeroClass.toOppositeSMulWithZero R, Monoid.toOppositeMulAction R with }: MulActionWithZero ?m.19075 ?m.19076{ MulZeroClass.toOppositeSMulWithZero R, Monoid.toOppositeMulAction R with }: MulActionWithZero ?m.19075 ?m.19076RR: Type ?u.18851{ MulZeroClass.toOppositeSMulWithZero R, Monoid.toOppositeMulAction R with }: MulActionWithZero ?m.19075 ?m.19076with{ MulZeroClass.toOppositeSMulWithZero R, Monoid.toOppositeMulAction R with }: MulActionWithZero ?m.19075 ?m.19076} #align monoid_with_zero.to_opposite_mul_action_with_zero{ MulZeroClass.toOppositeSMulWithZero R, Monoid.toOppositeMulAction R with }: MulActionWithZero ?m.19075 ?m.19076MonoidWithZero.toOppositeMulActionWithZero protected lemmaMonoidWithZero.toOppositeMulActionWithZero: (R : Type u_1) → [inst : MonoidWithZero R] → MulActionWithZero Rᵐᵒᵖ RMulActionWithZero.subsingleton [MulActionWithZero.subsingleton: ∀ (R : Type u_1) (M : Type u_2) [inst : MonoidWithZero R] [inst_1 : Zero M] [inst : MulActionWithZero R M] [inst : Subsingleton R], Subsingleton MMulActionWithZeroMulActionWithZero: (R : Type ?u.19389) → (M : Type ?u.19388) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.19389?u.19388)RR: Type ?u.19367M] [SubsingletonM: Type ?u.19373R] : SubsingletonR: Type ?u.19367M := ⟨λM: Type ?u.19373xx: ?m.19428y =>y: ?m.19431Goals accomplished! 🐙R: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: Mx = yR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: Mx = yR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: MR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: Mx = yR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: MR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: Mx = yR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: MR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: Mx = yR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: MR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: Mx = yR: Type u_1
R': Type ?u.19370
M: Type u_2
M': Type ?u.19376
inst✝⁴: MonoidWithZero R
inst✝³: MonoidWithZero R'
inst✝²: Zero M
inst✝¹: MulActionWithZero R M
inst✝: Subsingleton R
x, y: M0 = 0⟩ #align mul_action_with_zero.subsingletonGoals accomplished! 🐙MulActionWithZero.subsingleton protected lemmaMulActionWithZero.subsingleton: ∀ (R : Type u_1) (M : Type u_2) [inst : MonoidWithZero R] [inst_1 : Zero M] [inst : MulActionWithZero R M] [inst : Subsingleton R], Subsingleton MMulActionWithZero.nontrivial [MulActionWithZero.nontrivial: ∀ [inst : MulActionWithZero R M] [inst : Nontrivial M], Nontrivial RMulActionWithZeroMulActionWithZero: (R : Type ?u.20049) → (M : Type ?u.20048) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.20049?u.20048)RR: Type ?u.20027M] [NontrivialM: Type ?u.20033M] : NontrivialM: Type ?u.20033R := (R: Type ?u.20027subsingleton_or_nontrivialsubsingleton_or_nontrivial: ∀ (α : Type ?u.20082), Subsingleton α ∨ Nontrivial αR).resolve_left funR: Type ?u.20027_ =>_: ?m.20092not_subsingletonnot_subsingleton: ∀ (α : Type ?u.20094) [inst : Nontrivial α], ¬Subsingleton αM <|M: Type ?u.20033MulActionWithZero.subsingletonMulActionWithZero.subsingleton: ∀ (R : Type ?u.20101) (M : Type ?u.20102) [inst : MonoidWithZero R] [inst_1 : Zero M] [inst : MulActionWithZero R M] [inst : Subsingleton R], Subsingleton MRR: Type ?u.20027M #align mul_action_with_zero.nontrivialM: Type ?u.20033MulActionWithZero.nontrivial variable {MulActionWithZero.nontrivial: ∀ (R : Type u_1) (M : Type u_2) [inst : MonoidWithZero R] [inst_1 : Zero M] [inst : MulActionWithZero R M] [inst : Nontrivial M], Nontrivial RRR: ?m.20169M} variable [M: ?m.20172MulActionWithZeroMulActionWithZero: (R : Type ?u.28939) → (M : Type ?u.28938) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.28939?u.28938)RR: Type ?u.20230M] [ZeroM: Type ?u.20181M'] [SMulM': Type ?u.20239RR: Type ?u.20230M'] /-- Pullback a `MulActionWithZero` structure along an injective zero-preserving homomorphism. See note [reducible non-instances]. -/ @[reducible] protected defM': Type ?u.24580Function.Injective.mulActionWithZero (Function.Injective.mulActionWithZero: {R : Type u_1} → {M : Type u_2} → {M' : Type u_3} → [inst : MonoidWithZero R] → [inst_1 : Zero M] → [inst_2 : MulActionWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M' M) → Injective ↑f → (∀ (a : R) (b : M'), ↑f (a • b) = a • ↑f b) → MulActionWithZero R M'f : ZeroHomf: ZeroHom M' MM'M': Type ?u.20239M) (M: Type ?u.20236hf : Function.Injectivehf: Injective ↑ff) (smul : ∀ (f: ZeroHom M' Ma :a: RR) (R: Type ?u.20230b),b: ?m.21118f (f: ZeroHom M' Ma •a: Rb) =b: ?m.21118a •a: Rff: ZeroHom M' Mb) :b: ?m.21118MulActionWithZeroMulActionWithZero: (R : Type ?u.22988) → (M : Type ?u.22987) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.22988?u.22987)RR: Type ?u.20230M' :=M': Type ?u.20239{{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249hfhf: Injective ↑f.mulAction{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249ff: ZeroHom M' Msmul{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249,{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249hfhf: Injective ↑f.smulWithZero{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249ff: ZeroHom M' Msmul{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249with{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249} #align function.injective.mul_action_with_zero{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.24248 ?m.24249Function.Injective.mulActionWithZero /-- Pushforward a `MulActionWithZero` structure along a surjective zero-preserving homomorphism. See note [reducible non-instances]. -/ @[reducible] protected defFunction.Injective.mulActionWithZero: {R : Type u_1} → {M : Type u_2} → {M' : Type u_3} → [inst : MonoidWithZero R] → [inst_1 : Zero M] → [inst_2 : MulActionWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M' M) → Function.Injective ↑f → (∀ (a : R) (b : M'), ↑f (a • b) = a • ↑f b) → MulActionWithZero R M'Function.Surjective.mulActionWithZero (Function.Surjective.mulActionWithZero: {R : Type u_1} → {M : Type u_2} → {M' : Type u_3} → [inst : MonoidWithZero R] → [inst_1 : Zero M] → [inst_2 : MulActionWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M M') → Surjective ↑f → (∀ (a : R) (b : M), ↑f (a • b) = a • ↑f b) → MulActionWithZero R M'f : ZeroHomf: ZeroHom M M'MM: Type ?u.24577M') (M': Type ?u.24580hf : Function.Surjectivehf: Surjective ↑ff) (smul : ∀ (f: ZeroHom M M'a :a: RR) (R: Type ?u.24571b),b: ?m.25465f (f: ZeroHom M M'a •a: Rb) =b: ?m.25465a •a: Rff: ZeroHom M M'b) :b: ?m.25465MulActionWithZeroMulActionWithZero: (R : Type ?u.27329) → (M : Type ?u.27328) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.27329?u.27328)RR: Type ?u.24571M' :=M': Type ?u.24580{{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592hfhf: Surjective ↑f.mulAction{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592ff: ZeroHom M M'smul{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592,{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592hfhf: Surjective ↑f.{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592smulWithZerosmulWithZero: {R : Type ?u.28327} → {M : Type ?u.28326} → {M' : Type ?u.28325} → [inst : Zero R] → [inst_1 : Zero M] → [inst_2 : SMulWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M M') → Surjective ↑f → (∀ (a : R) (b : M), ↑f (a • b) = a • ↑f b) → SMulWithZero R M'{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592ff: ZeroHom M M'smul{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592with{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592} #align function.surjective.mul_action_with_zero{ hf.mulAction f smul, hf.smulWithZero f smul with }: MulActionWithZero ?m.28591 ?m.28592Function.Surjective.mulActionWithZero variable (Function.Surjective.mulActionWithZero: {R : Type u_1} → {M : Type u_2} → {M' : Type u_3} → [inst : MonoidWithZero R] → [inst_1 : Zero M] → [inst_2 : MulActionWithZero R M] → [inst_3 : Zero M'] → [inst_4 : SMul R M'] → (f : ZeroHom M M') → Function.Surjective ↑f → (∀ (a : R) (b : M), ↑f (a • b) = a • ↑f b) → MulActionWithZero R M'M) /-- Compose a `MulActionWithZero` with a `MonoidWithZeroHom`, with action `f r' • m` -/ defM: ?m.28972MulActionWithZero.compHom (MulActionWithZero.compHom: {R : Type u_1} → {R' : Type u_2} → (M : Type u_3) → [inst : MonoidWithZero R] → [inst_1 : MonoidWithZero R'] → [inst_2 : Zero M] → [inst_3 : MulActionWithZero R M] → (R' →*₀ R) → MulActionWithZero R' Mf :f: R' →*₀ RR' →*₀R': Type ?u.28978R) :R: Type ?u.28975MulActionWithZeroMulActionWithZero: (R : Type ?u.29137) → (M : Type ?u.29136) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.29137?u.29136)R'R': Type ?u.28978M := {M: Type ?u.28981SMulWithZero.compHomSMulWithZero.compHom: {R : Type ?u.29165} → {R' : Type ?u.29164} → (M : Type ?u.29163) → [inst : Zero R] → [inst_1 : Zero M] → [inst_2 : SMulWithZero R M] → [inst_3 : Zero R'] → ZeroHom R' R → SMulWithZero R' MMM: Type ?u.28981f.f: R' →*₀ RtoZeroHom with smul :=toZeroHom: {M : Type ?u.29246} → {N : Type ?u.29245} → [inst : MulZeroOneClass M] → [inst_1 : MulZeroOneClass N] → (M →*₀ N) → ZeroHom M N(· • ·) ∘(· • ·): R → M → Mf mul_smul := funf: R' →*₀ Rrr: ?m.30028ss: ?m.30031m =>m: ?m.30034Goals accomplished! 🐙R: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
r, s: R'
m: MR: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
r, s: R'
m: MR: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
r, s: R'
m: MR: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
r, s: R'
m: Mone_smul := funGoals accomplished! 🐙m =>m: ?m.30018Goals accomplished! 🐙R: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
m: MR: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
m: MR: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
m: MR: Type ?u.28975
R': Type ?u.28978
M: Type ?u.28981
M': Type ?u.28984
inst✝⁵: MonoidWithZero R
inst✝⁴: MonoidWithZero R'
inst✝³: Zero M
inst✝²: MulActionWithZero R M
inst✝¹: Zero M'
inst✝: SMul R M'
f: R' →*₀ R
src✝:= SMulWithZero.compHom M ↑f: SMulWithZero R' M
m: M} #align mul_action_with_zero.comp_homGoals accomplished! 🐙MulActionWithZero.compHom end MonoidWithZero section GroupWithZero variable {MulActionWithZero.compHom: {R : Type u_1} → {R' : Type u_2} → (M : Type u_3) → [inst : MonoidWithZero R] → [inst_1 : MonoidWithZero R'] → [inst_2 : Zero M] → [inst_3 : MulActionWithZero R M] → (R' →*₀ R) → MulActionWithZero R' Mαα: Type ?u.35573β :β: Type ?u.35576Type _} [GroupWithZeroType _: Type (?u.35576+1)α] [GroupWithZeroα: Type ?u.35708β] [β: Type ?u.35576MulActionWithZeroMulActionWithZero: (R : Type ?u.35586) → (M : Type ?u.35585) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.35586?u.35585)αα: Type ?u.35708β] theoremβ: Type ?u.35576smul_inv₀ [SMulCommClasssmul_inv₀: ∀ {α : Type u_1} {β : Type u_2} [inst : GroupWithZero α] [inst_1 : GroupWithZero β] [inst_2 : MulActionWithZero α β] [inst_3 : SMulCommClass α β β] [inst_4 : IsScalarTower α β β] (c : α) (x : β), (c • x)⁻¹ = c⁻¹ • x⁻¹αα: Type ?u.35708ββ: Type ?u.35711β] [IsScalarTowerβ: Type ?u.35711αα: Type ?u.35708ββ: Type ?u.35711β] (β: Type ?u.35711c :c: αα) (α: Type ?u.35708x :x: ββ) : (β: Type ?u.35711c •c: αx)⁻¹ =x: βc⁻¹ •c: αx⁻¹ :=x: βGoals accomplished! 🐙R: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: βR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
x: β
inlR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: βR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
x: β
inlR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
x: β
inlR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
inrGoals accomplished! 🐙R: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: βR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
hc: c ≠ 0
inr.inlR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: βR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
hc: c ≠ 0
inr.inlR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
hc: c ≠ 0
inr.inlR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrGoals accomplished! 🐙R: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: βR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inrR: Type ?u.35696
R': Type ?u.35699
M: Type ?u.35702
M': Type ?u.35705
α: Type u_1
β: Type u_2
inst✝⁴: GroupWithZero α
inst✝³: GroupWithZero β
inst✝²: MulActionWithZero α β
inst✝¹: SMulCommClass α β β
inst✝: IsScalarTower α β β
c: α
x: β
hc: c ≠ 0
hx: x ≠ 0
inr.inr1 = 1#align smul_inv₀Goals accomplished! 🐙smul_inv₀ end GroupWithZero /-- Scalar multiplication as a monoid homomorphism with zero. -/ @[smul_inv₀: ∀ {α : Type u_1} {β : Type u_2} [inst : GroupWithZero α] [inst_1 : GroupWithZero β] [inst_2 : MulActionWithZero α β] [inst_3 : SMulCommClass α β β] [inst_4 : IsScalarTower α β β] (c : α) (x : β), (c • x)⁻¹ = c⁻¹ • x⁻¹simps] defsimps: ∀ {α : Type u_1} {β : Type u_2} [inst : MonoidWithZero α] [inst_1 : MulZeroOneClass β] [inst_2 : MulActionWithZero α β] [inst_3 : IsScalarTower α β β] [inst_4 : SMulCommClass α β β] (a : α × β), ↑smulMonoidWithZeroHom a = OneHom.toFun (↑smulMonoidHom) asmulMonoidWithZeroHom {smulMonoidWithZeroHom: {α : Type ?u.38470} → {β : Type ?u.38473} → [inst : MonoidWithZero α] → [inst_1 : MulZeroOneClass β] → [inst_2 : MulActionWithZero α β] → [inst_3 : IsScalarTower α β β] → [inst_4 : SMulCommClass α β β] → α × β →*₀ βαα: Type ?u.38470β :β: Type ?u.38473Type _} [MonoidWithZeroType _: Type (?u.38473+1)α] [MulZeroOneClassα: Type ?u.38470β] [β: Type ?u.38473MulActionWithZeroMulActionWithZero: (R : Type ?u.38483) → (M : Type ?u.38482) → [inst : MonoidWithZero R] → [inst : Zero M] → Type (max?u.38483?u.38482)αα: Type ?u.38470β] [IsScalarTowerβ: Type ?u.38473αα: Type ?u.38470ββ: Type ?u.38473β] [SMulCommClassβ: Type ?u.38473αα: Type ?u.38470ββ: Type ?u.38473β] :β: Type ?u.38473α ×α: Type ?u.38470β →*₀β: Type ?u.38473β := {β: Type ?u.38473smulMonoidHom with map_zero' := smul_zerosmulMonoidHom: {α : Type ?u.39360} → {β : Type ?u.39359} → [inst : Monoid α] → [inst_1 : MulOneClass β] → [inst_2 : MulAction α β] → [inst_3 : IsScalarTower α β β] → [inst_4 : SMulCommClass α β β] → α × β →* β_ } #align smul_monoid_with_zero_hom_: ?m.40678smulMonoidWithZeroHom #align smul_monoid_with_zero_hom_applysmulMonoidWithZeroHom: {α : Type u_1} → {β : Type u_2} → [inst : MonoidWithZero α] → [inst_1 : MulZeroOneClass β] → [inst_2 : MulActionWithZero α β] → [inst_3 : IsScalarTower α β β] → [inst_4 : SMulCommClass α β β] → α × β →*₀ βsmulMonoidWithZeroHom_applysmulMonoidWithZeroHom_apply: ∀ {α : Type u_1} {β : Type u_2} [inst : MonoidWithZero α] [inst_1 : MulZeroOneClass β] [inst_2 : MulActionWithZero α β] [inst_3 : IsScalarTower α β β] [inst_4 : SMulCommClass α β β] (a : α × β), ↑smulMonoidWithZeroHom a = OneHom.toFun (↑smulMonoidHom) a