Imports
/- Copyright (c) 2026 Terence Rokop. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Terence Rokop -/ module public import Geb.Mathlib.CategoryTheory.FinSetSkel.Shapes.Core

Monomorphisms of FinSetSkel

A morphism is a monomorphism exactly when its vector is injective.

Main statements

    FinSetSkel.mono_iff_injective — monomorphisms are the morphisms with injective vectors.

Implementation notes

CategoryTheory.Mono and CategoryTheory.Category are both axiom-free, so the statement belongs in the choice-free layer, and the proof is direct over vectors: the forward direction tests a morphism against two points, and the reverse is FinSetSkel.hom_ext.

It supplies the hypothesis Vector.invOfInjective takes, and so is a prerequisite of the subobject classifier rather than a free-standing characterisation.

Tags

finite sets, skeleton, monomorphism, injective

@[expose] public sectionuniverse uopen CategoryTheorynamespace FinSetSkel

A morphism is a monomorphism exactly when its vector is injective.

theorem mono_iff_injective {X Y : FinSetSkel.{u}} {f : X Y} : Mono f Function.Injective f.toVec.get := X:FinSetSkelY:FinSetSkelf:X YMono f Function.Injective (Hom.toVec f).get X:FinSetSkelY:FinSetSkelf:X YMono f Function.Injective (Hom.toVec f).getX:FinSetSkelY:FinSetSkelf:X YFunction.Injective (Hom.toVec f).get Mono f X:FinSetSkelY:FinSetSkelf:X YMono f Function.Injective (Hom.toVec f).get X:FinSetSkelY:FinSetSkelf:X Yhm:Mono fi:Fin X.lenj:Fin X.lenhij:(Hom.toVec f).get i = (Hom.toVec f).get ji = j X:FinSetSkelY:FinSetSkelf:X Yhm:Mono fi:Fin X.lenj:Fin X.lenhij:(Hom.toVec f).get i = (Hom.toVec f).get jh:point i f = point j fi = j X:FinSetSkelY:FinSetSkelf:X Yhm:Mono fi:Fin X.lenj:Fin X.lenhij:(Hom.toVec f).get i = (Hom.toVec f).get jh:point i f = point j fhp:point i = point ji = j X:FinSetSkelY:FinSetSkelf:X Yhm:Mono fi:Fin X.lenj:Fin X.lenhij:(Hom.toVec f).get i = (Hom.toVec f).get jh:point i f = point j fhp:point i = point jthis:(Hom.toVec (point i)).get 0 = (Hom.toVec (point j)).get 0i = j All goals completed! 🐙 X:FinSetSkelY:FinSetSkelf:X YFunction.Injective (Hom.toVec f).get Mono f X:FinSetSkelY:FinSetSkelf:X Yhinj:Function.Injective (Hom.toVec f).getMono f X:FinSetSkelY:FinSetSkelf:X Yhinj:Function.Injective (Hom.toVec f).get {Z : FinSetSkel} (g h : Z X), g f = h f g = h X:FinSetSkelY:FinSetSkelf:X Yhinj:Function.Injective (Hom.toVec f).getZ:FinSetSkelg:Z Xh:Z Xhgh:g f = h fg = h exact hom_ext fun t hinj (X:FinSetSkelY:FinSetSkelf:X Yhinj:Function.Injective (Hom.toVec f).getZ:FinSetSkelg:Z Xh:Z Xhgh:g f = h ft:Fin Z.len(Hom.toVec f).get ((Hom.toVec g).get t) = (Hom.toVec f).get ((Hom.toVec h).get t) X:FinSetSkelY:FinSetSkelf:X Yhinj:Function.Injective (Hom.toVec f).getZ:FinSetSkelg:Z Xh:Z Xhgh:g f = h ft:Fin Z.lenthis:(Hom.toVec (g f)).get t = (Hom.toVec (h f)).get t(Hom.toVec f).get ((Hom.toVec g).get t) = (Hom.toVec f).get ((Hom.toVec h).get t) All goals completed! 🐙)
end FinSetSkel