Library UniMath.CategoryTheory.Hyperdoctrines.PartialEqRels.Logic.SubobjectDispCat

1. Subobjects of partial setoids

  Definition per_subobject_def_law
             {X : partial_setoid H}
             (Ο† : form X)
    : UU
    := let x := Ο€β‚‚ (tm_var (πŸ™ Γ—h X)) in
       (⊀ ⊒ βˆ€h (Ο† [ x ] β‡’ x ~ x)).

  Definition per_subobject_eq_law
             {X : partial_setoid H}
             (Ο† : form X)
    : UU
    := let x := Ο€β‚‚ (π₁ (tm_var ((πŸ™ Γ—h X) Γ—h X))) in
       let y := Ο€β‚‚ (tm_var ((πŸ™ Γ—h X) Γ—h X)) in
       (⊀ ⊒ βˆ€h βˆ€h (x ~ y β‡’ Ο† [ x ] β‡’ Ο† [ y ])).

  Definition per_subobject_laws
             {X : partial_setoid H}
             (Ο† : form X)
    : UU
    := per_subobject_def_law Ο†
       Γ—
       per_subobject_eq_law Ο†.

  Proposition isaprop_per_subobject_laws
              {X : partial_setoid H}
              (Ο† : form X)
    : isaprop (per_subobject_laws Ο†).
  Proof.
    use isapropdirprod ;
      use invproofirrelevance ;
      intros p q ;
      apply hyperdoctrine_proof_eq.
  Qed.

  Definition per_subobject
             (X : partial_setoid H)
    : UU
    := βˆ‘ (Ο† : form X), per_subobject_laws Ο†.

  Definition make_per_subobject
             {X : partial_setoid H}
             (Ο† : form X)
             (HΟ† : per_subobject_laws Ο†)
    : per_subobject X
    := Ο† ,, HΟ†.

  Proposition isaset_per_subobject
              (X : partial_setoid H)
    : isaset (per_subobject X).
  Proof.
    use isaset_total2.
    - apply isaset_hyperdoctrine_formula.
    - intro ψ.
      apply isasetaprop.
      apply isaprop_per_subobject_laws.
  Qed.

2. Accessors for subobjects of partial setoids

  Coercion per_subobject_to_form
           {X : partial_setoid H}
           (Ο† : per_subobject X)
    : form X
    := pr1 Ο†.

  Proposition per_subobject_def
              {X : partial_setoid H}
              (Ο† : per_subobject X)
              {Ξ“ : ty H}
              {Ξ” : form Ξ“}
              (x : tm Ξ“ X)
              (p : Ξ” ⊒ Ο† [ x ])
    : Ξ” ⊒ x ~ x.
  Proof.
    use (impl_elim p).
    pose proof (hyperdoctrine_proof_subst (!! : tm Ξ“ πŸ™) (pr12 Ο†)) as q.
    cbn in q.
    rewrite forall_subst in q.
    pose proof (q' := forall_elim q x) ; clear q.
    rewrite hyperdoctrine_comp_subst in q'.
    rewrite impl_subst in q'.
    rewrite partial_setoid_subst in q'.
    rewrite hyperdoctrine_pr2_subst in q'.
    rewrite var_tm_subst in q'.
    rewrite hyperdoctrine_pair_subst in q'.
    rewrite hyperdoctrine_pair_pr2 in q'.
    rewrite hyperdoctrine_pr2_subst in q'.
    rewrite var_tm_subst in q'.
    rewrite hyperdoctrine_pair_pr2 in q'.
    rewrite hyperdoctrine_comp_subst in q'.
    rewrite hyperdoctrine_pr2_subst in q'.
    rewrite var_tm_subst in q'.
    rewrite hyperdoctrine_pair_pr2 in q'.
    rewrite truth_subst in q'.
    refine (hyperdoctrine_cut _ q').
    apply truth_intro.
  Qed.

  Proposition per_subobject_eq
              {X : partial_setoid H}
              (Ο† : per_subobject X)
              {Ξ“ : ty H}
              {Ξ” : form Ξ“}
              {x y : tm Ξ“ X}
              (p₁ : Ξ” ⊒ x ~ y)
              (pβ‚‚ : Ξ” ⊒ Ο† [ x ])
    : Ξ” ⊒ Ο† [ y ].
  Proof.
    use (impl_elim pβ‚‚).
    use (impl_elim p₁).
    pose proof (hyperdoctrine_proof_subst (!! : tm Ξ“ πŸ™) (pr22 Ο†)) as q.
    cbn in q.
    rewrite truth_subst in q.
    rewrite !forall_subst in q.
    rewrite !impl_subst in q.
    rewrite !partial_setoid_subst in q.
    rewrite !hyperdoctrine_comp_subst in q.
    rewrite !hyperdoctrine_pr2_subst in q.
    rewrite !hyperdoctrine_pr1_subst in q.
    rewrite !var_tm_subst in q.
    rewrite hyperdoctrine_pair_pr1 in q.
    rewrite hyperdoctrine_pair_pr2 in q.
    rewrite hyperdoctrine_pair_subst in q.
    rewrite hyperdoctrine_pair_pr2 in q.
    rewrite hyperdoctrine_pr2_subst in q.
    rewrite !var_tm_subst in q.
    pose proof (q' := forall_elim q x) ; clear q.
    rewrite forall_subst in q'.
    rewrite !impl_subst in q'.
    rewrite !partial_setoid_subst in q'.
    rewrite !hyperdoctrine_comp_subst in q'.
    rewrite !hyperdoctrine_pr2_subst in q'.
    rewrite !hyperdoctrine_pr1_subst in q'.
    rewrite !var_tm_subst in q'.
    rewrite hyperdoctrine_pair_pr1 in q'.
    rewrite hyperdoctrine_pair_pr2 in q'.
    rewrite hyperdoctrine_pair_subst in q'.
    rewrite hyperdoctrine_pair_pr2 in q'.
    pose proof (q'' := forall_elim q' y) ; clear q'.
    rewrite !impl_subst in q''.
    rewrite !partial_setoid_subst in q''.
    rewrite !hyperdoctrine_comp_subst in q''.
    rewrite !tm_subst_comp in q''.
    rewrite !hyperdoctrine_pr1_subst in q''.
    rewrite !hyperdoctrine_pr2_subst in q''.
    rewrite !var_tm_subst in q''.
    rewrite hyperdoctrine_pair_pr1 in q''.
    rewrite hyperdoctrine_pair_pr2 in q''.
    rewrite !tm_subst_var in q''.
    refine (hyperdoctrine_cut _ q'').
    apply truth_intro.
  Qed.

3. Morphisms between subobjects of partial setoids

  Definition per_subobject_mor_law
             {X Y : partial_setoid H}
             (Ο† : partial_setoid_morphism X Y)
             (Οˆβ‚ : per_subobject X)
             (Οˆβ‚‚ : per_subobject Y)
    : UU
    := let x := Ο€β‚‚ (π₁ (tm_var ((πŸ™ Γ—h X) Γ—h Y))) in
       let y := Ο€β‚‚ (tm_var ((πŸ™ Γ—h X) Γ—h Y)) in
       (⊀ ⊒ βˆ€h βˆ€h (Ο† [ ⟨ x , y ⟩ ] β‡’ Οˆβ‚ [ x ] β‡’ Οˆβ‚‚ [ y ])).

  Arguments per_subobject_mor_law {X Y} Ο† Οˆβ‚ Οˆβ‚‚ /.

  Proposition isaprop_per_subobject_mor_law
              {X Y : partial_setoid H}
              (Ο† : partial_setoid_morphism X Y)
              (Οˆβ‚ : per_subobject X)
              (Οˆβ‚‚ : per_subobject Y)
    : isaprop (per_subobject_mor_law Ο† Οˆβ‚ Οˆβ‚‚).
  Proof.
    use invproofirrelevance.
    intros p q.
    apply hyperdoctrine_proof_eq.
  Qed.

  Proposition per_subobject_mor
              {X Y : partial_setoid H}
              {Ο† : partial_setoid_morphism X Y}
              {Οˆβ‚ : per_subobject X}
              {Οˆβ‚‚ : per_subobject Y}
              (p : per_subobject_mor_law Ο† Οˆβ‚ Οˆβ‚‚)
              {Ξ“ : ty H}
              {Ξ” : form Ξ“}
              {x : tm Ξ“ X}
              {y : tm Ξ“ Y}
              (q₁ : Ξ” ⊒ Ο† [ ⟨ x , y ⟩ ])
              (qβ‚‚ : Ξ” ⊒ Οˆβ‚ [ x ])
    : Ξ” ⊒ Οˆβ‚‚ [ y ].
  Proof.
    use (impl_elim qβ‚‚).
    use (impl_elim q₁).
    pose proof (hyperdoctrine_proof_subst (!! : tm Ξ“ πŸ™) p) as r.
    cbn in r.
    rewrite truth_subst in r.
    rewrite !forall_subst in r.
    rewrite !impl_subst in r.
    rewrite !hyperdoctrine_comp_subst in r.
    rewrite !hyperdoctrine_pr2_subst in r.
    rewrite !hyperdoctrine_pr1_subst in r.
    rewrite !var_tm_subst in r.
    rewrite hyperdoctrine_pair_pr1 in r.
    rewrite hyperdoctrine_pair_pr2 in r.
    rewrite !hyperdoctrine_pair_subst in r.
    rewrite hyperdoctrine_pair_pr2 in r.
    rewrite hyperdoctrine_pr2_subst in r.
    rewrite hyperdoctrine_pr1_subst in r.
    rewrite !var_tm_subst in r.
    rewrite hyperdoctrine_pair_pr1 in r.
    rewrite hyperdoctrine_pair_pr2 in r.
    rewrite hyperdoctrine_pr2_subst in r.
    rewrite !var_tm_subst in r.
    rewrite hyperdoctrine_pr2_subst in r.
    rewrite !var_tm_subst in r.
    rewrite hyperdoctrine_pair_pr2 in r.
    pose proof (r' := forall_elim r x) ; clear r.
    rewrite forall_subst in r'.
    rewrite !impl_subst in r'.
    rewrite !hyperdoctrine_comp_subst in r'.
    rewrite !hyperdoctrine_pr2_subst in r'.
    rewrite !hyperdoctrine_pr1_subst in r'.
    rewrite !var_tm_subst in r'.
    rewrite hyperdoctrine_pair_pr1 in r'.
    rewrite hyperdoctrine_pair_pr2 in r'.
    rewrite !hyperdoctrine_pair_subst in r'.
    rewrite hyperdoctrine_pair_pr2 in r'.
    rewrite hyperdoctrine_pr2_subst in r'.
    rewrite hyperdoctrine_pr1_subst in r'.
    rewrite !var_tm_subst in r'.
    rewrite hyperdoctrine_pair_pr1 in r'.
    rewrite hyperdoctrine_pair_pr2 in r'.
    rewrite hyperdoctrine_pr2_subst in r'.
    rewrite !var_tm_subst in r'.
    rewrite hyperdoctrine_pair_pr2 in r'.
    pose proof (r'' := forall_elim r' y) ; clear r'.
    rewrite !impl_subst in r''.
    rewrite !hyperdoctrine_comp_subst in r''.
    rewrite !hyperdoctrine_pr2_subst in r''.
    rewrite !var_tm_subst in r''.
    rewrite hyperdoctrine_pair_pr2 in r''.
    rewrite !hyperdoctrine_pair_subst in r''.
    rewrite hyperdoctrine_pr2_subst in r''.
    rewrite !var_tm_subst in r''.
    rewrite hyperdoctrine_pair_pr2 in r''.
    rewrite !tm_subst_comp in r''.
    rewrite !hyperdoctrine_pr1_subst in r''.
    rewrite !var_tm_subst in r''.
    rewrite hyperdoctrine_pair_pr1 in r''.
    rewrite !tm_subst_var in r''.
    refine (hyperdoctrine_cut _ r'').
    apply truth_intro.
  Qed.

4. The displayed category of subobjects

  Definition disp_cat_ob_mor_per_subobject
    : disp_cat_ob_mor (category_of_partial_setoids H).
  Proof.
    simple refine (_ ,, _).
    - exact (Ξ» (X : partial_setoid H), per_subobject X).
    - exact (Ξ» (X Y : partial_setoid H)
               (Οˆβ‚ : per_subobject X)
               (Οˆβ‚‚ : per_subobject Y)
               (Ο† : partial_setoid_morphism X Y),
             per_subobject_mor_law Ο† Οˆβ‚ Οˆβ‚‚).
  Defined.

  Proposition disp_cat_id_comp_per_subobject
    : disp_cat_id_comp
        (category_of_partial_setoids H)
        disp_cat_ob_mor_per_subobject.
  Proof.
    split.
    - cbn.
      intros X ψ.
      do 2 use forall_intro.
      use impl_intro.
      use weaken_right.
      pose (x₁ := Ο€β‚‚ (π₁ (tm_var ((πŸ™ Γ—h X) Γ—h X)))).
      pose (xβ‚‚ := Ο€β‚‚ (tm_var ((πŸ™ Γ—h X) Γ—h X))).
      fold x₁ xβ‚‚.
      hypersimplify.
      use impl_intro.
      use per_subobject_eq.
      + exact x₁.
      + use weaken_left.
        apply hyperdoctrine_hyp.
      + use weaken_right.
        apply hyperdoctrine_hyp.
    - intros X Y Z φ₁ Ο†β‚‚ Οˆβ‚ Οˆβ‚‚ Οˆβ‚ƒ p q.
      cbn -[per_subobject_mor_law] in * ; cbn.
      do 2 use forall_intro.
      use impl_intro.
      use weaken_right.
      rewrite exists_subst.
      use (exists_elim (hyperdoctrine_hyp _)).
      use weaken_right.
      rewrite impl_subst.
      pose (x := Ο€β‚‚ (π₁ (π₁ (tm_var (((πŸ™ Γ—h X) Γ—h Z) Γ—h Y))))).
      pose (z := Ο€β‚‚ (π₁ (tm_var (((πŸ™ Γ—h X) Γ—h Z) Γ—h Y)))).
      pose (y := Ο€β‚‚ (tm_var (((πŸ™ Γ—h X) Γ—h Z) Γ—h Y))).
      hypersimplify.
      fold x y z.
      use impl_intro.
      use (per_subobject_mor q).
      + exact y.
      + use weaken_left.
        use weaken_right.
        apply hyperdoctrine_hyp.
      + use (per_subobject_mor p).
        * exact x.
        * do 2 use weaken_left.
          apply hyperdoctrine_hyp.
        * use weaken_right.
          apply hyperdoctrine_hyp.
  Qed.

  Definition disp_cat_data_per_subobject
    : disp_cat_data (category_of_partial_setoids H).
  Proof.
    simple refine (_ ,, _).
    - exact disp_cat_ob_mor_per_subobject.
    - exact disp_cat_id_comp_per_subobject.
  Defined.

  Proposition disp_cat_axioms_per_subobject
    : disp_cat_axioms
        (category_of_partial_setoids H)
        disp_cat_data_per_subobject.
  Proof.
    repeat split.
    - intros.
      apply isaprop_per_subobject_mor_law.
    - intros.
      apply isaprop_per_subobject_mor_law.
    - intros.
      apply isaprop_per_subobject_mor_law.
    - intros.
      apply isasetaprop.
      apply isaprop_per_subobject_mor_law.
  Qed.

  Definition disp_cat_per_subobject
    : disp_cat (category_of_partial_setoids H).
  Proof.
    simple refine (_ ,, _).
    - exact disp_cat_data_per_subobject.
    - exact disp_cat_axioms_per_subobject.
  Defined.

  Proposition locally_prop_disp_cat_per_subobject
    : locally_propositional disp_cat_per_subobject.
  Proof.
    intros X Y Ο† Οˆβ‚ Οˆβ‚‚.
    apply isaprop_per_subobject_mor_law.
  Qed.

5. This displayed category is univalent

  Proposition is_univalent_disp_cat_per_subobject
    : is_univalent_disp disp_cat_per_subobject.
  Proof.
    use is_univalent_disp_from_fibers.
    intros X Οˆβ‚ Οˆβ‚‚ ; cbn in X, Οˆβ‚, Οˆβ‚‚.
    use isweqimplimpl.
    - intros pq.
      pose (p := pr1 pq).
      pose (q := pr12 pq).
      cbn -[per_subobject_mor_law] in p, q.
      use subtypePath.
      {
        intro.
        apply isaprop_per_subobject_laws.
      }
      use hyperdoctrine_formula_eq.
      + pose (x := tm_var X).
        rewrite <- (hyperdoctrine_id_subst (pr1 Οˆβ‚)).
        rewrite <- (hyperdoctrine_id_subst (pr1 Οˆβ‚‚)).
        use (per_subobject_mor p).
        * apply tm_var.
        * fold x.
          cbn.
          hypersimplify.
          use (per_subobject_def Οˆβ‚).
          apply hyperdoctrine_hyp.
        * apply hyperdoctrine_hyp.
      + pose (x := tm_var X).
        rewrite <- (hyperdoctrine_id_subst (pr1 Οˆβ‚)).
        rewrite <- (hyperdoctrine_id_subst (pr1 Οˆβ‚‚)).
        use (per_subobject_mor q).
        * apply tm_var.
        * fold x.
          cbn.
          hypersimplify.
          use (per_subobject_def Οˆβ‚‚).
          apply hyperdoctrine_hyp.
        * apply hyperdoctrine_hyp.
    - apply isaset_per_subobject.
    - use isaproptotal2.
      + intro.
        apply isaprop_is_z_iso_disp.
      + intros.
        apply isaprop_per_subobject_mor_law.
  Qed.

6. The cleaving

  Section Substitution.
    Context {X Y : partial_setoid H}
            (Ο† : partial_setoid_morphism Y X)
            (ψ : per_subobject X).

    Let ΞΆ : form Y
      := let y := π₁ (tm_var (Y Γ—h X)) in
         let x := Ο€β‚‚ (tm_var (Y Γ—h X)) in
         (βˆƒh (Ο† [ ⟨ y , x ⟩ ] ∧ ψ [ x ])).

    Proposition per_subobject_subst_laws
      : per_subobject_laws ΞΆ.
    Proof.
      split.
      - unfold ΞΆ.
        use forall_intro.
        use impl_intro.
        use weaken_right.
        rewrite exists_subst.
        use (exists_elim (hyperdoctrine_hyp _)).
        use weaken_right.
        hypersimplify.
        pose (x := Ο€β‚‚ (tm_var ((πŸ™ Γ—h Y) Γ—h X))).
        pose (y := Ο€β‚‚ (π₁ (tm_var ((πŸ™ Γ—h Y) Γ—h X)))).
        fold x y.
        use weaken_left.
        use (partial_setoid_mor_dom_defined Ο†).
        + exact x.
        + apply hyperdoctrine_hyp.
      - unfold ΞΆ.
        do 2 use forall_intro.
        use impl_intro.
        use weaken_right.
        use impl_intro.
        use hyp_sym.
        rewrite !exists_subst.
        use (exists_elim (weaken_left (hyperdoctrine_hyp _) _)).
        rewrite !conj_subst.
        use hyp_ltrans.
        use weaken_right.
        hypersimplify.
        pose (y₁ := Ο€β‚‚ (π₁ (π₁ (tm_var (((πŸ™ Γ—h Y) Γ—h Y) Γ—h X))))).
        pose (yβ‚‚ := Ο€β‚‚ (π₁ (tm_var (((πŸ™ Γ—h Y) Γ—h Y) Γ—h X)))).
        pose (x := Ο€β‚‚ (tm_var (((πŸ™ Γ—h Y) Γ—h Y) Γ—h X))).
        fold y₁ yβ‚‚ x.
        use exists_intro.
        + exact x.
        + hypersimplify.
          fold yβ‚‚.
          use conj_intro.
          * use (partial_setoid_mor_eq_defined Ο†).
            ** exact y₁.
            ** exact x.
            ** use weaken_left.
               apply hyperdoctrine_hyp.
            ** use weaken_right.
               use weaken_left.
               use (partial_setoid_mor_cod_defined Ο†).
               *** exact y₁.
               *** apply hyperdoctrine_hyp.
            ** use weaken_right.
               use weaken_left.
               apply hyperdoctrine_hyp.
          * do 2 use weaken_right.
            apply hyperdoctrine_hyp.
    Qed.

    Definition per_subobject_subst
      : per_subobject Y.
    Proof.
      use make_per_subobject.
      - exact ΞΆ.
      - exact per_subobject_subst_laws.
    Defined.

    Arguments per_subobject_subst /.

    Proposition per_subobject_subst_mor
      : per_subobject_mor_law
          Ο†
          per_subobject_subst
          Οˆ.
    Proof.
      do 2 use forall_intro.
      use impl_intro.
      use weaken_right.
      use impl_intro.
      cbn.
      unfold ΞΆ.
      use hyp_sym.
      rewrite !exists_subst.
      use (exists_elim (weaken_left (hyperdoctrine_hyp _) _)).
      rewrite !conj_subst.
      use hyp_ltrans.
      use weaken_right.
      hypersimplify.
      pose (x₁ := Ο€β‚‚ (π₁ (tm_var (((πŸ™ Γ—h Y) Γ—h X) Γ—h X)))).
      pose (xβ‚‚ := Ο€β‚‚ (tm_var (((πŸ™ Γ—h Y) Γ—h X) Γ—h X))).
      pose (y := Ο€β‚‚ (π₁ (π₁ (tm_var (((πŸ™ Γ—h Y) Γ—h X) Γ—h X))))).
      fold x₁ xβ‚‚ y.
      use (per_subobject_eq ψ).
      - exact xβ‚‚.
      - use (partial_setoid_mor_unique_im Ο†).
        + exact y.
        + use weaken_right.
          use weaken_left.
          apply hyperdoctrine_hyp.
        + use weaken_left.
          apply hyperdoctrine_hyp.
      - do 2 use weaken_right.
        apply hyperdoctrine_hyp.
    Qed.

    Proposition is_cartesian_per_subobject_subst_mor
      : is_cartesian
          (D := disp_cat_per_subobject)
          per_subobject_subst_mor.
    Proof.
      intros W Ο†' ψ' p ; cbn -[per_subobject_mor_law] in *.
      use iscontraprop1.
      - use isaproptotal2.
        {
          intro.
          apply homsets_disp.
        }
        intros.
        apply locally_prop_disp_cat_per_subobject.
      - simple refine (_ ,, _) ; [ | apply locally_prop_disp_cat_per_subobject ].
        do 2 use forall_intro.
        use impl_intro.
        use weaken_right.
        use impl_intro.
        cbn ; unfold ΞΆ.
        pose (w := Ο€β‚‚ (π₁ (tm_var ((πŸ™ Γ—h W) Γ—h Y)))).
        pose (y := Ο€β‚‚ (tm_var ((πŸ™ Γ—h W) Γ—h Y))).
        fold w y.
        simple refine (exists_elim (partial_setoid_mor_hom_exists Ο† _) _).
        + exact y.
        + use weaken_left.
          use (partial_setoid_mor_cod_defined Ο†').
          * exact w.
          * apply hyperdoctrine_hyp.
        + unfold w, y ; clear w y.
          hypersimplify.
          pose (w := Ο€β‚‚ (π₁ (π₁ (tm_var (((πŸ™ Γ—h W) Γ—h Y) Γ—h X))))).
          pose (y := Ο€β‚‚ (π₁ (tm_var (((πŸ™ Γ—h W) Γ—h Y) Γ—h X)))).
          pose (x := Ο€β‚‚ (tm_var (((πŸ™ Γ—h W) Γ—h Y) Γ—h X))).
          fold w x y.
          use exists_intro.
          {
            exact x.
          }
          hypersimplify.
          fold y.
          use conj_intro.
          * use weaken_right.
            apply hyperdoctrine_hyp.
          * use (per_subobject_mor p).
            ** exact w.
            ** cbn.
               simplify_form.
               use exists_intro.
               {
                 exact y.
               }
               hypersimplify.
               use conj_intro.
               *** do 2 use weaken_left.
                   apply hyperdoctrine_hyp.
               *** use weaken_right.
                   apply hyperdoctrine_hyp.
            ** use weaken_left.
               use weaken_right.
               apply hyperdoctrine_hyp.
    Qed.
  End Substitution.

  Arguments per_subobject_subst {X Y} Ο† ψ /.

  Definition disp_cat_per_subobject_cleaving
    : cleaving disp_cat_per_subobject.
  Proof.
    intros X Y Ο† ψ ; cbn in *.
    simple refine (_ ,, _ ,, _).
    - exact (per_subobject_subst Ο† ψ).
    - exact (per_subobject_subst_mor Ο† ψ).
    - exact (is_cartesian_per_subobject_subst_mor Ο† ψ).
  Defined.
End PartialEqRelDispCat.

Arguments disp_cat_per_subobject : clear implicits.
Arguments disp_cat_per_subobject_cleaving : clear implicits.
Arguments per_subobject_mor_law {H X Y} Ο† Οˆβ‚ Οˆβ‚‚ /.
Arguments per_subobject_subst {H X Y} Ο† ψ /.