Zulip Chat Archive

Stream: mathlib4

Topic: Tip on shortening code


Nicolas Rolland (Aug 11 2024 at 08:31):

Is there any trick to avoid writing this long mess of isos that is plug below ?

import Mathlib.CategoryTheory.Monoidal.Types.Basic
import Mathlib.CategoryTheory.Products.Associator
import Mathlib.CategoryTheory.Products.Basic

namespace CategoryTheory

variable (A B C D : Type*) [Category A] [Category B] [Category C] [Category D]

abbrev Dist := Dᵒᵖ × C  Type

def times (P : Dist A B) (Q: Dist C D) :  Dist (A × C) (B × D) :=
  let plug  : (B × D)ᵒᵖ  × (A × C)  (Bᵒᵖ × A) × Dᵒᵖ × C  :=
    Functor.prod ((prodOpEquiv B).functor) (𝟭 _)  prod.associator _ _ _ 
    Functor.prod (𝟭 _)  (prod.inverseAssociator  _ _ _ ) 
    Functor.prod (𝟭 _) (Functor.prod (Prod.swap _ _) (𝟭 _) ) 
     Functor.prod (𝟭 _) (prod.associator _ _ _) 
    (prod.inverseAssociator  _ _ _ )
  plug  Functor.prod P Q  MonoidalCategory.tensor Type

end CategoryTheory

Hopefully by coherence might help with some parts once I have #15258 in (which gives a monoidal instance for Cat)

Floris van Doorn (Aug 15 2024 at 18:59):

You can teach calc to write compositions of functors and gcongr to apply Functor.prod (assuming that gcongr is willing to produce data, not just proofs). That will not make your definition shorter, but almost certainly more readable.


Last updated: May 02 2025 at 03:31 UTC