/- Copyright (c) 2019 Amelia Livingston. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Amelia Livingston, Jireh Loreaux Ported by: Winston Yin ! This file was ported from Lean 3 source module algebra.hom.ring ! leanprover-community/mathlib commit cf9386b56953fb40904843af98b7a80757bbe7f9 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Algebra.GroupWithZero.InjSurj import Mathlib.Algebra.Ring.Basic import Mathlib.Algebra.Divisibility.Basic import Mathlib.Data.Pi.Algebra import Mathlib.Algebra.Hom.Units import Mathlib.Data.Set.Image /-! # Homomorphisms of semirings and rings This file defines bundled homomorphisms of (non-unital) semirings and rings. As with monoid and groups, we use the same structure `RingHom a β`, a.k.a. `α →+* β`, for both types of homomorphisms. ## Main definitions * `NonUnitalRingHom`: Non-unital (semi)ring homomorphisms. Additive monoid homomorphism which preserve multiplication. * `RingHom`: (Semi)ring homomorphisms. Monoid homomorphisms which are also additive monoid homomorphism. ## Notations * `→ₙ+*`: Non-unital (semi)ring homs * `→+*`: (Semi)ring homs ## Implementation notes * There's a coercion from bundled homs to fun, and the canonical notation is to use the bundled hom as a function via this coercion. * There is no `SemiringHom` -- the idea is that `RingHom` is used. The constructor for a `RingHom` between semirings needs a proof of `map_zero`, `map_one` and `map_add` as well as `map_mul`; a separate constructor `RingHom.mk'` will construct ring homs between rings from monoid homs given only a proof that addition is preserved. ## Tags `RingHom`, `SemiringHom` -/ open Function variable {FF: Type ?u.52022αα: Type ?u.5ββ: Type ?u.52028γ :γ: Type ?u.11Type _} /-- Bundled non-unital semiring homomorphisms `α →ₙ+* β`; use this for bundled non-unital ring homomorphisms too. When possible, instead of parametrizing results over `(f : α →ₙ+* β)`, you should parametrize over `(F : Type _) [NonUnitalRingHomClass F α β] (f : F)`. When you extend this structure, make sure to extend `NonUnitalRingHomClass`. -/ structureType _: Type (?u.19512+1)NonUnitalRingHom (NonUnitalRingHom: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (toMulHom : α →ₙ* β) → MulHom.toFun toMulHom 0 = 0 → (∀ (x y : α), MulHom.toFun toMulHom (x + y) = MulHom.toFun toMulHom x + MulHom.toFun toMulHom y) → NonUnitalRingHom α βαα: Type ?u.26β :β: Type ?u.29Type _) [NonUnitalNonAssocSemiringType _: Type (?u.26+1)α] [NonUnitalNonAssocSemiringα: Type ?u.26β] extendsβ: Type ?u.29α →ₙ*α: Type ?u.26β,β: Type ?u.29α →+α: Type ?u.26β #align non_unital_ring_homβ: Type ?u.29NonUnitalRingHom /-- `α →ₙ+* β` denotes the type of non-unital ring homomorphisms from `α` to `β`. -/ infixr:25 " →ₙ+* " =>NonUnitalRingHom: (α : Type u_1) → (β : Type u_2) → [inst : NonUnitalNonAssocSemiring α] → [inst : NonUnitalNonAssocSemiring β] → Type (maxu_1u_2)NonUnitalRingHom /-- Reinterpret a non-unital ring homomorphism `f : α →ₙ+* β` as a semigroup homomorphism `α →ₙ* β`. The `simp`-normal form is `(f : α →ₙ* β)`. -/ add_decl_docNonUnitalRingHom: (α : Type u_1) → (β : Type u_2) → [inst : NonUnitalNonAssocSemiring α] → [inst : NonUnitalNonAssocSemiring β] → Type (maxu_1u_2)NonUnitalRingHom.toMulHom #align non_unital_ring_hom.to_mul_homNonUnitalRingHom.toMulHom: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →ₙ* βNonUnitalRingHom.toMulHom /-- Reinterpret a non-unital ring homomorphism `f : α →ₙ+* β` as an additive monoid homomorphism `α →+ β`. The `simp`-normal form is `(f : α →+ β)`. -/ add_decl_docNonUnitalRingHom.toMulHom: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →ₙ* βNonUnitalRingHom.toAddMonoidHom #align non_unital_ring_hom.to_add_monoid_homNonUnitalRingHom.toAddMonoidHom: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →+ βNonUnitalRingHom.toAddMonoidHom section NonUnitalRingHomClass /-- `NonUnitalRingHomClass F α β` states that `F` is a type of non-unital (semi)ring homomorphisms. You should extend this class when you extend `NonUnitalRingHom`. -/ classNonUnitalRingHom.toAddMonoidHom: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →+ βNonUnitalRingHomClass (NonUnitalRingHomClass: {F : Type u_1} → {α : outParam (Type u_2)} → {β : outParam (Type u_3)} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [toMulHomClass : MulHomClass F α β] → (∀ (f : F) (x y : α), ↑f (x + y) = ↑f x + ↑f y) → (∀ (f : F), ↑f 0 = 0) → NonUnitalRingHomClass F α βF :F: Type ?u.9159Type _) (α β : outParam (Type _: Type (?u.9159+1)Type _)) [NonUnitalNonAssocSemiring α] [NonUnitalNonAssocSemiring β] extends MulHomClassType _: Type (?u.9163+1)F α β,F: Type ?u.9159AddMonoidHomClassAddMonoidHomClass: Type ?u.9291 → (M : outParam (Type ?u.9290)) → (N : outParam (Type ?u.9289)) → [inst : AddZeroClass M] → [inst : AddZeroClass N] → Type (max(max?u.9291?u.9290)?u.9289)F α β #align non_unital_ring_hom_classF: Type ?u.9159NonUnitalRingHomClass variable [NonUnitalNonAssocSemiringNonUnitalRingHomClass: Type u_1 → (α : outParam (Type u_2)) → (β : outParam (Type u_3)) → [inst : NonUnitalNonAssocSemiring α] → [inst : NonUnitalNonAssocSemiring β] → Type (max(maxu_1u_2)u_3)α] [NonUnitalNonAssocSemiringα: Type ?u.9913β] [β: Type ?u.9879NonUnitalRingHomClassNonUnitalRingHomClass: Type ?u.9893 → (α : outParam (Type ?u.9892)) → (β : outParam (Type ?u.9891)) → [inst : NonUnitalNonAssocSemiring α] → [inst : NonUnitalNonAssocSemiring β] → Type (max(max?u.9893?u.9892)?u.9891)FF: Type ?u.9873αα: Type ?u.11282β] /-- Turn an element of a type `F` satisfying `NonUnitalRingHomClass F α β` into an actual `NonUnitalRingHom`. This is declared as the default coercion from `F` to `α →ₙ+* β`. -/ @[coe] defβ: Type ?u.11285NonUnitalRingHomClass.toNonUnitalRingHom (NonUnitalRingHomClass.toNonUnitalRingHom: {F : Type u_1} → {α : Type u_2} → {β : Type u_3} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalRingHomClass F α β] → F → α →ₙ+* βf :f: FF) :F: Type ?u.9910α →ₙ+*α: Type ?u.9913β :=β: Type ?u.9916{ ({ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673ff: F:{ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673αα: Type ?u.9913→ₙ*{ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673ββ: Type ?u.9916), ({ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673ff: F:{ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673αα: Type ?u.9913→+{ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673ββ: Type ?u.9916){ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673with{ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673} /-- Any type satisfying `NonUnitalRingHomClass` can be cast into `NonUnitalRingHom` via `NonUnitalRingHomClass.toNonUnitalRingHom`. -/{ (f : α →ₙ* β), (f : α →+ β) with }: ?m.10672 →ₙ+* ?m.10673instance : CoeTCinstance: {F : Type u_1} → {α : Type u_2} → {β : Type u_3} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalRingHomClass F α β] → CoeTC F (α →ₙ+* β)F (F: Type ?u.11279α →ₙ+*α: Type ?u.11282β) := ⟨β: Type ?u.11285NonUnitalRingHomClass.toNonUnitalRingHom⟩ end NonUnitalRingHomClass namespace NonUnitalRingHom section coe variable [NonUnitalNonAssocSemiringNonUnitalRingHomClass.toNonUnitalRingHom: {F : Type ?u.11346} → {α : Type ?u.11345} → {β : Type ?u.11344} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalRingHomClass F α β] → F → α →ₙ+* βα] [NonUnitalNonAssocSemiringα: Type ?u.11507β]β: Type ?u.13939instance :instance: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → NonUnitalRingHomClass (α →ₙ+* β) α βNonUnitalRingHomClass (NonUnitalRingHomClass: Type ?u.11524 → (α : outParam (Type ?u.11523)) → (β : outParam (Type ?u.11522)) → [inst : NonUnitalNonAssocSemiring α] → [inst : NonUnitalNonAssocSemiring β] → Type (max(max?u.11524?u.11523)?u.11522)α →ₙ+*α: Type ?u.11507β)β: Type ?u.11510αα: Type ?u.11507β where coeβ: Type ?u.11510f :=f: ?m.11680f.toFun coe_injective'f: ?m.11680ff: ?m.11709gg: ?m.11712h :=h: ?m.11715Goals accomplished! 🐙F: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
f, g: α →ₙ+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
g: α →ₙ+* β
toMulHom✝: α →ₙ* β
map_zero'✝: MulHom.toFun toMulHom✝ 0 = 0
map_add'✝: ∀ (x y : α), MulHom.toFun toMulHom✝ (x + y) = MulHom.toFun toMulHom✝ x + MulHom.toFun toMulHom✝ y
h: (fun f => f.toFun) { toMulHom := toMulHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ } = (fun f => f.toFun) g
mk{ toMulHom := toMulHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ } = gF: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
f, g: α →ₙ+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
toMulHom✝¹: α →ₙ* β
map_zero'✝¹: MulHom.toFun toMulHom✝¹ 0 = 0
map_add'✝¹: ∀ (x y : α), MulHom.toFun toMulHom✝¹ (x + y) = MulHom.toFun toMulHom✝¹ x + MulHom.toFun toMulHom✝¹ y
toMulHom✝: α →ₙ* β
map_zero'✝: MulHom.toFun toMulHom✝ 0 = 0
map_add'✝: ∀ (x y : α), MulHom.toFun toMulHom✝ (x + y) = MulHom.toFun toMulHom✝ x + MulHom.toFun toMulHom✝ y
h: (fun f => f.toFun) { toMulHom := toMulHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = (fun f => f.toFun) { toMulHom := toMulHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }
mk.mk{ toMulHom := toMulHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = { toMulHom := toMulHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }F: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
f, g: α →ₙ+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
toMulHom✝¹: α →ₙ* β
map_zero'✝¹: MulHom.toFun toMulHom✝¹ 0 = 0
map_add'✝¹: ∀ (x y : α), MulHom.toFun toMulHom✝¹ (x + y) = MulHom.toFun toMulHom✝¹ x + MulHom.toFun toMulHom✝¹ y
toMulHom✝: α →ₙ* β
map_zero'✝: MulHom.toFun toMulHom✝ 0 = 0
map_add'✝: ∀ (x y : α), MulHom.toFun toMulHom✝ (x + y) = MulHom.toFun toMulHom✝ x + MulHom.toFun toMulHom✝ y
h: (fun f => f.toFun) { toMulHom := toMulHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = (fun f => f.toFun) { toMulHom := toMulHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }
mk.mk.e_toMulHomtoMulHom✝¹ = toMulHom✝F: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
f, g: α →ₙ+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
toMulHom✝¹: α →ₙ* β
map_zero'✝¹: MulHom.toFun toMulHom✝¹ 0 = 0
map_add'✝¹: ∀ (x y : α), MulHom.toFun toMulHom✝¹ (x + y) = MulHom.toFun toMulHom✝¹ x + MulHom.toFun toMulHom✝¹ y
toMulHom✝: α →ₙ* β
map_zero'✝: MulHom.toFun toMulHom✝ 0 = 0
map_add'✝: ∀ (x y : α), MulHom.toFun toMulHom✝ (x + y) = MulHom.toFun toMulHom✝ x + MulHom.toFun toMulHom✝ y
h: (fun f => f.toFun) { toMulHom := toMulHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = (fun f => f.toFun) { toMulHom := toMulHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }
mk.mk.e_toMulHom.a↑toMulHom✝¹ = ↑toMulHom✝F: Type ?u.11504
α: Type ?u.11507
β: Type ?u.11510
γ: Type ?u.11513
inst✝¹: NonUnitalNonAssocSemiring α
inst✝: NonUnitalNonAssocSemiring β
f, g: α →ₙ+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gmap_add :=Goals accomplished! 🐙NonUnitalRingHom.map_add' map_zero :=NonUnitalRingHom.map_add': ∀ {α : Type ?u.11764} {β : Type ?u.11763} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (self : α →ₙ+* β) (x y : α), MulHom.toFun self.toMulHom (x + y) = MulHom.toFun self.toMulHom x + MulHom.toFun self.toMulHom yNonUnitalRingHom.map_zero' map_mulNonUnitalRingHom.map_zero': ∀ {α : Type ?u.11797} {β : Type ?u.11796} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (self : α →ₙ+* β), MulHom.toFun self.toMulHom 0 = 0f :=f: ?m.11728f.f: ?m.11728map_mul' -- Porting note: -- These helper instances are unhelpful in Lean 4, so omitting: -- /-- Helper instance for when there's too many metavariables to apply `fun_like.has_coe_to_fun` -- directly. -/ -- instance : CoeFun (α →ₙ+* β) fun _ => α → β := -- ⟨fun f => f.toFun⟩ -- Porting note: removed due to new `coe` in Lean4 #noalign non_unital_ring_hom.to_fun_eq_coe #noalign non_unital_ring_hom.coe_mk #noalign non_unital_ring_hom.coe_coe initialize_simps_projectionsmap_mul': ∀ {M : Type ?u.11737} {N : Type ?u.11736} [inst : Mul M] [inst_1 : Mul N] (self : M →ₙ* N) (x y : M), MulHom.toFun self (x * y) = MulHom.toFun self x * MulHom.toFun self yNonUnitalRingHom (NonUnitalRingHom: (α : Type u_1) → (β : Type u_2) → [inst : NonUnitalNonAssocSemiring α] → [inst : NonUnitalNonAssocSemiring β] → Type (maxu_1u_2)toFun →toFun: (α : Type u_1) → (β : Type u_2) → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α → βapply) @[simp] theoremapply: (α : Type u_1) → (β : Type u_2) → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α → βcoe_toMulHom (coe_toMulHom: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), ↑f.toMulHom = ↑ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.12679β) : ⇑β: Type ?u.12682f.f: α →ₙ+* βtoMulHom =toMulHom: {α : Type ?u.12714} → {β : Type ?u.12713} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →ₙ* βf := rfl #align non_unital_ring_hom.coe_to_mul_homf: α →ₙ+* βNonUnitalRingHom.coe_toMulHom @[simp] theoremNonUnitalRingHom.coe_toMulHom: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), ↑f.toMulHom = ↑fcoe_mulHom_mk (coe_mulHom_mk: ∀ {α : Type u_2} {β : Type u_1} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α → β) (h₁ : ∀ (x y : α), f (x * y) = f x * f y) (h₂ : MulHom.toFun { toFun := f, map_mul' := h₁ } 0 = 0) (h₃ : ∀ (x y : α), MulHom.toFun { toFun := f, map_mul' := h₁ } (x + y) = MulHom.toFun { toFun := f, map_mul' := h₁ } x + MulHom.toFun { toFun := f, map_mul' := h₁ } y), ↑{ toMulHom := { toFun := f, map_mul' := h₁ }, map_zero' := h₂, map_add' := h₃ } = { toFun := f, map_mul' := h₁ }f :f: α → βα →α: Type ?u.13417β) (h₁β: Type ?u.13420h₂h₂: ?m.13439h₃) : ((⟨⟨h₃: ∀ (x y : α), MulHom.toFun { toFun := f, map_mul' := h₁ } (x + y) = MulHom.toFun { toFun := f, map_mul' := h₁ } x + MulHom.toFun { toFun := f, map_mul' := h₁ } yf,f: α → βh₁⟩,h₁: ?m.13436h₂,h₂: ?m.13439h₃⟩ :h₃: ?m.13442α →ₙ+*α: Type ?u.13417β) :β: Type ?u.13420α →ₙ*α: Type ?u.13417β) = ⟨β: Type ?u.13420f,f: α → βh₁⟩ := rfl #align non_unital_ring_hom.coe_mul_hom_mkh₁: ?m.13436NonUnitalRingHom.coe_mulHom_mk theoremNonUnitalRingHom.coe_mulHom_mk: ∀ {α : Type u_2} {β : Type u_1} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α → β) (h₁ : ∀ (x y : α), f (x * y) = f x * f y) (h₂ : MulHom.toFun { toFun := f, map_mul' := h₁ } 0 = 0) (h₃ : ∀ (x y : α), MulHom.toFun { toFun := f, map_mul' := h₁ } (x + y) = MulHom.toFun { toFun := f, map_mul' := h₁ } x + MulHom.toFun { toFun := f, map_mul' := h₁ } y), ↑{ toMulHom := { toFun := f, map_mul' := h₁ }, map_zero' := h₂, map_add' := h₃ } = { toFun := f, map_mul' := h₁ }coe_toAddMonoidHom (coe_toAddMonoidHom: ∀ (f : α →ₙ+* β), ↑(toAddMonoidHom f) = ↑ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.13936β) : ⇑β: Type ?u.13939f.f: α →ₙ+* βtoAddMonoidHom =toAddMonoidHom: {α : Type ?u.13971} → {β : Type ?u.13970} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →+ βf := rfl #align non_unital_ring_hom.coe_to_add_monoid_homf: α →ₙ+* βNonUnitalRingHom.coe_toAddMonoidHom @[simp] theoremNonUnitalRingHom.coe_toAddMonoidHom: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), ↑(toAddMonoidHom f) = ↑fcoe_addMonoidHom_mk (coe_addMonoidHom_mk: ∀ {α : Type u_2} {β : Type u_1} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α → β) (h₁ : ∀ (x y : α), f (x * y) = f x * f y) (h₂ : MulHom.toFun { toFun := f, map_mul' := h₁ } 0 = 0) (h₃ : ∀ (x y : α), MulHom.toFun { toFun := f, map_mul' := h₁ } (x + y) = MulHom.toFun { toFun := f, map_mul' := h₁ } x + MulHom.toFun { toFun := f, map_mul' := h₁ } y), ↑{ toMulHom := { toFun := f, map_mul' := h₁ }, map_zero' := h₂, map_add' := h₃ } = { toZeroHom := { toFun := f, map_zero' := h₂ }, map_add' := h₃ }f :f: α → βα →α: Type ?u.15045β) (h₁β: Type ?u.15048h₂h₂: ?m.15067h₃) : ((⟨⟨h₃: ?m.15070f,f: α → βh₁⟩,h₁: ?m.15064h₂,h₂: ?m.15067h₃⟩ :h₃: ?m.15070α →ₙ+*α: Type ?u.15045β) :β: Type ?u.15048α →+α: Type ?u.15045β) = ⟨⟨β: Type ?u.15048f,f: α → βh₂⟩,h₂: ?m.15067h₃⟩ := rfl #align non_unital_ring_hom.coe_add_monoid_hom_mkh₃: ?m.15070NonUnitalRingHom.coe_addMonoidHom_mk /-- Copy of a `RingHom` with a new `toFun` equal to the old one. Useful to fix definitional equalities. -/ protected defNonUnitalRingHom.coe_addMonoidHom_mk: ∀ {α : Type u_2} {β : Type u_1} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α → β) (h₁ : ∀ (x y : α), f (x * y) = f x * f y) (h₂ : MulHom.toFun { toFun := f, map_mul' := h₁ } 0 = 0) (h₃ : ∀ (x y : α), MulHom.toFun { toFun := f, map_mul' := h₁ } (x + y) = MulHom.toFun { toFun := f, map_mul' := h₁ } x + MulHom.toFun { toFun := f, map_mul' := h₁ } y), ↑{ toMulHom := { toFun := f, map_mul' := h₁ }, map_zero' := h₂, map_add' := h₃ } = { toZeroHom := { toFun := f, map_zero' := h₂ }, map_add' := h₃ }copy (copy: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (f : α →ₙ+* β) → (f' : α → β) → f' = ↑f → α →ₙ+* βf :f: α →ₙ+* βα →ₙ+*α: Type ?u.16269β) (β: Type ?u.16272f' :f': α → βα →α: Type ?u.16269β) (β: Type ?u.16272h :h: f' = ↑ff' =f': α → βf) :f: α →ₙ+* βα →ₙ+*α: Type ?u.16269β :=β: Type ?u.16272{{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337ff: α →ₙ+* β.{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337toMulHomtoMulHom: {α : Type ?u.16812} → {β : Type ?u.16811} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →ₙ* β.copy{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337f'f': α → β{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337hh: f' = ↑f,{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337ff: α →ₙ+* β.{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337toAddMonoidHomtoAddMonoidHom: {α : Type ?u.16936} → {β : Type ?u.16935} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →+ β.{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337copycopy: {M : Type ?u.16942} → {N : Type ?u.16941} → [inst : AddZeroClass M] → [inst_1 : AddZeroClass N] → (f : M →+ N) → (f' : M → N) → f' = ↑f → M →+ N{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337f'f': α → β{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337hh: f' = ↑f{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337with{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337} #align non_unital_ring_hom.copy{ f.toMulHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.17336 →ₙ+* ?m.17337NonUnitalRingHom.copy @[simp] theoremNonUnitalRingHom.copy: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (f : α →ₙ+* β) → (f' : α → β) → f' = ↑f → α →ₙ+* βcoe_copy (coe_copy: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β) (f' : α → β) (h : f' = ↑f), ↑(NonUnitalRingHom.copy f f' h) = f'f :f: α →ₙ+* βα →ₙ+*α: Type ?u.17800β) (β: Type ?u.17803f' :f': α → βα →α: Type ?u.17800β) (β: Type ?u.17803h :h: f' = ↑ff' =f': α → βf) : ⇑(f: α →ₙ+* βf.f: α →ₙ+* βcopycopy: {α : Type ?u.18334} → {β : Type ?u.18333} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (f : α →ₙ+* β) → (f' : α → β) → f' = ↑f → α →ₙ+* βf'f': α → βh) =h: f' = ↑ff' := rfl #align non_unital_ring_hom.coe_copyf': α → βNonUnitalRingHom.coe_copy theoremNonUnitalRingHom.coe_copy: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β) (f' : α → β) (h : f' = ↑f), ↑(NonUnitalRingHom.copy f f' h) = f'copy_eq (copy_eq: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β) (f' : α → β) (h : f' = ↑f), NonUnitalRingHom.copy f f' h = ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.18581β) (β: Type ?u.18584f' :f': α → βα →α: Type ?u.18581β) (β: Type ?u.18584h :h: f' = ↑ff' =f': α → βf) :f: α →ₙ+* βf.f: α →ₙ+* βcopycopy: {α : Type ?u.19115} → {β : Type ?u.19114} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (f : α →ₙ+* β) → (f' : α → β) → f' = ↑f → α →ₙ+* βf'f': α → βh =h: f' = ↑ff := FunLike.ext'f: α →ₙ+* βh #align non_unital_ring_hom.copy_eqh: f' = ↑fNonUnitalRingHom.copy_eq end coe section variable [NonUnitalNonAssocSemiringNonUnitalRingHom.copy_eq: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β) (f' : α → β) (h : f' = ↑f), NonUnitalRingHom.copy f f' h = fα] [NonUnitalNonAssocSemiringα: Type ?u.19451β] variable (β: Type ?u.19454f :f: α →ₙ+* βα →ₙ+*α: Type ?u.21315β) {β: Type ?u.20778xx: αy :y: αα} @[ext] theoremα: Type ?u.19469ext ⦃ext: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = gff: α →ₙ+* βg :g: α →ₙ+* βα →ₙ+*α: Type ?u.19509β⦄ : (∀β: Type ?u.19512x,x: ?m.19572ff: α →ₙ+* βx =x: ?m.19572gg: α →ₙ+* βx) →x: ?m.19572f =f: α →ₙ+* βg := FunLike.extg: α →ₙ+* β__: ?m.19938_ #align non_unital_ring_hom.ext_: ?m.19938NonUnitalRingHom.ext theorem ext_iff {NonUnitalRingHom.ext: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = gff: α →ₙ+* βg :g: α →ₙ+* βα →ₙ+*α: Type ?u.20149β} :β: Type ?u.20152f =f: α →ₙ+* βg ↔ ∀g: α →ₙ+* βx,x: ?m.20217ff: α →ₙ+* βx =x: ?m.20217gg: α →ₙ+* βx := FunLike.ext_iff #align non_unital_ring_hom.ext_iffx: ?m.20217NonUnitalRingHom.ext_iff @[simp] theoremNonUnitalRingHom.ext_iff: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] {f g : α →ₙ+* β}, f = g ↔ ∀ (x : α), ↑f x = ↑g xmk_coe (mk_coe: ∀ (f : α →ₙ+* β) (h₁ : ∀ (x y : α), ↑f (x * y) = ↑f x * ↑f y) (h₂ : MulHom.toFun { toFun := ↑f, map_mul' := h₁ } 0 = 0) (h₃ : ∀ (x y : α), MulHom.toFun { toFun := ↑f, map_mul' := h₁ } (x + y) = MulHom.toFun { toFun := ↑f, map_mul' := h₁ } x + MulHom.toFun { toFun := ↑f, map_mul' := h₁ } y), { toMulHom := { toFun := ↑f, map_mul' := h₁ }, map_zero' := h₂, map_add' := h₃ } = ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.20775β) (h₁β: Type ?u.20778h₂h₂: MulHom.toFun { toFun := ↑f, map_mul' := h₁ } 0 = 0h₃) :h₃: ?m.20836NonUnitalRingHom.mk (MulHom.mkNonUnitalRingHom.mk: {α : Type ?u.20841} → {β : Type ?u.20840} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (toMulHom : α →ₙ* β) → MulHom.toFun toMulHom 0 = 0 → (∀ (x y : α), MulHom.toFun toMulHom (x + y) = MulHom.toFun toMulHom x + MulHom.toFun toMulHom y) → α →ₙ+* βff: α →ₙ+* βh₁)h₁: ?m.20830h₂h₂: ?m.20833h₃ =h₃: ?m.20836f :=f: α →ₙ+* βext funext: ∀ {α : Type ?u.21202} {β : Type ?u.21203} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = g_ => rfl #align non_unital_ring_hom.mk_coe_: ?m.21230NonUnitalRingHom.mk_coe theoremNonUnitalRingHom.mk_coe: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β) (h₁ : ∀ (x y : α), ↑f (x * y) = ↑f x * ↑f y) (h₂ : MulHom.toFun { toFun := ↑f, map_mul' := h₁ } 0 = 0) (h₃ : ∀ (x y : α), MulHom.toFun { toFun := ↑f, map_mul' := h₁ } (x + y) = MulHom.toFun { toFun := ↑f, map_mul' := h₁ } x + MulHom.toFun { toFun := ↑f, map_mul' := h₁ } y), { toMulHom := { toFun := ↑f, map_mul' := h₁ }, map_zero' := h₂, map_add' := h₃ } = fcoe_addMonoidHom_injective : Injective funcoe_addMonoidHom_injective: Injective fun f => ↑ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.21315β => (β: Type ?u.21318f :f: α →ₙ+* βα →+α: Type ?u.21315β) := funβ: Type ?u.21318__: ?m.21923__: ?m.21926h =>h: ?m.21929ext <| FunLike.congr_fun (F :=ext: ∀ {α : Type ?u.21931} {β : Type ?u.21932} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = gα →+α: Type ?u.21315β)β: Type ?u.21318h #align non_unital_ring_hom.coe_add_monoid_hom_injectiveh: ?m.21929NonUnitalRingHom.coe_addMonoidHom_injective set_option linter.deprecated false in theoremNonUnitalRingHom.coe_addMonoidHom_injective: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β], Injective fun f => ↑fcoe_mulHom_injective : Injective funcoe_mulHom_injective: Injective fun f => ↑ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.22902β => (β: Type ?u.22905f :f: α →ₙ+* βα →ₙ*α: Type ?u.22902β) := funβ: Type ?u.22905__: ?m.23211__: ?m.23214h =>h: ?m.23217ext <| MulHom.congr_funext: ∀ {α : Type ?u.23219} {β : Type ?u.23220} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = gh #align non_unital_ring_hom.coe_mul_hom_injectiveh: ?m.23217NonUnitalRingHom.coe_mulHom_injective end variable [NonUnitalNonAssocSemiringNonUnitalRingHom.coe_mulHom_injective: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β], Injective fun f => ↑fα] [NonUnitalNonAssocSemiringα: Type ?u.23437β] /-- The identity non-unital ring homomorphism from a non-unital semiring to itself. -/ protected defβ: Type ?u.23440id (id: (α : Type u_1) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αα :α: Type ?u.23470Type _) [NonUnitalNonAssocSemiringType _: Type (?u.23470+1)α] :α: Type ?u.23470α →ₙ+*α: Type ?u.23470α :=α: Type ?u.23470Goals accomplished! 🐙F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring αα →ₙ+* αF: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_1F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_2MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } 0 = 0F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_3∀ (x y : α), MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } (x + y) = MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } x + MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } yF: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring αα →ₙ+* αF: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_1F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_2MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } 0 = 0F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_3∀ (x y : α), MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } (x + y) = MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } x + MulHom.toFun { toFun := id, map_mul' := ?refine'_1 } yF: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring αα →ₙ+* αF: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_2F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring αα →ₙ+* αF: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
x✝, y✝: α
refine'_1F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
refine'_2F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring α
x✝, y✝: α
refine'_3F: Type ?u.23452
α✝: Type ?u.23455
β: Type ?u.23458
γ: Type ?u.23461
inst✝²: NonUnitalNonAssocSemiring α✝
inst✝¹: NonUnitalNonAssocSemiring β
α: Type ?u.23470
inst✝: NonUnitalNonAssocSemiring αα →ₙ+* α#align non_unital_ring_hom.idGoals accomplished! 🐙NonUnitalRingHom.idNonUnitalRingHom.id: (α : Type u_1) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αinstance : Zero (instance: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → Zero (α →ₙ+* β)α →ₙ+*α: Type ?u.23634β) := ⟨{ toFun :=β: Type ?u.236370, map_mul' := fun0: ?m.23789__: ?m.23981_ => (_: ?m.23984mul_zero (mul_zero: ∀ {M₀ : Type ?u.23986} [self : MulZeroClass M₀] (a : M₀), a * 0 = 00 :0: ?m.23991β)).symm, map_zero' := rfl, map_add' := funβ: Type ?u.23637__: ?m.24154_ => (_: ?m.24157add_zero (add_zero: ∀ {M : Type ?u.24159} [inst : AddZeroClass M] (a : M), a + 0 = a0 :0: ?m.24164β)).symm }⟩β: Type ?u.23637instance : Inhabited (instance: {α : Type u_1} → {β : Type u_2} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → Inhabited (α →ₙ+* β)α →ₙ+*α: Type ?u.24501β) := ⟨β: Type ?u.245040⟩ @[simp] theorem0: ?m.24540coe_zero : ⇑(coe_zero: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β], ↑0 = 00 :0: ?m.24703α →ₙ+*α: Type ?u.24669β) =β: Type ?u.246720 := rfl #align non_unital_ring_hom.coe_zero0: ?m.24924NonUnitalRingHom.coe_zero @[simp] theoremNonUnitalRingHom.coe_zero: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β], ↑0 = 0zero_apply (zero_apply: ∀ {α : Type u_2} {β : Type u_1} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (x : α), ↑0 x = 0x :x: αα) : (α: Type ?u.254290 :0: ?m.25465α →ₙ+*α: Type ?u.25429β)β: Type ?u.25432x =x: α0 := rfl #align non_unital_ring_hom.zero_apply0: ?m.25686NonUnitalRingHom.zero_apply @[simp] theoremNonUnitalRingHom.zero_apply: ∀ {α : Type u_2} {β : Type u_1} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (x : α), ↑0 x = 0id_apply (id_apply: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α] (x : α), ↑(NonUnitalRingHom.id α) x = xx :x: αα) :α: Type ?u.25950NonUnitalRingHom.idNonUnitalRingHom.id: (α : Type ?u.25968) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* ααα: Type ?u.25950x =x: αx := rfl #align non_unital_ring_hom.id_applyx: αNonUnitalRingHom.id_apply @[simp] theoremNonUnitalRingHom.id_apply: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α] (x : α), ↑(NonUnitalRingHom.id α) x = xcoe_addMonoidHom_id : (coe_addMonoidHom_id: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], ↑(NonUnitalRingHom.id α) = AddMonoidHom.id αNonUnitalRingHom.idNonUnitalRingHom.id: (α : Type ?u.26413) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αα :α: Type ?u.26193α →+α: Type ?u.26193α) =α: Type ?u.26193AddMonoidHom.idAddMonoidHom.id: (M : Type ?u.26548) → [inst : AddZeroClass M] → M →+ Mα := rfl #align non_unital_ring_hom.coe_add_monoid_hom_idα: Type ?u.26193NonUnitalRingHom.coe_addMonoidHom_id @[simp] theoremNonUnitalRingHom.coe_addMonoidHom_id: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], ↑(NonUnitalRingHom.id α) = AddMonoidHom.id αcoe_mulHom_id : (coe_mulHom_id: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], ↑(NonUnitalRingHom.id α) = MulHom.id αNonUnitalRingHom.idNonUnitalRingHom.id: (α : Type ?u.26670) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αα :α: Type ?u.26599α →ₙ*α: Type ?u.26599α) = MulHom.idα: Type ?u.26599α := rfl #align non_unital_ring_hom.coe_mul_hom_idα: Type ?u.26599NonUnitalRingHom.coe_mulHom_id variable [NonUnitalNonAssocSemiringNonUnitalRingHom.coe_mulHom_id: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], ↑(NonUnitalRingHom.id α) = MulHom.id αγ] /-- Composition of non-unital ring homomorphisms is a non-unital ring homomorphism. -/ def comp (γ: Type ?u.26857g :g: β →ₙ+* γβ →ₙ+*β: Type ?u.26875γ) (γ: Type ?u.26878f :f: α →ₙ+* βα →ₙ+*α: Type ?u.26872β) :β: Type ?u.26875α →ₙ+*α: Type ?u.26872γ :=γ: Type ?u.26878{{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765gg: β →ₙ+* γ.{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765toMulHomtoMulHom: {α : Type ?u.26930} → {β : Type ?u.26929} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →ₙ* β.comp{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765ff: α →ₙ+* β.{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765toMulHomtoMulHom: {α : Type ?u.27075} → {β : Type ?u.27074} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →ₙ* β,{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765gg: β →ₙ+* γ.{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765toAddMonoidHomtoAddMonoidHom: {α : Type ?u.27148} → {β : Type ?u.27147} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →+ β.{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765compcomp: {M : Type ?u.27155} → {N : Type ?u.27154} → {P : Type ?u.27153} → [inst : AddZeroClass M] → [inst_1 : AddZeroClass N] → [inst_2 : AddZeroClass P] → (N →+ P) → (M →+ N) → M →+ P{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765ff: α →ₙ+* β.{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765toAddMonoidHomtoAddMonoidHom: {α : Type ?u.27553} → {β : Type ?u.27552} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → (α →ₙ+* β) → α →+ β{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765with{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765} #align non_unital_ring_hom.comp{ g.toMulHom.comp f.toMulHom, g.toAddMonoidHom.comp f.toAddMonoidHom with }: ?m.27764 →ₙ+* ?m.27765NonUnitalRingHom.comp /-- Composition of non-unital ring homomorphisms is associative. -/ theoremNonUnitalRingHom.comp: {α : Type u_1} → {β : Type u_2} → {γ : Type u_3} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γcomp_assoc {δ} {_ : NonUnitalNonAssocSemiringδ: ?m.28257δ} (δ: ?m.28257f :f: α →ₙ+* βα →ₙ+*α: Type ?u.28239β) (β: Type ?u.28242g :g: β →ₙ+* γβ →ₙ+*β: Type ?u.28242γ) (γ: Type ?u.28245h :h: γ →ₙ+* δγ →ₙ+*γ: Type ?u.28245δ) : (δ: ?m.28257h.h: γ →ₙ+* δcompcomp: {α : Type ?u.28307} → {β : Type ?u.28306} → {γ : Type ?u.28305} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γg).g: β →ₙ+* γcompcomp: {α : Type ?u.28336} → {β : Type ?u.28335} → {γ : Type ?u.28334} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf =f: α →ₙ+* βh.h: γ →ₙ+* δcomp (comp: {α : Type ?u.28365} → {β : Type ?u.28364} → {γ : Type ?u.28363} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γg.g: β →ₙ+* γcompcomp: {α : Type ?u.28382} → {β : Type ?u.28381} → {γ : Type ?u.28380} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf) := rfl #align non_unital_ring_hom.comp_assocf: α →ₙ+* βNonUnitalRingHom.comp_assoc @[simp] theorem coe_comp (NonUnitalRingHom.comp_assoc: ∀ {α : Type u_2} {β : Type u_3} {γ : Type u_4} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] {δ : Type u_1} {x : NonUnitalNonAssocSemiring δ} (f : α →ₙ+* β) (g : β →ₙ+* γ) (h : γ →ₙ+* δ), comp (comp h g) f = comp h (comp g f)g :g: β →ₙ+* γβ →ₙ+*β: Type ?u.28511γ) (γ: Type ?u.28514f :f: α →ₙ+* βα →ₙ+*α: Type ?u.28508β) : ⇑(β: Type ?u.28511g.g: β →ₙ+* γcompcomp: {α : Type ?u.28559} → {β : Type ?u.28558} → {γ : Type ?u.28557} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf) =f: α →ₙ+* βg ∘g: β →ₙ+* γf := rfl #align non_unital_ring_hom.coe_compf: α →ₙ+* βNonUnitalRingHom.coe_comp @[simp] theoremNonUnitalRingHom.coe_comp: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ) (f : α →ₙ+* β), ↑(comp g f) = ↑g ∘ ↑fcomp_apply (comp_apply: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ) (f : α →ₙ+* β) (x : α), ↑(comp g f) x = ↑g (↑f x)g :g: β →ₙ+* γβ →ₙ+*β: Type ?u.29227γ) (γ: Type ?u.29230f :f: α →ₙ+* βα →ₙ+*α: Type ?u.29224β) (β: Type ?u.29227x :x: αα) :α: Type ?u.29224g.g: β →ₙ+* γcompcomp: {α : Type ?u.29277} → {β : Type ?u.29276} → {γ : Type ?u.29275} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γff: α →ₙ+* βx =x: αg (g: β →ₙ+* γff: α →ₙ+* βx) := rfl #align non_unital_ring_hom.comp_applyx: αNonUnitalRingHom.comp_apply variable (NonUnitalRingHom.comp_apply: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ) (f : α →ₙ+* β) (x : α), ↑(comp g f) x = ↑g (↑f x)g :g: β →ₙ+* γβ →ₙ+*β: Type ?u.29927γ) (γ: Type ?u.29930f :f: α →ₙ+* βα →ₙ+*α: Type ?u.29924β) @[simp] theoremβ: Type ?u.29978coe_comp_addMonoidHom (coe_comp_addMonoidHom: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ) (f : α →ₙ+* β), { toZeroHom := { toFun := ↑g ∘ ↑f, map_zero' := (_ : MulHom.toFun (comp g f).toMulHom 0 = 0) }, map_add' := (_ : ∀ (x y : α), MulHom.toFun (comp g f).toMulHom (x + y) = MulHom.toFun (comp g f).toMulHom x + MulHom.toFun (comp g f).toMulHom y) } = AddMonoidHom.comp ↑g ↑fg :g: β →ₙ+* γβ →ₙ+*β: Type ?u.29978γ) (γ: Type ?u.29981f :f: α →ₙ+* βα →ₙ+*α: Type ?u.29975β) :β: Type ?u.29978AddMonoidHom.mk ⟨AddMonoidHom.mk: {M : Type ?u.30055} → {N : Type ?u.30054} → [inst : AddZeroClass M] → [inst_1 : AddZeroClass N] → (toZeroHom : ZeroHom M N) → (∀ (x y : M), ZeroHom.toFun toZeroHom (x + y) = ZeroHom.toFun toZeroHom x + ZeroHom.toFun toZeroHom y) → M →+ Ng ∘g: β →ₙ+* γf, (f: α →ₙ+* βg.g: β →ₙ+* γcompcomp: {α : Type ?u.30527} → {β : Type ?u.30526} → {γ : Type ?u.30525} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf).f: α →ₙ+* βmap_zero'⟩ (map_zero': ∀ {α : Type ?u.30547} {β : Type ?u.30546} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (self : α →ₙ+* β), MulHom.toFun self.toMulHom 0 = 0g.g: β →ₙ+* γcompcomp: {α : Type ?u.31262} → {β : Type ?u.31261} → {γ : Type ?u.31260} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf).f: α →ₙ+* βmap_add' = (map_add': ∀ {α : Type ?u.31282} {β : Type ?u.31281} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (self : α →ₙ+* β) (x y : α), MulHom.toFun self.toMulHom (x + y) = MulHom.toFun self.toMulHom x + MulHom.toFun self.toMulHom yg :g: β →ₙ+* γβ →+β: Type ?u.29978γ).γ: Type ?u.29981compcomp: {M : Type ?u.31627} → {N : Type ?u.31626} → {P : Type ?u.31625} → [inst : AddZeroClass M] → [inst_1 : AddZeroClass N] → [inst_2 : AddZeroClass P] → (N →+ P) → (M →+ N) → M →+ Pf := rfl #align non_unital_ring_hom.coe_comp_add_monoid_homf: α →ₙ+* βNonUnitalRingHom.coe_comp_addMonoidHom @[simp] theoremNonUnitalRingHom.coe_comp_addMonoidHom: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ) (f : α →ₙ+* β), { toZeroHom := { toFun := ↑g ∘ ↑f, map_zero' := (_ : MulHom.toFun (comp g f).toMulHom 0 = 0) }, map_add' := (_ : ∀ (x y : α), MulHom.toFun (comp g f).toMulHom (x + y) = MulHom.toFun (comp g f).toMulHom x + MulHom.toFun (comp g f).toMulHom y) } = AddMonoidHom.comp ↑g ↑fcoe_comp_mulHom (coe_comp_mulHom: ∀ (g : β →ₙ+* γ) (f : α →ₙ+* β), { toFun := ↑g ∘ ↑f, map_mul' := (_ : ∀ (x y : α), MulHom.toFun (comp g f).toMulHom (x * y) = MulHom.toFun (comp g f).toMulHom x * MulHom.toFun (comp g f).toMulHom y) } = MulHom.comp ↑g ↑fg :g: β →ₙ+* γβ →ₙ+*β: Type ?u.32117γ) (γ: Type ?u.32120f :f: α →ₙ+* βα →ₙ+*α: Type ?u.32114β) : MulHom.mk (β: Type ?u.32117g ∘g: β →ₙ+* γf) (f: α →ₙ+* βg.g: β →ₙ+* γcompcomp: {α : Type ?u.32592} → {β : Type ?u.32591} → {γ : Type ?u.32590} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf).f: α →ₙ+* βmap_mul' = (map_mul': ∀ {M : Type ?u.32622} {N : Type ?u.32621} [inst : Mul M] [inst_1 : Mul N] (self : M →ₙ* N) (x y : M), MulHom.toFun self (x * y) = MulHom.toFun self x * MulHom.toFun self yg :g: β →ₙ+* γβ →ₙ*β: Type ?u.32117γ).γ: Type ?u.32120compf := rfl #align non_unital_ring_hom.coe_comp_mul_homf: α →ₙ+* βNonUnitalRingHom.coe_comp_mulHom @[simp] theoremNonUnitalRingHom.coe_comp_mulHom: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ) (f : α →ₙ+* β), { toFun := ↑g ∘ ↑f, map_mul' := (_ : ∀ (x y : α), MulHom.toFun (comp g f).toMulHom (x * y) = MulHom.toFun (comp g f).toMulHom x * MulHom.toFun (comp g f).toMulHom y) } = MulHom.comp ↑g ↑fcomp_zero (comp_zero: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ), comp g 0 = 0g :g: β →ₙ+* γβ →ₙ+*β: Type ?u.33488γ) :γ: Type ?u.33491g.g: β →ₙ+* γcomp (comp: {α : Type ?u.33554} → {β : Type ?u.33553} → {γ : Type ?u.33552} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γ0 :0: ?m.33585α →ₙ+*α: Type ?u.33485β) =β: Type ?u.334880 :=0: ?m.33627Goals accomplished! 🐙F: Type ?u.33482
α: Type u_3
β: Type u_1
γ: Type u_2
inst✝²: NonUnitalNonAssocSemiring α
inst✝¹: NonUnitalNonAssocSemiring β
inst✝: NonUnitalNonAssocSemiring γ
g✝: β →ₙ+* γ
f: α →ₙ+* β
g: β →ₙ+* γF: Type ?u.33482
α: Type u_3
β: Type u_1
γ: Type u_2
inst✝²: NonUnitalNonAssocSemiring α
inst✝¹: NonUnitalNonAssocSemiring β
inst✝: NonUnitalNonAssocSemiring γ
g✝: β →ₙ+* γ
f: α →ₙ+* β
g: β →ₙ+* γ
x✝: α
aF: Type ?u.33482
α: Type u_3
β: Type u_1
γ: Type u_2
inst✝²: NonUnitalNonAssocSemiring α
inst✝¹: NonUnitalNonAssocSemiring β
inst✝: NonUnitalNonAssocSemiring γ
g✝: β →ₙ+* γ
f: α →ₙ+* β
g: β →ₙ+* γ#align non_unital_ring_hom.comp_zeroGoals accomplished! 🐙NonUnitalRingHom.comp_zero @[simp] theorem zero_comp (NonUnitalRingHom.comp_zero: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ), comp g 0 = 0f :f: α →ₙ+* βα →ₙ+*α: Type ?u.34959β) : (β: Type ?u.349620 :0: ?m.35038β →ₙ+*β: Type ?u.34962γ).γ: Type ?u.34965compcomp: {α : Type ?u.35081} → {β : Type ?u.35080} → {γ : Type ?u.35079} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf =f: α →ₙ+* β0 :=0: ?m.35105Goals accomplished! 🐙F: Type ?u.34956
α: Type u_1
β: Type u_2
γ: Type u_3
inst✝²: NonUnitalNonAssocSemiring α
inst✝¹: NonUnitalNonAssocSemiring β
inst✝: NonUnitalNonAssocSemiring γ
g: β →ₙ+* γ
f✝, f: α →ₙ+* βF: Type ?u.34956
α: Type u_1
β: Type u_2
γ: Type u_3
inst✝²: NonUnitalNonAssocSemiring α
inst✝¹: NonUnitalNonAssocSemiring β
inst✝: NonUnitalNonAssocSemiring γ
g: β →ₙ+* γ
f✝, f: α →ₙ+* β
x✝: α
aF: Type ?u.34956
α: Type u_1
β: Type u_2
γ: Type u_3
inst✝²: NonUnitalNonAssocSemiring α
inst✝¹: NonUnitalNonAssocSemiring β
inst✝: NonUnitalNonAssocSemiring γ
g: β →ₙ+* γ
f✝, f: α →ₙ+* β#align non_unital_ring_hom.zero_compGoals accomplished! 🐙NonUnitalRingHom.zero_comp @[simp] theoremNonUnitalRingHom.zero_comp: ∀ {α : Type u_1} {β : Type u_2} {γ : Type u_3} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (f : α →ₙ+* β), comp 0 f = 0comp_id (comp_id: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), comp f (NonUnitalRingHom.id α) = ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.35260β) :β: Type ?u.35263f.f: α →ₙ+* βcomp (comp: {α : Type ?u.35329} → {β : Type ?u.35328} → {γ : Type ?u.35327} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γNonUnitalRingHom.idNonUnitalRingHom.id: (α : Type ?u.35348) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αα) =α: Type ?u.35260f :=f: α →ₙ+* βext funext: ∀ {α : Type ?u.35361} {β : Type ?u.35362} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = g_ => rfl #align non_unital_ring_hom.comp_id_: ?m.35389NonUnitalRingHom.comp_id @[simp] theoremNonUnitalRingHom.comp_id: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), comp f (NonUnitalRingHom.id α) = fid_comp (id_comp: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), comp (NonUnitalRingHom.id β) f = ff :f: α →ₙ+* βα →ₙ+*α: Type ?u.35443β) : (β: Type ?u.35446NonUnitalRingHom.idNonUnitalRingHom.id: (α : Type ?u.35510) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αβ).β: Type ?u.35446compcomp: {α : Type ?u.35514} → {β : Type ?u.35513} → {γ : Type ?u.35512} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf =f: α →ₙ+* βf :=f: α →ₙ+* βext funext: ∀ {α : Type ?u.35544} {β : Type ?u.35545} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = g_ => rfl #align non_unital_ring_hom.id_comp_: ?m.35572NonUnitalRingHom.id_compNonUnitalRingHom.id_comp: ∀ {α : Type u_1} {β : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), comp (NonUnitalRingHom.id β) f = finstance : MonoidWithZero (instance: {α : Type u_1} → [inst : NonUnitalNonAssocSemiring α] → MonoidWithZero (α →ₙ+* α)α →ₙ+*α: Type ?u.35625α) where one :=α: Type ?u.35625NonUnitalRingHom.idNonUnitalRingHom.id: (α : Type ?u.35790) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αα mul :=α: Type ?u.35625comp mul_one :=comp: {α : Type ?u.35699} → {β : Type ?u.35698} → {γ : Type ?u.35697} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γcomp_id one_mul :=comp_id: ∀ {α : Type ?u.35811} {β : Type ?u.35812} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), comp f (NonUnitalRingHom.id α) = fid_comp mul_associd_comp: ∀ {α : Type ?u.35792} {β : Type ?u.35793} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] (f : α →ₙ+* β), comp (NonUnitalRingHom.id β) f = fff: ?m.35732gg: ?m.35735h :=h: ?m.35738comp_assoccomp_assoc: ∀ {α : Type ?u.35741} {β : Type ?u.35742} {γ : Type ?u.35743} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] {δ : Type ?u.35740} {x : NonUnitalNonAssocSemiring δ} (f : α →ₙ+* β) (g : β →ₙ+* γ) (h : γ →ₙ+* δ), comp (comp h g) f = comp h (comp g f)__: ?m.35744 →ₙ+* ?m.35745__: ?m.35745 →ₙ+* ?m.35746_ zero :=_: ?m.35746 →ₙ+* ?m.357500 mul_zero :=0: ?m.35837comp_zero zero_mul :=comp_zero: ∀ {α : Type ?u.35900} {β : Type ?u.35898} {γ : Type ?u.35899} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (g : β →ₙ+* γ), comp g 0 = 0zero_comp theoremzero_comp: ∀ {α : Type ?u.35871} {β : Type ?u.35872} {γ : Type ?u.35873} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] (f : α →ₙ+* β), comp 0 f = 0one_def : (one_def: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], 1 = NonUnitalRingHom.id α1 :1: ?m.36166α →ₙ+*α: Type ?u.36105α) =α: Type ?u.36105NonUnitalRingHom.idNonUnitalRingHom.id: (α : Type ?u.36355) → [inst : NonUnitalNonAssocSemiring α] → α →ₙ+* αα := rfl #align non_unital_ring_hom.one_defα: Type ?u.36105NonUnitalRingHom.one_def @[simp] theoremNonUnitalRingHom.one_def: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], 1 = NonUnitalRingHom.id αcoe_one : ⇑(coe_one: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], ↑1 = id1 :1: ?m.36432α →ₙ+*α: Type ?u.36371α) =α: Type ?u.36371id := rfl #align non_unital_ring_hom.coe_oneid: {α : Sort ?u.36789} → α → αNonUnitalRingHom.coe_one theorem mul_def (NonUnitalRingHom.coe_one: ∀ {α : Type u_1} [inst : NonUnitalNonAssocSemiring α], ↑1 = idff: α →ₙ+* αg :g: α →ₙ+* αα →ₙ+*α: Type ?u.36873α) :α: Type ?u.36873f *f: α →ₙ+* αg =g: α →ₙ+* αf.f: α →ₙ+* αcompcomp: {α : Type ?u.36945} → {β : Type ?u.36944} → {γ : Type ?u.36943} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γg := rfl #align non_unital_ring_hom.mul_def NonUnitalRingHom.mul_def @[simp] theorem coe_mul (g: α →ₙ+* αff: α →ₙ+* αg :g: α →ₙ+* αα →ₙ+*α: Type ?u.37250α) : ⇑(α: Type ?u.37250f *f: α →ₙ+* αg) =g: α →ₙ+* αf ∘f: α →ₙ+* αg := rfl #align non_unital_ring_hom.coe_mul NonUnitalRingHom.coe_mul theoremg: α →ₙ+* αcancel_right {cancel_right: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] {g₁ g₂ : β →ₙ+* γ} {f : α →ₙ+* β}, Surjective ↑f → (comp g₁ f = comp g₂ f ↔ g₁ = g₂)g₁g₁: β →ₙ+* γg₂ :g₂: β →ₙ+* γβ →ₙ+*β: Type ?u.38150γ} {γ: Type ?u.38153f :f: α →ₙ+* βα →ₙ+*α: Type ?u.38147β} (β: Type ?u.38150hf : Surjectivehf: Surjective ↑ff) :f: α →ₙ+* βg₁.g₁: β →ₙ+* γcompcomp: {α : Type ?u.38432} → {β : Type ?u.38431} → {γ : Type ?u.38430} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf =f: α →ₙ+* βg₂.g₂: β →ₙ+* γcompcomp: {α : Type ?u.38457} → {β : Type ?u.38456} → {γ : Type ?u.38455} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf ↔f: α →ₙ+* βg₁ =g₁: β →ₙ+* γg₂ := ⟨fung₂: β →ₙ+* γh =>h: ?m.38498ext <|ext: ∀ {α : Type ?u.38500} {β : Type ?u.38501} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = ghf.hf: Surjective ↑fforall.2 (forall: ∀ {α : Sort ?u.38527} {β : Sort ?u.38528} {f : α → β}, Surjective f → ∀ {p : β → Prop}, (∀ (y : β), p y) ↔ ∀ (x : α), p (f x)ext_iff.1ext_iff: ∀ {α : Type ?u.38546} {β : Type ?u.38547} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] {f g : α →ₙ+* β}, f = g ↔ ∀ (x : α), ↑f x = ↑g xh), funh: ?m.38498h =>h: ?m.38628h ▸ rfl⟩ #align non_unital_ring_hom.cancel_righth: ?m.38628NonUnitalRingHom.cancel_right theorem cancel_left {NonUnitalRingHom.cancel_right: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] {g₁ g₂ : β →ₙ+* γ} {f : α →ₙ+* β}, Surjective ↑f → (comp g₁ f = comp g₂ f ↔ g₁ = g₂)g :g: β →ₙ+* γβ →ₙ+*β: Type ?u.38687γ} {γ: Type ?u.38690f₁f₁: α →ₙ+* βf₂ :f₂: α →ₙ+* βα →ₙ+*α: Type ?u.38684β} (β: Type ?u.38687hg : Injectivehg: Injective ↑gg) :g: β →ₙ+* γg.g: β →ₙ+* γcompcomp: {α : Type ?u.38968} → {β : Type ?u.38967} → {γ : Type ?u.38966} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf₁ =f₁: α →ₙ+* βg.g: β →ₙ+* γcompcomp: {α : Type ?u.38993} → {β : Type ?u.38992} → {γ : Type ?u.38991} → [inst : NonUnitalNonAssocSemiring α] → [inst_1 : NonUnitalNonAssocSemiring β] → [inst_2 : NonUnitalNonAssocSemiring γ] → (β →ₙ+* γ) → (α →ₙ+* β) → α →ₙ+* γf₂ ↔f₂: α →ₙ+* βf₁ =f₁: α →ₙ+* βf₂ := ⟨funf₂: α →ₙ+* βh =>h: ?m.39033ext funext: ∀ {α : Type ?u.39035} {β : Type ?u.39036} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] ⦃f g : α →ₙ+* β⦄, (∀ (x : α), ↑f x = ↑g x) → f = gx =>x: ?m.39063hg <|hg: Injective ↑gGoals accomplished! 🐙, funGoals accomplished! 🐙h =>h: ?m.39088h ▸ rfl⟩ #align non_unital_ring_hom.cancel_lefth: ?m.39088NonUnitalRingHom.cancel_left end NonUnitalRingHom /-- Bundled semiring homomorphisms; use this for bundled ring homomorphisms too. This extends from both `MonoidHom` and `MonoidWithZeroHom` in order to put the fields in a sensible order, even though `MonoidWithZeroHom` already extends `MonoidHom`. -/ structureNonUnitalRingHom.cancel_left: ∀ {α : Type u_3} {β : Type u_1} {γ : Type u_2} [inst : NonUnitalNonAssocSemiring α] [inst_1 : NonUnitalNonAssocSemiring β] [inst_2 : NonUnitalNonAssocSemiring γ] {g : β →ₙ+* γ} {f₁ f₂ : α →ₙ+* β}, Injective ↑g → (comp g f₁ = comp g f₂ ↔ f₁ = f₂)RingHom (RingHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (toMonoidHom : α →* β) → OneHom.toFun (↑toMonoidHom) 0 = 0 → (∀ (x y : α), OneHom.toFun (↑toMonoidHom) (x + y) = OneHom.toFun (↑toMonoidHom) x + OneHom.toFun (↑toMonoidHom) y) → RingHom α βα :α: Type ?u.39407Type _) (Type _: Type (?u.39407+1)β :β: Type ?u.39410Type _) [NonAssocSemiringType _: Type (?u.39410+1)α] [NonAssocSemiringα: Type ?u.39407β] extendsβ: Type ?u.39410α →*α: Type ?u.39407β,β: Type ?u.39410α →+α: Type ?u.39407β,β: Type ?u.39410α →ₙ+*α: Type ?u.39407β,β: Type ?u.39410α →*₀α: Type ?u.39407β #align ring_homβ: Type ?u.39410RingHom /-- `α →+* β` denotes the type of ring homomorphisms from `α` to `β`. -/ infixr:25 " →+* " =>RingHom: (α : Type u_1) → (β : Type u_2) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (maxu_1u_2)RingHom /-- Reinterpret a ring homomorphism `f : α →+* β` as a monoid with zero homomorphism `α →*₀ β`. The `simp`-normal form is `(f : α →*₀ β)`. -/ add_decl_docRingHom: (α : Type u_1) → (β : Type u_2) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (maxu_1u_2)RingHom.toMonoidWithZeroHom #align ring_hom.to_monoid_with_zero_homRingHom.toMonoidWithZeroHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →*₀ βRingHom.toMonoidWithZeroHom /-- Reinterpret a ring homomorphism `f : α →+* β` as a monoid homomorphism `α →* β`. The `simp`-normal form is `(f : α →* β)`. -/ add_decl_docRingHom.toMonoidWithZeroHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →*₀ βRingHom.toMonoidHom #align ring_hom.to_monoid_homRingHom.toMonoidHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →* βRingHom.toMonoidHom /-- Reinterpret a ring homomorphism `f : α →+* β` as an additive monoid homomorphism `α →+ β`. The `simp`-normal form is `(f : α →+ β)`. -/ add_decl_docRingHom.toMonoidHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →* βRingHom.toAddMonoidHom #align ring_hom.to_add_monoid_homRingHom.toAddMonoidHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →+ βRingHom.toAddMonoidHom /-- Reinterpret a ring homomorphism `f : α →+* β` as a non-unital ring homomorphism `α →ₙ+* β`. The `simp`-normal form is `(f : α →ₙ+* β)`. -/ add_decl_docRingHom.toAddMonoidHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →+ βRingHom.toNonUnitalRingHom #align ring_hom.to_non_unital_ring_homRingHom.toNonUnitalRingHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →ₙ+* βRingHom.toNonUnitalRingHom section RingHomClass /-- `RingHomClass F α β` states that `F` is a type of (semi)ring homomorphisms. You should extend this class when you extend `RingHom`. This extends from both `MonoidHomClass` and `MonoidWithZeroHomClass` in order to put the fields in a sensible order, even though `MonoidWithZeroHomClass` already extends `MonoidHomClass`. -/ classRingHom.toNonUnitalRingHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →ₙ+* βRingHomClass (RingHomClass: Type u_1 → (α : outParam (Type u_2)) → (β : outParam (Type u_3)) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (max(maxu_1u_2)u_3)F :F: Type ?u.48337Type _) (α β : outParam (Type _: Type (?u.48337+1)Type _)) [NonAssocSemiring α] [NonAssocSemiring β] extendsType _: Type (?u.48341+1)MonoidHomClassMonoidHomClass: Type ?u.48358 → (M : outParam (Type ?u.48357)) → (N : outParam (Type ?u.48356)) → [inst : MulOneClass M] → [inst : MulOneClass N] → Type (max(max?u.48358?u.48357)?u.48356)F α β,F: Type ?u.48337AddMonoidHomClassAddMonoidHomClass: Type ?u.48407 → (M : outParam (Type ?u.48406)) → (N : outParam (Type ?u.48405)) → [inst : AddZeroClass M] → [inst : AddZeroClass N] → Type (max(max?u.48407?u.48406)?u.48405)F α β,F: Type ?u.48337MonoidWithZeroHomClassMonoidWithZeroHomClass: Type ?u.48551 → (M : outParam (Type ?u.48550)) → (N : outParam (Type ?u.48549)) → [inst : MulZeroOneClass M] → [inst : MulZeroOneClass N] → Type (max(max?u.48551?u.48550)?u.48549)F α β #align ring_hom_classF: Type ?u.48337RingHomClass set_option linter.deprecated false in /-- Ring homomorphisms preserve `bit1`. -/ @[simp] lemmaRingHomClass: Type u_1 → (α : outParam (Type u_2)) → (β : outParam (Type u_3)) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (max(maxu_1u_2)u_3)map_bit1 [NonAssocSemiringmap_bit1: ∀ {F : Type u_3} {α : Type u_1} {β : Type u_2} [inst : NonAssocSemiring α] [inst_1 : NonAssocSemiring β] [inst_2 : RingHomClass F α β] (f : F) (a : α), ↑f (bit1 a) = bit1 (↑f a)α] [NonAssocSemiringα: Type ?u.48856β] [β: Type ?u.48859RingHomClassRingHomClass: Type ?u.48873 → (α : outParam (Type ?u.48872)) → (β : outParam (Type ?u.48871)) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (max(max?u.48873?u.48872)?u.48871)FF: Type ?u.48853αα: Type ?u.48856β] (β: Type ?u.48859f :f: FF) (F: Type ?u.48853a :a: αα) : (α: Type ?u.48856f (bit1f: Fa) :a: αβ) = bit1 (β: Type ?u.48859ff: Fa) :=a: αGoals accomplished! 🐙F: Type u_3
α: Type u_1
β: Type u_2
γ: Type ?u.48862
inst✝²: NonAssocSemiring α
inst✝¹: NonAssocSemiring β
inst✝: RingHomClass F α β
f: F
a: α#align map_bit1Goals accomplished! 🐙map_bit1 -- Porting note: marked `{}` rather than `[]` to prevent dangerous instances variable {map_bit1: ∀ {F : Type u_3} {α : Type u_1} {β : Type u_2} [inst : NonAssocSemiring α] [inst_1 : NonAssocSemiring β] [inst_2 : RingHomClass F α β] (f : F) (a : α), ↑f (bit1 a) = bit1 (↑f a)_ : NonAssocSemiring_: NonAssocSemiring αα} {α: Type ?u.51067_ : NonAssocSemiring_: NonAssocSemiring ββ} [β: Type ?u.51035RingHomClassRingHomClass: Type ?u.51049 → (α : outParam (Type ?u.51048)) → (β : outParam (Type ?u.51047)) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (max(max?u.51049?u.51048)?u.51047)FF: Type ?u.51029αα: Type ?u.52025β] /-- Turn an element of a type `F` satisfying `RingHomClass F α β` into an actual `RingHom`. This is declared as the default coercion from `F` to `α →+* β`. -/ @[coe] defβ: Type ?u.52028RingHomClass.toRingHom (RingHomClass.toRingHom: F → α →+* βf :f: FF) :F: Type ?u.51064α →+*α: Type ?u.51067β :=β: Type ?u.51070{ ({ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536ff: F:{ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536αα: Type ?u.51067→*{ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536ββ: Type ?u.51070), ({ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536ff: F:{ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536αα: Type ?u.51067→+{ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536ββ: Type ?u.51070){ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536with{ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536} /-- Any type satisfying `RingHomClass` can be cast into `RingHom` via `RingHomClass.toRingHom`. -/{ (f : α →* β), (f : α →+ β) with }: ?m.51535 →+* ?m.51536instance : CoeTCinstance: {F : Type u_1} → {α : Type u_2} → {β : Type u_3} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → [inst : RingHomClass F α β] → CoeTC F (α →+* β)F (F: Type ?u.52022α →+*α: Type ?u.52025β) := ⟨β: Type ?u.52028RingHomClass.toRingHom⟩ instance (priority := 100)RingHomClass.toRingHom: {F : Type ?u.52085} → {α : Type ?u.52084} → {β : Type ?u.52083} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → [inst : RingHomClass F α β] → F → α →+* βRingHomClass.toNonUnitalRingHomClass :RingHomClass.toNonUnitalRingHomClass: NonUnitalRingHomClass F α βNonUnitalRingHomClassNonUnitalRingHomClass: Type ?u.52246 → (α : outParam (Type ?u.52245)) → (β : outParam (Type ?u.52244)) → [inst : NonUnitalNonAssocSemiring α] → [inst : NonUnitalNonAssocSemiring β] → Type (max(max?u.52246?u.52245)?u.52244)FF: Type ?u.52209αα: Type ?u.52212β :=β: Type ?u.52215{ ‹RingHomClass F α β›{ ‹RingHomClass F α β› with }: NonUnitalRingHomClass ?m.52361 ?m.52362 ?m.52363with{ ‹RingHomClass F α β› with }: NonUnitalRingHomClass ?m.52361 ?m.52362 ?m.52363} #align ring_hom_class.to_non_unital_ring_hom_class{ ‹RingHomClass F α β› with }: NonUnitalRingHomClass ?m.52361 ?m.52362 ?m.52363RingHomClass.toNonUnitalRingHomClass end RingHomClass namespace RingHom section coe /-! Throughout this section, some `Semiring` arguments are specified with `{}` instead of `[]`. See note [implicit instance arguments]. -/ variable {RingHomClass.toNonUnitalRingHomClass: {F : Type u_1} → {α : Type u_2} → {β : Type u_3} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → [inst : RingHomClass F α β] → NonUnitalRingHomClass F α β_ : NonAssocSemiring_: NonAssocSemiring αα} {α: Type ?u.59553_ : NonAssocSemiring_: NonAssocSemiring ββ}β: Type ?u.52645instance :instance: {α : Type u_1} → {β : Type u_2} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → RingHomClass (α →+* β) α βRingHomClass (RingHomClass: Type ?u.52677 → (α : outParam (Type ?u.52676)) → (β : outParam (Type ?u.52675)) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (max(max?u.52677?u.52676)?u.52675)α →+*α: Type ?u.52660β)β: Type ?u.52663αα: Type ?u.52660β where coeβ: Type ?u.52663f :=f: ?m.52890f.toFun coe_injective'f: ?m.52890ff: ?m.53017gg: ?m.53020h :=h: ?m.53023Goals accomplished! 🐙F: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
f, g: α →+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
g: α →+* β
toMonoidHom✝: α →* β
map_zero'✝: OneHom.toFun (↑toMonoidHom✝) 0 = 0
map_add'✝: ∀ (x y : α), OneHom.toFun (↑toMonoidHom✝) (x + y) = OneHom.toFun (↑toMonoidHom✝) x + OneHom.toFun (↑toMonoidHom✝) y
h: (fun f => f.toFun) { toMonoidHom := toMonoidHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ } = (fun f => f.toFun) g
mk{ toMonoidHom := toMonoidHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ } = gF: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
f, g: α →+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
toMonoidHom✝¹: α →* β
map_zero'✝¹: OneHom.toFun (↑toMonoidHom✝¹) 0 = 0
map_add'✝¹: ∀ (x y : α), OneHom.toFun (↑toMonoidHom✝¹) (x + y) = OneHom.toFun (↑toMonoidHom✝¹) x + OneHom.toFun (↑toMonoidHom✝¹) y
toMonoidHom✝: α →* β
map_zero'✝: OneHom.toFun (↑toMonoidHom✝) 0 = 0
map_add'✝: ∀ (x y : α), OneHom.toFun (↑toMonoidHom✝) (x + y) = OneHom.toFun (↑toMonoidHom✝) x + OneHom.toFun (↑toMonoidHom✝) y
h: (fun f => f.toFun) { toMonoidHom := toMonoidHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = (fun f => f.toFun) { toMonoidHom := toMonoidHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }
mk.mk{ toMonoidHom := toMonoidHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = { toMonoidHom := toMonoidHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }F: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
f, g: α →+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
toMonoidHom✝¹: α →* β
map_zero'✝¹: OneHom.toFun (↑toMonoidHom✝¹) 0 = 0
map_add'✝¹: ∀ (x y : α), OneHom.toFun (↑toMonoidHom✝¹) (x + y) = OneHom.toFun (↑toMonoidHom✝¹) x + OneHom.toFun (↑toMonoidHom✝¹) y
toMonoidHom✝: α →* β
map_zero'✝: OneHom.toFun (↑toMonoidHom✝) 0 = 0
map_add'✝: ∀ (x y : α), OneHom.toFun (↑toMonoidHom✝) (x + y) = OneHom.toFun (↑toMonoidHom✝) x + OneHom.toFun (↑toMonoidHom✝) y
h: (fun f => f.toFun) { toMonoidHom := toMonoidHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = (fun f => f.toFun) { toMonoidHom := toMonoidHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }
mk.mk.e_toMonoidHomtoMonoidHom✝¹ = toMonoidHom✝F: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
f, g: α →+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gF: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
toMonoidHom✝¹: α →* β
map_zero'✝¹: OneHom.toFun (↑toMonoidHom✝¹) 0 = 0
map_add'✝¹: ∀ (x y : α), OneHom.toFun (↑toMonoidHom✝¹) (x + y) = OneHom.toFun (↑toMonoidHom✝¹) x + OneHom.toFun (↑toMonoidHom✝¹) y
toMonoidHom✝: α →* β
map_zero'✝: OneHom.toFun (↑toMonoidHom✝) 0 = 0
map_add'✝: ∀ (x y : α), OneHom.toFun (↑toMonoidHom✝) (x + y) = OneHom.toFun (↑toMonoidHom✝) x + OneHom.toFun (↑toMonoidHom✝) y
h: (fun f => f.toFun) { toMonoidHom := toMonoidHom✝¹, map_zero' := map_zero'✝¹, map_add' := map_add'✝¹ } = (fun f => f.toFun) { toMonoidHom := toMonoidHom✝, map_zero' := map_zero'✝, map_add' := map_add'✝ }
mk.mk.e_toMonoidHom.a↑toMonoidHom✝¹ = ↑toMonoidHom✝F: Type ?u.52657
α: Type ?u.52660
β: Type ?u.52663
γ: Type ?u.52666
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
f, g: α →+* β
h: (fun f => f.toFun) f = (fun f => f.toFun) gf = gmap_add :=Goals accomplished! 🐙RingHom.map_add' map_zero :=RingHom.map_add': ∀ {α : Type ?u.53095} {β : Type ?u.53094} [inst : NonAssocSemiring α] [inst_1 : NonAssocSemiring β] (self : α →+* β) (x y : α), OneHom.toFun (↑self.toMonoidHom) (x + y) = OneHom.toFun (↑self.toMonoidHom) x + OneHom.toFun (↑self.toMonoidHom) yRingHom.map_zero' map_mulRingHom.map_zero': ∀ {α : Type ?u.53126} {β : Type ?u.53125} [inst : NonAssocSemiring α] [inst_1 : NonAssocSemiring β] (self : α →+* β), OneHom.toFun (↑self.toMonoidHom) 0 = 0f :=f: ?m.53036f.f: ?m.53036map_mul' map_onemap_mul': ∀ {M : Type ?u.53045} {N : Type ?u.53044} [inst : MulOneClass M] [inst_1 : MulOneClass N] (self : M →* N) (x y : M), OneHom.toFun (↑self) (x * y) = OneHom.toFun (↑self) x * OneHom.toFun (↑self) yf :=f: ?m.53072f.map_one' -- Porting note: -- These helper instances are unhelpful in Lean 4, so omitting: -- /-- Helper instance for when there's too many metavariables to apply `fun_like.has_coe_to_fun` -- directly. -- -/ -- instance : CoeFun (α →+* β) fun _ => α → β := -- ⟨RingHom.toFun⟩ initialize_simps_projectionsf: ?m.53072RingHom (RingHom: (α : Type u_1) → (β : Type u_2) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (maxu_1u_2)toFun →toFun: (α : Type u_1) → (β : Type u_2) → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α → βapply) -- Porting note: is this lemma still needed in Lean4? -- Porting note: because `f.toFun` really means `f.toMonoidHom.toOneHom.toFun` and -- `toMonoidHom_eq_coe` wants to simplify `f.toMonoidHom` to `(↑f : M →* N)`, this can't -- be a simp lemma anymore -- @[simp] theoremapply: (α : Type u_1) → (β : Type u_2) → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α → βtoFun_eq_coe (toFun_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), f.toFun = ↑ff :f: α →+* βα →+*α: Type ?u.54869β) :β: Type ?u.54872f.toFun =f: α →+* βf := rfl #align ring_hom.to_fun_eq_coef: α →+* βRingHom.toFun_eq_coe @[simp] theoremRingHom.toFun_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), f.toFun = ↑fcoe_mk (coe_mk: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →* β) (h₁ : OneHom.toFun (↑f) 0 = 0) (h₂ : ∀ (x_2 y : α), OneHom.toFun (↑f) (x_2 + y) = OneHom.toFun (↑f) x_2 + OneHom.toFun (↑f) y), ↑{ toMonoidHom := f, map_zero' := h₁, map_add' := h₂ } = ↑ff :f: α →* βα →*α: Type ?u.55906β) (β: Type ?u.55909h₁h₁: OneHom.toFun (↑f) 0 = 0h₂) : ((⟨h₂: ?m.55966f,f: α →* βh₁,h₁: ?m.55963h₂⟩ :h₂: ?m.55966α →+*α: Type ?u.55906β) :β: Type ?u.55909α →α: Type ?u.55906β) =β: Type ?u.55909f := rfl #align ring_hom.coe_mkf: α →* βRingHom.coe_mk @[simp] theoremRingHom.coe_mk: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →* β) (h₁ : OneHom.toFun (↑f) 0 = 0) (h₂ : ∀ (x_2 y : α), OneHom.toFun (↑f) (x_2 + y) = OneHom.toFun (↑f) x_2 + OneHom.toFun (↑f) y), ↑{ toMonoidHom := f, map_zero' := h₁, map_add' := h₂ } = ↑fcoe_coe {coe_coe: ∀ {α : Type u_2} {β : Type u_3} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} {F : Type u_1} [inst : RingHomClass F α β] (f : F), ↑↑f = ↑fF :F: Type u_1Type _} [Type _: Type (?u.57378+1)RingHomClassRingHomClass: Type ?u.57383 → (α : outParam (Type ?u.57382)) → (β : outParam (Type ?u.57381)) → [inst : NonAssocSemiring α] → [inst : NonAssocSemiring β] → Type (max(max?u.57383?u.57382)?u.57381)FF: Type ?u.57378αα: Type ?u.57363β] (β: Type ?u.57366f :f: FF) : ((F: Type ?u.57378f :f: Fα →+*α: Type ?u.57363β) :β: Type ?u.57366α →α: Type ?u.57363β) =β: Type ?u.57366f := rfl #align ring_hom.coe_coef: FRingHom.coe_coe attribute [coe]RingHom.coe_coe: ∀ {α : Type u_2} {β : Type u_3} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} {F : Type u_1} [inst : RingHomClass F α β] (f : F), ↑↑f = ↑fRingHom.toMonoidHom instance coeToMonoidHom :RingHom.toMonoidHom: {α : Type u_1} → {β : Type u_2} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →* βCoe (Coe: semiOutParam (Sort ?u.58891) → Sort ?u.58890 → Sort (max(max1?u.58891)?u.58890)α →+*α: Type ?u.58875β) (β: Type ?u.58878α →*α: Type ?u.58875β) := ⟨β: Type ?u.58878RingHom.toMonoidHom⟩ #align ring_hom.has_coe_monoid_homRingHom.toMonoidHom: {α : Type ?u.58953} → {β : Type ?u.58952} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →* βRingHom.coeToMonoidHom -- Porting note: `dsimp only` can prove this #noalign ring_hom.coe_monoid_hom @[simp] theoremRingHom.coeToMonoidHom: {α : Type u_1} → {β : Type u_2} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → Coe (α →+* β) (α →* β)toMonoidHom_eq_coe (toMonoidHom_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), ↑f = ↑ff :f: α →+* βα →+*α: Type ?u.59246β) :β: Type ?u.59249f.f: α →+* βtoMonoidHom =toMonoidHom: {α : Type ?u.59279} → {β : Type ?u.59278} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →* βf := rfl #align ring_hom.to_monoid_hom_eq_coef: α →+* βRingHom.toMonoidHom_eq_coe -- Porting note: this can't be a simp lemma anymore -- @[simp] theoremRingHom.toMonoidHom_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), ↑f = ↑ftoMonoidWithZeroHom_eq_coe (toMonoidWithZeroHom_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), ↑(toMonoidWithZeroHom f) = ↑ff :f: α →+* βα →+*α: Type ?u.59553β) : (β: Type ?u.59556f.f: α →+* βtoMonoidWithZeroHom :toMonoidWithZeroHom: {α : Type ?u.59589} → {β : Type ?u.59588} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →*₀ βα →α: Type ?u.59553β) =β: Type ?u.59556f :=f: α →+* βGoals accomplished! 🐙F: Type ?u.59550
α: Type u_1
β: Type u_2
γ: Type ?u.59559
x✝¹: NonAssocSemiring α
x✝: NonAssocSemiring β
f: α →+* β↑(toMonoidWithZeroHom f) = ↑f#align ring_hom.to_monoid_with_zero_hom_eq_coeGoals accomplished! 🐙RingHom.toMonoidWithZeroHom_eq_coe @[simp] theoremRingHom.toMonoidWithZeroHom_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), ↑(toMonoidWithZeroHom f) = ↑fcoe_monoidHom_mk (coe_monoidHom_mk: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →* β) (h₁ : OneHom.toFun (↑f) 0 = 0) (h₂ : ∀ (x_2 y : α), OneHom.toFun (↑f) (x_2 + y) = OneHom.toFun (↑f) x_2 + OneHom.toFun (↑f) y), ↑{ toMonoidHom := f, map_zero' := h₁, map_add' := h₂ } = ff :f: α →* βα →*α: Type ?u.60952β) (β: Type ?u.60955h₁h₁: OneHom.toFun (↑f) 0 = 0h₂) : ((⟨h₂: ?m.61012f,f: α →* βh₁,h₁: ?m.61009h₂⟩ :h₂: ?m.61012α →+*α: Type ?u.60952β) :β: Type ?u.60955α →*α: Type ?u.60952β) =β: Type ?u.60955f := rfl #align ring_hom.coe_monoid_hom_mkf: α →* βRingHom.coe_monoidHom_mk -- Porting note: `dsimp only` can prove this #noalign ring_hom.coe_add_monoid_hom @[simp] theoremRingHom.coe_monoidHom_mk: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →* β) (h₁ : OneHom.toFun (↑f) 0 = 0) (h₂ : ∀ (x_2 y : α), OneHom.toFun (↑f) (x_2 + y) = OneHom.toFun (↑f) x_2 + OneHom.toFun (↑f) y), ↑{ toMonoidHom := f, map_zero' := h₁, map_add' := h₂ } = ftoAddMonoidHom_eq_coe (toAddMonoidHom_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), toAddMonoidHom f = ↑ff :f: α →+* βα →+*α: Type ?u.61275β) :β: Type ?u.61278f.f: α →+* βtoAddMonoidHom =toAddMonoidHom: {α : Type ?u.61308} → {β : Type ?u.61307} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →+ βf := rfl #align ring_hom.to_add_monoid_hom_eq_coef: α →+* βRingHom.toAddMonoidHom_eq_coe @[simp] theoremRingHom.toAddMonoidHom_eq_coe: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β), toAddMonoidHom f = ↑fcoe_addMonoidHom_mk (coe_addMonoidHom_mk: ∀ {α : Type u_2} {β : Type u_1} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α → β) (h₁ : f 1 = 1) (h₂ : ∀ (x_2 y : α), OneHom.toFun { toFun := f, map_one' := h₁ } (x_2 * y) = OneHom.toFun { toFun := f, map_one' := h₁ } x_2 * OneHom.toFun { toFun := f, map_one' := h₁ } y) (h₃ : OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) 0 = 0) (h₄ : ∀ (x_2 y : α), OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) (x_2 + y) = OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) x_2 + OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) y), ↑{ toMonoidHom := { toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }, map_zero' := h₃, map_add' := h₄ } = { toZeroHom := { toFun := f, map_zero' := h₃ }, map_add' := h₄ }f :f: α → βα →α: Type ?u.61625β) (β: Type ?u.61628h₁h₁: ?m.61644h₂h₂: ?m.61647h₃h₃: OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) 0 = 0h₄) : ((⟨⟨⟨h₄: ?m.61653f,f: α → βh₁⟩,h₁: ?m.61644h₂⟩,h₂: ?m.61647h₃,h₃: ?m.61650h₄⟩ :h₄: ?m.61653α →+*α: Type ?u.61625β) :β: Type ?u.61628α →+α: Type ?u.61625β) = ⟨⟨β: Type ?u.61628f,f: α → βh₃⟩,h₃: ?m.61650h₄⟩ := rfl #align ring_hom.coe_add_monoid_hom_mkh₄: ?m.61653RingHom.coe_addMonoidHom_mk /-- Copy of a `RingHom` with a new `toFun` equal to the old one. Useful to fix definitional equalities. -/ defRingHom.coe_addMonoidHom_mk: ∀ {α : Type u_2} {β : Type u_1} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α → β) (h₁ : f 1 = 1) (h₂ : ∀ (x_2 y : α), OneHom.toFun { toFun := f, map_one' := h₁ } (x_2 * y) = OneHom.toFun { toFun := f, map_one' := h₁ } x_2 * OneHom.toFun { toFun := f, map_one' := h₁ } y) (h₃ : OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) 0 = 0) (h₄ : ∀ (x_2 y : α), OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) (x_2 + y) = OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) x_2 + OneHom.toFun (↑{ toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }) y), ↑{ toMonoidHom := { toOneHom := { toFun := f, map_one' := h₁ }, map_mul' := h₂ }, map_zero' := h₃, map_add' := h₄ } = { toZeroHom := { toFun := f, map_zero' := h₃ }, map_add' := h₄ }copy (copy: {α : Type u_1} → {β : Type u_2} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → (f : α →+* β) → (f' : α → β) → f' = ↑f → α →+* βf :f: α →+* βα →+*α: Type ?u.62577β) (β: Type ?u.62580f' :f': α → βα →α: Type ?u.62577β) (β: Type ?u.62580h :h: f' = ↑ff' =f': α → βf) :f: α →+* βα →+*α: Type ?u.62577β :=β: Type ?u.62580{{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657ff: α →+* β.{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657toMonoidWithZeroHomtoMonoidWithZeroHom: {α : Type ?u.63460} → {β : Type ?u.63459} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →*₀ β.{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657copycopy: {M : Type ?u.63466} → {N : Type ?u.63465} → [inst : MulZeroOneClass M] → [inst_1 : MulZeroOneClass N] → (f : M →*₀ N) → (f' : M → N) → f' = ↑f → M →* N{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657f'f': α → β{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657hh: f' = ↑f,{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657ff: α →+* β.{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657toAddMonoidHomtoAddMonoidHom: {α : Type ?u.63514} → {β : Type ?u.63513} → [inst : NonAssocSemiring α] → [inst_1 : NonAssocSemiring β] → (α →+* β) → α →+ β.{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657copycopy: {M : Type ?u.63520} → {N : Type ?u.63519} → [inst : AddZeroClass M] → [inst_1 : AddZeroClass N] → (f : M →+ N) → (f' : M → N) → f' = ↑f → M →+ N{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657f'f': α → β{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657hh: f' = ↑f{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657with{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657} #align ring_hom.copy{ f.toMonoidWithZeroHom.copy f' h, f.toAddMonoidHom.copy f' h with }: ?m.63656 →+* ?m.63657RingHom.copy @[simp] theoremRingHom.copy: {α : Type u_1} → {β : Type u_2} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → (f : α →+* β) → (f' : α → β) → f' = ↑f → α →+* βcoe_copy (coe_copy: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β) (f' : α → β) (h : f' = ↑f), ↑(copy f f' h) = f'f :f: α →+* βα →+*α: Type ?u.64358β) (β: Type ?u.64361f' :f': α → βα →α: Type ?u.64358β) (β: Type ?u.64361h :h: f' = ↑ff' =f': α → βf) : ⇑(f: α →+* βf.f: α →+* βcopycopy: {α : Type ?u.65232} → {β : Type ?u.65231} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → (f : α →+* β) → (f' : α → β) → f' = ↑f → α →+* βf'f': α → βh) =h: f' = ↑ff' := rfl #align ring_hom.coe_copyf': α → βRingHom.coe_copy theorem copy_eq (RingHom.coe_copy: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β) (f' : α → β) (h : f' = ↑f), ↑(copy f f' h) = f'f :f: α →+* βα →+*α: Type ?u.65649β) (β: Type ?u.65652f' :f': α → βα →α: Type ?u.65649β) (β: Type ?u.65652h :h: f' = ↑ff' =f': α → βf) :f: α →+* βf.f: α →+* βcopycopy: {α : Type ?u.66523} → {β : Type ?u.66522} → {x : NonAssocSemiring α} → {x_1 : NonAssocSemiring β} → (f : α →+* β) → (f' : α → β) → f' = ↑f → α →+* βf'f': α → βh =h: f' = ↑ff := FunLike.ext'f: α →+* βh #align ring_hom.copy_eqh: f' = ↑fRingHom.copy_eq end coe section variable {RingHom.copy_eq: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β) (f' : α → β) (h : f' = ↑f), copy f f' h = f_ : NonAssocSemiring_: NonAssocSemiring αα} {α: Type ?u.67192_ : NonAssocSemiring_: NonAssocSemiring ββ} (β: Type ?u.67233f :f: α →+* βα →+*α: Type ?u.67230β) {β: Type ?u.67233xx: αy :y: αα} theoremα: Type ?u.91221congr_fun {congr_fun: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} {f g : α →+* β}, f = g → ∀ (x_2 : α), ↑f x_2 = ↑g x_2ff: α →+* βg :g: α →+* βα →+*α: Type ?u.67230β} (β: Type ?u.67233h :h: f = gf =f: α →+* βg) (g: α →+* βx :x: αα) :α: Type ?u.67230ff: α →+* βx =x: αgg: α →+* βx := FunLike.congr_funx: αhh: f = gx #align ring_hom.congr_funx: αRingHom.congr_fun theorem congr_arg (RingHom.congr_fun: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} {f g : α →+* β}, f = g → ∀ (x_2 : α), ↑f x_2 = ↑g x_2f :f: α →+* βα →+*α: Type ?u.68346β) {β: Type ?u.68349xx: αy :y: αα} (α: Type ?u.68346h :h: x = yx =x: αy) :y: αff: α →+* βx =x: αff: α →+* βy := FunLike.congr_argy: αff: α →+* βh #align ring_hom.congr_argh: x = yRingHom.congr_arg theorem coe_inj ⦃RingHom.congr_arg: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} (f : α →+* β) {x_2 y : α}, x_2 = y → ↑f x_2 = ↑f yff: α →+* βg :g: α →+* βα →+*α: Type ?u.69465β⦄ (β: Type ?u.69468h : (h: ↑f = ↑gf :f: α →+* βα →α: Type ?u.69465β) =β: Type ?u.69468g) :g: α →+* βf =f: α →+* βg := FunLike.coe_injectiveg: α →+* βh #align ring_hom.coe_injh: ↑f = ↑gRingHom.coe_inj @[ext] theoremRingHom.coe_inj: ∀ {α : Type u_1} {β : Type u_2} {x : NonAssocSemiring α} {x_1 : NonAssocSemiring β} ⦃f g : α →+* β⦄, ↑f = ↑g → f = g