1-- Equalizers of ring homomorphisms are subrings (ZF).2-- Part of Cumulus, the Grace17 mathematics library.3-- Copyright (c) 2026 Grant Passmore.4-- Released under the Apache License 2.0. See LICENSE in the repository root.5-- Authors: Grant Passmore67module Grace.Cumulus.Algebra.Ring.Equalizer8import Subring910def ringEqualizer (f g A : Set) : Set:= {x ∈ A | f(x) = g(x)}1112section Homomorphisms13variable (A add zero neg mul one B plus z minus times unit f g : Set)14notationring R := (A, add, zero, neg, mul, one)15notationring S := (B, plus, z, minus, times, unit)16hypothesisring : IsCommRing(R)17hypothesis first : IsRingHom(f, R, S)18hypothesis second : IsRingHom(g, R, S)1920theorem ringEqualizer.subring21shows IsSubring(R, ringEqualizer(f, g, A))22proof23have ordinary := IsCommRing.ring withring24have zeroIn := IsRing.zero_in_carrier with ordinary25have multiplicative := IsRing.multiplicative with ordinary26have oneIn := IsMonoid.unit_in_carrier with multiplicative27have firstZero := IsRingHom.zero with first28have secondZero := IsRingHom.zero with second29have firstOne := IsRingHom.one with first30have secondOne := IsRingHom.one with second31have subset : ringEqualizer(f, g, A) ⊆ A32intros x hx33have data := ringEqualizer.membership.forward with hx34exact data.left35unfold IsSubring36refine⟨subset, ⟨?_, ⟨?_, ⟨?_, ⟨?_, ?_⟩⟩⟩⟩⟩37 . apply ringEqualizer.membership.backward at f, g, A, zero38constructor39 . exact zeroIn40 . cc41 . apply ringEqualizer.membership.backward at f, g, A, one42constructor43 . exact oneIn44 . cc45intros x hx46obtain⟨member, equal⟩:= ringEqualizer.membership.forward with hx47have closed := IsRing.neg_closed with ordinary, member48haveleft:= IsRingHom.neg with first, member49haveright:= IsRingHom.neg with second, member50apply ringEqualizer.membership.backward51constructor52 . exact closed53 . cc54intros x hx y hy55obtain⟨memberX, equalX⟩:= ringEqualizer.membership.forward with hx56obtain⟨memberY, equalY⟩:= ringEqualizer.membership.forward with hy57have closed := IsRing.add_closed with ordinary, memberX, memberY58haveleft:= IsRingHom.add with first, memberX, memberY59haveright:= IsRingHom.add with second, memberX, memberY60apply ringEqualizer.membership.backward61constructor62 . exact closed63 . cc64intros x hx y hy65obtain⟨memberX, equalX⟩:= ringEqualizer.membership.forward with hx66obtain⟨memberY, equalY⟩:= ringEqualizer.membership.forward with hy67have closed := IsRing.mul_closed with ordinary, memberX, memberY68haveleft:= IsRingHom.mul with first, memberX, memberY69haveright:= IsRingHom.mul with second, memberX, memberY70apply ringEqualizer.membership.backward71constructor72 . exact closed73 . cc7475end Homomorphisms76