Zulip Chat Archive

Stream: general

Topic: show that isomorphism between rings is an equivalence relati


ZHAO Jinxiang (Dec 14 2024 at 15:49):

I don't know how to define isomorphism between rings is an equivalence relation in lean

RingEquiv support two Type* parameters

structure RingEquiv (R S : Type*) [Mul R] [Mul S] [Add R] [Add S] extends R  S, R ≃* S, R ≃+ S

Equivalence support only one Sort u parameter

structure Equivalence {α : Sort u} (r : α  α  Prop) : Prop

So it will not type check to use both of them.

Is there anyone who know how to define this?

Christian Merten (Dec 14 2024 at 16:07):

The α in docs#Equivalence is the domain of the relation r. You should think about what (informally) the domain of your relation is. This might lead you to a definition like this:

Then you can define a predicate IsIsomorphic : α → α → Prop where α is the domain of your relation.

Full example

ZHAO Jinxiang (Dec 14 2024 at 16:56):

@Christian Merten Thank you very much. It helps me a lot.

ZHAO Jinxiang (Dec 14 2024 at 17:01):

import Mathlib.Algebra.Category.Ring.Basic
import Mathlib.CategoryTheory.IsomorphismClasses

/-- show that isomorphism between rings is an equivalence relation -/
lemma equivalence_isIsomorphic : Equivalence (@CategoryTheory.IsIsomorphic RingCat _) :=
{
  refl := by
    intro X
    constructor
    exact {
      hom := by
        -- we need add hom here, can I add `id` ring hom here?
        show X  X
        sorry
      inv := by sorry
      hom_inv_id := by
        sorry
      inv_hom_id := by
        sorry
    }
  symm := by
    intro X Y
    sorry
  trans := by
    intro X Y Z
    sorry
}

What should I provide If there need provide quiver X ⟶ X? I want to provide id function here.

Eric Wieser (Dec 14 2024 at 17:07):

Note that with a little help, exact? can solve all of these:

lemma equivalence_isIsomorphic : Equivalence (@CategoryTheory.IsIsomorphic RingCat _) where
  refl X := by
    constructor
    exact?
  symm e := by
    cases e
    constructor
    exact?
  trans e f := by
    cases e
    cases f
    constructor
    exact?

ZHAO Jinxiang (Dec 14 2024 at 17:10):

If I use exact? in show X ⟶ X, it will be exact CategoryTheory.CategoryStruct.id X

But I want to find a function which can convert RingHomId to quiver X ⟶ X

Eric Wieser (Dec 14 2024 at 17:11):

exact CategoryTheory.CategoryStruct.id X sounds right to me

Eric Wieser (Dec 14 2024 at 17:12):

I think the function you're looking for is docs#RingCat.ofHom, but it's not the right tool to use here

ZHAO Jinxiang (Dec 14 2024 at 17:15):

Thank you.

exact RingCat.ofHom (RingHom.id X)

This works well for me.

Eric Wieser (Dec 14 2024 at 17:20):

Here's the proof you really want:

lemma equivalence_isIsomorphic : Equivalence (@CategoryTheory.IsIsomorphic RingCat _) :=
  (CategoryTheory.isIsomorphicSetoid _).iseqv

(docs#CategoryTheory.isIsomorphicSetoid)

ZHAO Jinxiang (Dec 14 2024 at 19:49):

Thanks. I finished this

import Mathlib.Algebra.Category.Ring.Basic
import Mathlib.CategoryTheory.IsomorphismClasses

/-- show that isomorphism between rings is an equivalence relation -/
lemma equivalence_isIsomorphic : Equivalence (@CategoryTheory.IsIsomorphic RingCat _) :=
{
  refl := fun X => {
    hom := RingCat.ofHom (RingHom.id X)
    inv := RingCat.ofHom (RingHom.id X)
    hom_inv_id := rfl
    inv_hom_id := rfl
  }
  symm := fun ϕ, ϕ', hom_inv_id, inv_hom_id => {
    hom := ϕ'
    inv := ϕ
    hom_inv_id := inv_hom_id
    inv_hom_id := hom_inv_id
  }
  trans := fun {X Y Z} ϕ, ϕ', hom_inv_id_ϕ, inv_hom_id_ϕ ψ, ψ', hom_inv_id_ψ, inv_hom_id_ψ => by
    -- we have hypotheses ϕ, ϕ', ψ, ψ' such that ϕ' ∘ ϕ = id X, ϕ ∘ ϕ' = id Y, ψ' ∘ ψ = id Y, ψ ∘ ψ' = id Z
    replace hom_inv_id_ψ: ψ'.comp ψ = RingHom.id Y := hom_inv_id_ψ;
    replace inv_hom_id_ϕ: ϕ.comp ϕ' = RingHom.id Y := inv_hom_id_ϕ;
    replace hom_inv_id_ϕ: ϕ'.comp ϕ = RingHom.id X := hom_inv_id_ϕ;
    replace inv_hom_id_ψ: ψ.comp ψ' = RingHom.id Z := inv_hom_id_ψ;
    exact {
      hom := RingCat.ofHom (ψ.comp ϕ)
      inv := RingCat.ofHom (ϕ'.comp ψ')
      hom_inv_id := by
        -- we need prove that ((ϕ'.comp ψ').comp ψ).comp ϕ = RingHom.id X
        show ((ϕ'.comp ψ').comp ψ).comp ϕ = RingHom.id X
        -- by comp assoc
        show (ϕ'.comp (ψ'.comp ψ)).comp ϕ = RingHom.id X
        -- using ψ' ∘ ψ = id Y
        rw [hom_inv_id_ψ]
        show (ϕ'.comp (RingHom.id Y)).comp ϕ = RingHom.id X
        simp;
        -- using ϕ' ∘ ϕ = id X
        exact hom_inv_id_ϕ
      inv_hom_id := by
        -- we need prove that ((ψ.comp ϕ).comp ϕ').comp ψ' = RingHom.id Z
        show ((ψ.comp ϕ).comp ϕ').comp ψ' = RingHom.id Z
        -- by comp assoc
        show (ψ.comp (ϕ.comp ϕ')).comp ψ' = RingHom.id Z
        -- using ϕ ∘ ϕ' = id Y
        rw [inv_hom_id_ϕ]
        show (ψ.comp (RingHom.id Y)).comp ψ' = RingHom.id Z
        simp;
        -- using ψ ∘ ψ' = id Z
        exact inv_hom_id_ψ
    }
}

ZHAO Jinxiang (Dec 14 2024 at 20:03):

The operator " ∘ " stands for Function.comp.
Is there any operator stands for RingHom.comp?

Edward van de Meent (Dec 14 2024 at 20:17):

unfortunately, no

Edward van de Meent (Dec 14 2024 at 21:03):

a small experiment in making a (limited) notation class for :

import Mathlib

universe u1 u2 u3 v1 v2 v3 ul ur u
set_option autoImplicit false

class HComp {hl : Type u1  Type v1} {hm : Type u2  Type v2} {hr : Type u3  Type v3}
    (F₁ : (L:Type u1)  (M: Type u2)  (hl L)  (hm M)  Type ul)
    [ L:Type u1,  instL:hl L,  M: Type u2,  instM: hm M, FunLike (F₁ L M instL instM) L M]
    (F₂ : (M:Type u2)  (R: Type u3)  (hm M)  (hr R)  Type (ur))
    [ M:Type u2,  instM:hm M,  R: Type u3,  instR: hr R, FunLike (F₂ M R instM instR) M R]
    (F₃ : outParam ((L : Type u1)  (R : Type u3)  (hl L)  (hr R)  Type u))
    [ L:Type u1,  instL:hl L,  R: Type u3,  instR: hr R, FunLike (F₃ L R instL instR) L R]
    where
  private hcomp' :  {L:Type u1},  {instL:hl L},  {M: Type u2},  {instM: hm M}, {R: Type u3},  {instR: hr R},
    F₂ M R instM instR  F₁ L M instL instM  F₃ L R instL instR

section
variable {hl : Type u1  Type v1} {hm : Type u2  Type v2} {hr : Type u3  Type v3}
    {F₁ : (L:Type u1)  (M: Type u2)  (hl L)  (hm M)  Type ul}
    [ L:Type u1,  instL:hl L,  M: Type u2,  instM: hm M, FunLike (F₁ L M instL instM) L M]
    {F₂ : (M:Type u2)  (R: Type u3)  (hm M)  (hr R)  Type (ur)}
    [ M:Type u2,  instM:hm M,  R: Type u3,  instR: hr R, FunLike (F₂ M R instM instR) M R]
    {F₃ : outParam ((L : Type u1)  (R : Type u3)  (hl L)  (hr R)  Type u)}
    [ L:Type u1,  instL:hl L,  R: Type u3,  instR: hr R, FunLike (F₃ L R instL instR) L R]
    [HComp F₁ F₂ F₃]
    {L : Type u1} {M : Type u2} {R : Type u3} {instL : hl L} {instM : hm M} {instR : hr R}
    (f : F₂ M R instM instR) (g : F₁ L M instL instM)
def HComp.hcomp : F₃ L R instL instR := HComp.hcomp' f g
end

instance : HComp (RingHom) (RingHom) (RingHom) where
  hcomp' φ₁ φ₂ := φ₁.comp φ₂

local infix:49 "h∘" => HComp.hcomp

variable {R₁ R₂ R₃: Type*} [Ring R₁] [Ring R₂] [Ring R₃] (σ₁ : R₂ →+* R₃) (σ₂ : R₁ →+* R₂)

#check σ₁ h σ₂

Edward van de Meent (Dec 14 2024 at 21:04):

it is "possible" to make the notation work for RingHom.comp, AddHom.comp, etc. but only up to a point, as this only works when the FunLike type you're writing an instance for has the exact right amount of arguments in the right order. so no notation for LinearMap.comp.

Edward van de Meent (Dec 14 2024 at 21:05):

also, i imagine that rewriting all the api (particularly simp lemmas) to use this will not be worth it.

Edward van de Meent (Dec 14 2024 at 21:08):

note that the F1 F2 F3 approach is required to enable universe polymorphism.

Jireh Loreaux (Dec 14 2024 at 21:40):

Actually, we do have notation for composition of linear maps, it's \circ\_l, but indeed we do not have any unified notation.

Eric Wieser (Dec 14 2024 at 22:01):

Perhaps worth remembering that the code above is using category theory, and the category theory library _does_ have a unified notation, as long as you stick with the Quiver.Homs and don't try to unfold to RingHom

ZHAO Jinxiang (Dec 15 2024 at 07:59):

Also I have a question that Is there anything like show for hypotheses?

I want to write something like

show hom_inv_id_ψ: ψ'.comp ψ = RingHom.id Y

I could not find it so I wrote a weird code replace hom_inv_id_ψ: ψ'.comp ψ = RingHom.id Y := hom_inv_id_ψ;

Ruben Van de Velde (Dec 15 2024 at 08:08):

change ... at h, but all of those are a sign of missing API

Christian Merten (Dec 15 2024 at 08:45):

This is because you are on an old version of mathlib. On current master, we have API for this, e.g.

import Mathlib.Algebra.Category.Ring.Basic

open CategoryTheory

example {R S : RingCat} (f : R  S) (g : S  R) (h : f  g = 𝟙 R) :
    g.hom.comp f.hom = RingHom.id R := by
  rwa [RingCat.hom_ext_iff, RingCat.hom_comp, RingCat.hom_id] at h

Last updated: May 02 2025 at 03:31 UTC