English
We show that Mat_ C has finite biproducts; a constructive embedding is given via a sigma-indexed total object.
Русский
Показано, что Mat_ C имеет конечные бипроизводные; конструируемый embedding через сигма‑индексированное суммарное изделие.
LaTeX
$$HasFiniteBiproducts (Mat_ C)$$
Lean4
/-- We now prove that `Mat_ C` has finite biproducts.
Be warned, however, that `Mat_ C` is not necessarily Krull-Schmidt,
and so the internal indexing of a biproduct may have nothing to do with the external indexing,
even though the construction we give uses a sigma type.
See however `isoBiproductEmbedding`.
-/
instance hasFiniteBiproducts : HasFiniteBiproducts (Mat_ C) where
out
n :=
{
has_biproduct := fun f =>
hasBiproduct_of_total
{ pt := ⟨Σ j, (f j).ι, fun p => (f p.1).X p.2⟩
π := fun j x y => by
refine if h : x.1 = j then ?_ else 0
refine if h' : @Eq.ndrec (Fin n) x.1 (fun j => (f j).ι) x.2 _ h = y then ?_ else 0
apply eqToHom
substs h h'
rfl
-- Notice we were careful not to use `subst` until we had a goal in `Prop`.
ι := fun j x y => by
refine if h : y.1 = j then ?_ else 0
refine if h' : @Eq.ndrec _ y.1 (fun j => (f j).ι) y.2 _ h = x then ?_ else 0
apply eqToHom
substs h h'
rfl
ι_π := fun j j' => by
ext x y
dsimp
simp_rw [dite_comp, comp_dite]
simp only [ite_self, dite_eq_ite, Limits.comp_zero, Limits.zero_comp, eqToHom_trans]
erw [Finset.sum_sigma]
dsimp
simp only [if_true, Finset.sum_dite_irrel, Finset.mem_univ, Finset.sum_const_zero, Finset.sum_dite_eq']
split_ifs with h h'
· substs h h'
simp only [CategoryTheory.eqToHom_refl, CategoryTheory.Mat_.id_apply_self]
· subst h
rw [eqToHom_refl, id_apply_of_ne _ _ _ h']
· rfl }
(by
dsimp
ext1 ⟨i, j⟩
rintro ⟨i', j'⟩
rw [Finset.sum_apply, Finset.sum_apply]
dsimp
rw [Finset.sum_eq_single i]; rotate_left
· intro b _ hb
apply Finset.sum_eq_zero
intro x _
rw [dif_neg hb.symm, zero_comp]
· intro hi
simp at hi
rw [Finset.sum_eq_single j]; rotate_left
· intro b _ hb
rw [dif_pos rfl, dif_neg, zero_comp]
simp only
tauto
· intro hj
simp at hj
simp only [eqToHom_refl, dite_eq_ite, ite_true, Category.id_comp, Sigma.mk.inj_iff, id_def]
by_cases h : i' = i
· subst h
rw [dif_pos rfl]
simp only [heq_eq_eq, true_and]
by_cases h : j' = j
· subst h
simp
· rw [dif_neg h, dif_neg (Ne.symm h)]
· rw [dif_neg h, dif_neg]
tauto) }