Library UniMath.CategoryTheory.Monoidal.ModuleSignatures


Require Import UniMath.Foundations.All.
Require Import UniMath.MoreFoundations.All.

Require Import UniMath.CategoryTheory.Core.Categories.
Require Import UniMath.CategoryTheory.Core.Functors.

Require Import UniMath.CategoryTheory.Limits.Graphs.Limits.
Require Import UniMath.CategoryTheory.Limits.Graphs.Colimits.

Require Import UniMath.CategoryTheory.Monoidal.WhiskeredBifunctors.
Require Import UniMath.CategoryTheory.Monoidal.Categories.
Require Import UniMath.CategoryTheory.Monoidal.CategoriesOfMonoids.
Require Import UniMath.CategoryTheory.Monoidal.RModules.
Require Import UniMath.CategoryTheory.Monoidal.TotalCategoriesOfRModules.

Require Import UniMath.CategoryTheory.DisplayedCats.Core.
Require Import UniMath.CategoryTheory.DisplayedCats.Constructions.DisplayedSections.

Import BifunctorNotations.
Import MonoidalNotations.

Local Open Scope cat.
Local Open Scope moncat.
Local Open Scope mor_disp_scope.

Section ModuleSignatures.
  Context {C : monoidal_cat}.

  Local Notation "x ⊗l f" := (x ⊗^{C}_{l} f) (at level 31).
  Local Notation "f ⊗r y" := (f ⊗^{C}_{r} y) (at level 31).

1. Definitions
2. Two examples of module signatures

  Definition trivial_signature_data : module_signature_data.
  Proof.
    use tpair; cbn.
    - intro; use trivial_module.
    - intros R R' [f H_f].
      exists f.
      abstract (
        unfold is_module_mor; cbn;
        rewrite assoc; use (pr1 H_f)
      ).
  Defined.

  Lemma trivial_signature_axioms
    : module_signature_axioms trivial_signature_data.
  Proof.
    split; intros;
    (use invmap; [|use path_sigma_hprop|]);
    now try use isaprop_is_module_mor.
  Qed.

  Definition trivial_signature : module_signature_cat
    := trivial_signature_data ,, trivial_signature_axioms.

  Lemma product_module_signature_lemma (Σ : module_signature_cat) (D : C)
    (R R' : MON C) (f : R --> R') (Σf := section_disp_on_morphisms (pr1 Σ) f)
    : is_module_mor _ _
        (pr2 (product_module _ _ _ _ (pr2 (Σ R))))
        (pullback_functor_funct _ (pr2 (product_module _ _ _ D (pr2 (Σ R')))) _ (pr2 f))
        (D l pr1 Σf).
  Proof.
    unfold is_module_mor; cbn; do 2 rewrite assoc.
    symmetry; etrans; etrans.
    - rewrite <- assoc; use maponpaths; [shelve|symmetry].
      use (bifunctor_leftcomp C).
    - do 2 (use maponpaths; [shelve|]);
      use (!pr2 Σf).
    - rewrite (bifunctor_leftcomp C), assoc, (monoidal_associatornatleftright C), <- assoc.
      use maponpaths; [shelve|cbn].
      now rewrite (bifunctor_leftcomp C), assoc, (monoidal_associatornatleft C).
    - now do 2 rewrite assoc.
  Qed.

  Definition product_signature_data (Σ : module_signature_cat) (D : C)
    : module_signature_data.
  Proof.
    use tpair; cbn.
    - intro R; use (product_module _ _ _ D (pr2 (Σ R))).
    - intros R R' f; pose (section_disp_on_morphisms (pr1 Σ) f) as Σf.
      exists (D l pr1 Σf); use product_module_signature_lemma.
  Defined.

  Lemma product_signature_axioms (Σ : module_signature_cat) (D : C)
    : module_signature_axioms (product_signature_data Σ D).
  Proof.
    split.
    - intro R; use invmap; [|use path_sigma_hprop|].
      use isaprop_is_module_mor.
      cbn; etrans.
      + do 2 (use maponpaths; [shelve|]); use (pr12 Σ R).
      + cbn; now rewrite tensor_mor_left, tensor_id_id.
    - intros R R' R'' f g; use invmap; [|use path_sigma_hprop|].
      use isaprop_is_module_mor.
      cbn; etrans.
      + do 2 (use maponpaths; [shelve|]); use (pr22 Σ R).
      + use (bifunctor_leftcomp C).
  Qed.

  Definition product_signature (Σ : module_signature_cat) (D : C)
    : module_signature_cat
    := product_signature_data Σ D,, product_signature_axioms Σ D.

3. Evaluation functor (for some fixed monoid R)

  Context (R : MON C).
  Let MOD_R := MOD (pr1 R) (pr2 R).

  Definition signature_evaluation_data
    : functor_data module_signature_cat MOD_R.
  Proof.
    use make_functor_data.
    - intro Σ; exact (Σ R).
    - intros Σ Σ' [f _]; induction (f R) as [fR H].
      exists fR.
      abstract (
        cbn in fR, H |- *;
        unfold is_module_mor, pullback_functor_funct in *;
        cbn in fR, H |- *;
        etrans;
        [|use H];
        now rewrite assoc, tensor_mor_left, tensor_id_id, id_right
      ).
  Defined.

  Lemma signature_evaluation_is_functor
    : is_functor signature_evaluation_data.
  Proof.
    split.
    - intro Σ; use invmap; [|use path_sigma_hprop|].
      use isaprop_is_module_mor.
      easy.
    - intros Σ Σ' Σ'' f g; use invmap; [|use path_sigma_hprop|].
      use isaprop_is_module_mor.
      cbn; unfold mor_disp; cbn.
      now rewrite transportf_total2, transportf_const.
  Qed.

  Definition signature_evaluation : module_signature_cat MOD_R
    := make_functor signature_evaluation_data signature_evaluation_is_functor.
End ModuleSignatures.