Theory CZH_DG_Small_DGHM

(* Copyright 2021 (C) Mihails Milehins *)

section‹Smallness for digraph homomorphisms›
theory CZH_DG_Small_DGHM
  imports 
    CZH_DG_Small_Digraph
    CZH_DG_DGHM
begin



subsection‹Digraph homomorphism with tiny maps›


subsubsection‹Definition and elementary properties›


text‹
The following construction is based on the concept
of a ‹small functor› used in cite‹"shulman_set_2008"›
in the context of the presentation of the set theory ‹ZFC/S›.
›

locale is_tm_dghm =
  is_dghm α 𝔄 𝔅 𝔉 +
  HomDom: digraph α 𝔄 + 
  HomCod: digraph α 𝔅
  for α 𝔄 𝔅 𝔉 +
  assumes tm_dghm_ObjMap_in_Vset[dg_small_cs_intros]: "𝔉⦇ObjMap⦈ ∈∘ Vset α"
    and tm_dghm_ArrMap_in_Vset[dg_small_cs_intros]: "𝔉⦇ArrMap⦈ ∈∘ Vset α"

syntax "_is_tm_dghm" :: "V ⇒ V ⇒ V ⇒ V ⇒ bool" 
  (‹(_ :/ _ ↦↦DG.tmı _)› [51, 51, 51] 51)
syntax_consts "_is_tm_dghm" ⇌ is_tm_dghm
translations "𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅" ⇌ "CONST is_tm_dghm α 𝔄 𝔅 𝔉"

abbreviation (input) is_cn_tm_dghm :: "V ⇒ V ⇒ V ⇒ V ⇒ bool"
  where "is_cn_tm_dghm α 𝔄 𝔅 𝔉 ≡ 𝔉 : op_dg 𝔄 ↦↦DG.tm⇘α⇙ 𝔅"

syntax "_is_cn_tm_dghm" :: "V ⇒ V ⇒ V ⇒ V ⇒ bool" 
  (‹(_ :/ _ DG.tm↦↦ı _)› [51, 51, 51] 51)
syntax_consts "_is_cn_tm_dghm" ⇌ is_cn_tm_dghm
translations "𝔉 : 𝔄 DG.tm↦↦⇘α⇙ 𝔅" ⇀ "CONST is_cn_tm_dghm α 𝔄 𝔅 𝔉"

abbreviation all_tm_dghms :: "V ⇒ V"
  where "all_tm_dghms α ≡ set {𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅}"

abbreviation small_tm_dghms :: "V ⇒ V ⇒ V ⇒ V"
  where "small_tm_dghms α 𝔄 𝔅 ≡ set {𝔉. 𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅}"

lemmas [dg_small_cs_intros] =
  is_tm_dghm.tm_dghm_ObjMap_in_Vset
  is_tm_dghm.tm_dghm_ArrMap_in_Vset


text‹Rules.›

lemma (in is_tm_dghm) is_tm_dghm_axioms'[dg_small_cs_intros]:
  assumes "α' = α" and "𝔄' = 𝔄" and "𝔅' = 𝔅"
  shows "𝔉 : 𝔄' ↦↦DG.tm⇘α'⇙ 𝔅'"
  unfolding assms by (rule is_tm_dghm_axioms)

mk_ide rf is_tm_dghm_def[unfolded is_tm_dghm_axioms_def]
  |intro is_tm_dghmI|
  |dest is_tm_dghmD[dest]|
  |elim is_tm_dghmE[elim]|

lemmas [dg_small_cs_intros] = is_tm_dghmD(1)


text‹Elementary properties.›

sublocale is_tm_dghm ⊆ HomDom: tiny_digraph α 𝔄 
proof(rule tiny_digraphI')
  show "𝔄⦇Obj⦈ ∈∘ Vset α"
    by (rule vdomain_in_VsetI[OF tm_dghm_ObjMap_in_Vset, simplified dg_cs_simps])
  show "𝔄⦇Arr⦈ ∈∘ Vset α"
    by (rule vdomain_in_VsetI[OF tm_dghm_ArrMap_in_Vset, simplified dg_cs_simps])
qed (cs_concl cs_shallow cs_intro: dg_cs_intros)

lemmas (in is_tm_dghm) 
  tm_dghm_HomDom_is_tiny_digraph = HomDom.tiny_digraph_axioms

lemmas [dg_small_cs_intros] = is_tm_dghm.tm_dghm_HomDom_is_tiny_digraph


text‹Further rules.›

lemma is_tm_dghmI':
  assumes "𝔉 : 𝔄 ↦↦DG⇘α⇙ 𝔅"
    and [simp]: "𝔉⦇ObjMap⦈ ∈∘ Vset α"
    and [simp]: "𝔉⦇ArrMap⦈ ∈∘ Vset α"
  shows "𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅"
proof-
  interpret is_dghm α 𝔄 𝔅 𝔉 by (rule assms(1))
  from assms show ?thesis
    by (intro is_tm_dghmI) (auto simp: vfsequence_axioms dghm_ObjMap_vrange)
qed


text‹Size.›

lemma small_all_tm_dghms[simp]: "small {𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅}"
proof(rule down)
  show 
    "{𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅} ⊆
      elts (set {𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG⇘α⇙ 𝔅})"
  proof
    (
      simp only: elts_of_set small_all_dghms if_True, 
      rule subsetI, 
      unfold mem_Collect_eq
    )
    fix 𝔉 assume "∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅"
    then obtain 𝔄 𝔅 where 𝔉: "𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅" by clarsimp
    interpret is_tm_dghm α 𝔄 𝔅 𝔉 by (rule 𝔉)
    from is_dghm_axioms' show "∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG⇘α⇙ 𝔅" by blast
  qed
qed


subsubsection‹Opposite digraph homomorphism with tiny maps›

lemma (in is_tm_dghm) is_tm_dghm_op: "op_dghm 𝔉 : op_dg 𝔄 ↦↦DG.tm⇘α⇙ op_dg 𝔅"
  by (intro is_tm_dghmI', unfold dg_op_simps)
    (cs_concl cs_intro: dg_cs_intros dg_small_cs_intros dg_op_intros)

lemma (in is_tm_dghm) is_tm_dghm_op'[dg_op_intros]:  
  assumes "𝔄' = op_dg 𝔄" and "𝔅' = op_dg 𝔅" and "α' = α"
  shows "op_dghm 𝔉 : 𝔄' ↦↦DG.tm⇘α'⇙ 𝔅'"
  unfolding assms by (rule is_tm_dghm_op)

lemmas is_tm_dghm_op[dg_op_intros] = is_tm_dghm.is_tm_dghm_op'


subsubsection‹Composition of a digraph homomorphism with tiny maps›

lemma dghm_comp_is_tm_dghm[dg_small_cs_intros]:
  assumes "𝔊 : 𝔅 ↦↦DG.tm⇘α⇙ ℭ" and "𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅"
  shows "𝔊 ∘DGHM 𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ ℭ"
proof-
  interpret 𝔉: is_tm_dghm α 𝔄 𝔅 𝔉 by (rule assms(2))
  interpret 𝔊: is_tm_dghm α 𝔅 ℭ 𝔊 by (rule assms(1))
  show ?thesis
  proof(intro is_tm_dghmI')
    from assms show "(𝔊 ∘DGHM 𝔉)⦇ObjMap⦈ ∈∘ Vset α"
      by 
        (
          cs_concl cs_shallow
            cs_simp: dghm_comp_components 
            cs_intro: dg_small_cs_intros Limit_vcomp_in_VsetI 𝔉.Limit_α 
        )+
    from assms show "(𝔊 ∘DGHM 𝔉)⦇ArrMap⦈ ∈∘ Vset α"
      by 
        (
          cs_concl cs_shallow
            cs_simp: dghm_comp_components 
            cs_intro: dg_small_cs_intros Limit_vcomp_in_VsetI 𝔉.Limit_α 
        )+
  qed (auto intro: dg_cs_intros)
qed


subsubsection‹Finite digraphs and digraph homomorphisms with tiny maps›

lemma (in is_dghm) dghm_is_tm_dghm_if_HomDom_finite_digraph:
  assumes "finite_digraph α 𝔄"
  shows "𝔉 : 𝔄 ↦↦DG.tm⇘α⇙ 𝔅"
proof(intro is_tm_dghmI')
  interpret 𝔄: finite_digraph α 𝔄 by (rule assms(1))
  show "𝔉⦇ObjMap⦈ ∈∘ Vset α"
  proof(rule ObjMap.vsv_Limit_vsv_in_VsetI)
    show "ℛ∘ (𝔉⦇ObjMap⦈) ⊆∘ Vset α"
    proof-
      have "ℛ∘ (𝔉⦇ObjMap⦈) ⊆∘ 𝔅⦇Obj⦈" by (simp add: dghm_ObjMap_vrange)
      moreover have "𝔅⦇Obj⦈ ⊆∘ Vset α"
        by (simp add: HomCod.dg_Obj_vsubset_Vset)
      ultimately show ?thesis by auto
    qed
  qed (auto simp: dg_cs_simps dg_small_cs_intros)
  show "𝔉⦇ArrMap⦈ ∈∘ Vset α"
  proof(rule ArrMap.vsv_Limit_vsv_in_VsetI)
    show "ℛ∘ (𝔉⦇ArrMap⦈) ⊆∘ Vset α"
    proof-
      have "ℛ∘ (𝔉⦇ArrMap⦈) ⊆∘ 𝔅⦇Arr⦈" by (simp add: dghm_ArrMap_vrange)
      moreover have "𝔅⦇Arr⦈ ⊆∘ Vset α"
        by (simp add: HomCod.dg_Arr_vsubset_Vset)
      ultimately show ?thesis by auto
    qed
  qed (auto simp: dg_cs_simps dg_small_cs_intros)
qed (simp add: dg_cs_intros)


subsubsection‹Constant digraph homomorphism›

lemma dghm_const_is_tm_dghm: 
  assumes "tiny_digraph α ℭ" and "digraph α 𝔇" and "f : a ↦⇘𝔇⇙ a"
  shows "dghm_const ℭ 𝔇 a f : ℭ ↦↦DG.tm⇘α⇙ 𝔇"
proof(intro is_tm_dghmI')
  interpret ℭ: tiny_digraph α ℭ by (rule assms(1))
  interpret 𝔇: digraph α 𝔇 by (rule assms(2))
  from assms show "dghm_const ℭ 𝔇 a f : ℭ ↦↦DG⇘α⇙ 𝔇"
    by (cs_concl cs_shallow cs_simp: dg_cs_simps cs_intro: dg_cs_intros)
  show "dghm_const ℭ 𝔇 a f⦇ObjMap⦈ ∈∘ Vset α"
    unfolding dghm_const_components
  proof(rule vbrelation.vbrelation_Limit_in_VsetI)
    from assms(3) have "a ∈∘ set {a}" 
      by (cs_concl cs_shallow cs_intro: V_cs_intros)
    with assms(3) show "ℛ∘ (vconst_on (ℭ⦇Obj⦈) a) ∈∘ Vset α"
      by 
        (
          cs_concl cs_intro: 
            dg_cs_intros 
            V_cs_intros
            𝔇.dg_in_Obj_in_Vset 
            vsubset_in_VsetI 
            Limit_vsingleton_in_VsetI 
        )
    show "𝒟∘ (vconst_on (ℭ⦇Obj⦈) a) ∈∘ Vset α"
      by (cs_concl cs_simp: V_cs_simps cs_intro: V_cs_intros dg_small_cs_intros)
  qed simp_all
  show "dghm_const ℭ 𝔇 a f⦇ArrMap⦈ ∈∘ Vset α"
    unfolding dghm_const_components
  proof(rule vbrelation.vbrelation_Limit_in_VsetI)
    from assms(3) 𝔇.dg_Arr_vsubset_Vset show
      "ℛ∘ (vconst_on (ℭ⦇Arr⦈) f) ∈∘ Vset α"
      by (cases ‹ℭ⦇Arr⦈=0›)
        (
          auto 
            simp: dg_cs_simps 𝔇.dg_is_arrD(1) 
            intro!: Limit_vsingleton_in_VsetI
        ) 
  qed (auto simp: ℭ.tiny_dg_Arr_in_Vset)
qed

lemma dghm_const_is_tm_dghm'[dg_small_cs_intros]:
  assumes "tiny_digraph α ℭ"
    and "digraph α 𝔇" 
    and "f : a ↦⇘𝔇⇙ a"
    and "ℭ' = ℭ"
    and "𝔇' = 𝔇"
  shows "dghm_const ℭ 𝔇 a f : ℭ' ↦↦DG.tm⇘α⇙ 𝔇'"
  using assms(1-3) unfolding assms(4,5) by (rule dghm_const_is_tm_dghm)



subsection‹Tiny digraph homomorphism›


subsubsection‹Definition and elementary properties›

locale is_tiny_dghm = 
  is_dghm α 𝔄 𝔅 𝔉 +
  HomDom: tiny_digraph α 𝔄 + 
  HomCod: tiny_digraph α 𝔅 
  for α 𝔄 𝔅 𝔉

syntax "_is_tiny_dghm" :: "V ⇒ V ⇒ V ⇒ V ⇒ bool" 
  (‹(_ :/ _ ↦↦DG.tinyı _)› [51, 51, 51] 51)
syntax_consts "_is_tiny_dghm" ⇌ is_tiny_dghm
translations "𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅" ⇌ "CONST is_tiny_dghm α 𝔄 𝔅 𝔉"

abbreviation (input) is_cn_tiny_dghm :: "V ⇒ V ⇒ V ⇒ V ⇒ bool"
  where "is_cn_tiny_dghm α 𝔄 𝔅 𝔉 ≡ 𝔉 : op_dg 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅"

syntax "_is_cn_tiny_dghm" :: "V ⇒ V ⇒ V ⇒ V ⇒ bool" 
  (‹(_ :/ _ DG.tiny↦↦ı _)› [51, 51, 51] 51)
syntax_consts "_is_cn_tiny_dghm" ⇌ is_cn_tiny_dghm
translations "𝔉 : 𝔄 DG.tiny↦↦⇘α⇙ 𝔅" ⇀ "CONST is_cn_tiny_dghm α 𝔄 𝔅 𝔉"

abbreviation all_tiny_dghms :: "V ⇒ V"
  where "all_tiny_dghms α ≡ set {𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅}"

abbreviation small_dghms :: "V ⇒ V ⇒ V ⇒ V"
  where "small_dghms α 𝔄 𝔅 ≡ set {𝔉. 𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅}"


text‹Rules.›

lemma (in is_tiny_dghm) is_tiny_dghm_axioms'[dg_small_cs_intros]:
  assumes "α' = α" and "𝔄' = 𝔄" and "𝔅' = 𝔅"
  shows "𝔉 : 𝔄' ↦↦DG.tiny⇘α'⇙ 𝔅'"
  unfolding assms by (rule is_tiny_dghm_axioms)

mk_ide rf is_tiny_dghm_def
  |intro is_tiny_dghmI|
  |dest is_tiny_dghmD[dest]|
  |elim is_tiny_dghmE[elim]|

lemmas [dg_small_cs_intros] = is_tiny_dghmD(2,3)


text‹Size.›

lemma (in is_tiny_dghm) tiny_dghm_ObjMap_in_Vset[dg_small_cs_intros]: 
  "𝔉⦇ObjMap⦈ ∈∘ Vset α"
proof-
  have "𝒟∘ (𝔉⦇ObjMap⦈) ∈∘ Vset α" 
    by (simp add: dghm_ObjMap_vdomain HomDom.tiny_dg_Obj_in_Vset)
  moreover from dghm_ObjMap_vrange have "ℛ∘ (𝔉⦇ObjMap⦈) ∈∘ Vset α"
    by (simp add: vsubset_in_VsetI HomCod.tiny_dg_Obj_in_Vset)
  ultimately show "𝔉⦇ObjMap⦈ ∈∘ Vset α" 
    by 
      (
        cs_concl cs_shallow cs_intro: 
          V_cs_intros dg_small_cs_intros ObjMap.vbrelation_Limit_in_VsetI 
      )
qed

lemmas [dg_small_cs_intros] = is_tiny_dghm.tiny_dghm_ObjMap_in_Vset

lemma (in is_tiny_dghm) tiny_dghm_ArrMap_in_Vset[dg_small_cs_intros]: 
  "𝔉⦇ArrMap⦈ ∈∘ Vset α"
proof-
  have "𝒟∘ (𝔉⦇ArrMap⦈) ∈∘ Vset α"
    by (simp add: dghm_ArrMap_vdomain HomDom.tiny_dg_Arr_in_Vset)
  moreover from HomCod.tiny_dg_Arr_in_Vset dghm_ArrMap_vrange have 
    "ℛ∘ (𝔉⦇ArrMap⦈) ∈∘ Vset α"
    by auto
  ultimately show "𝔉⦇ArrMap⦈ ∈∘ Vset α" 
    by 
      (
        cs_concl cs_shallow cs_intro:  
          V_cs_intros dg_small_cs_intros ArrMap.vbrelation_Limit_in_VsetI
      )
qed

lemmas [dg_small_cs_intros] = is_tiny_dghm.tiny_dghm_ArrMap_in_Vset

lemma (in is_tiny_dghm) tiny_dghm_in_Vset: "𝔉 ∈∘ Vset α"
proof-
  note [dg_cs_intros] = 
    tiny_dghm_ObjMap_in_Vset 
    tiny_dghm_ArrMap_in_Vset
    HomDom.tiny_dg_in_Vset 
    HomCod.tiny_dg_in_Vset 
  show ?thesis
    by (subst dghm_def) 
      (
        cs_concl cs_shallow 
          cs_simp: dg_cs_simps cs_intro: dg_cs_intros V_cs_intros
      )
qed

sublocale is_tiny_dghm ⊆ is_tm_dghm
  by (intro is_tm_dghmI') (auto simp: dg_cs_intros dg_small_cs_intros)

lemmas (in is_tiny_dghm) tiny_dghm_is_tm_dghm = is_tm_dghm_axioms

lemmas [dg_small_cs_intros] = is_tiny_dghm.tiny_dghm_is_tm_dghm

lemma small_all_tiny_dghms[simp]: "small {𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅}"
proof(rule down)
  show 
    "{𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅} ⊆
      elts (set {𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG⇘α⇙ 𝔅})"
  proof
    (
      simp only: elts_of_set small_all_dghms if_True, 
      rule subsetI, 
      unfold mem_Collect_eq
    )
    fix 𝔉 assume "∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅"
    then obtain 𝔄 𝔅 where 𝔉: "𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅" by clarsimp
    interpret is_tiny_dghm α 𝔄 𝔅 𝔉 by (rule 𝔉)
    from is_dghm_axioms show "∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG⇘α⇙ 𝔅" by auto
  qed
qed

lemma tiny_dghms_vsubset_Vset[simp]: 
  "set {𝔉. ∃𝔄 𝔅. 𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅} ⊆∘ Vset α"
proof(rule vsubsetI) 
  fix 𝔉 assume "𝔉 ∈∘ all_tiny_dghms α"
  then obtain 𝔄 𝔅 where 𝔉: "𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅" by clarsimp
  then show "𝔉 ∈∘ Vset α" by (auto simp: is_tiny_dghm.tiny_dghm_in_Vset)
qed

lemma (in is_dghm) dghm_is_tiny_dghm_if_ge_Limit:
  assumes "𝒵 β" and "α ∈∘ β"
  shows "𝔉 : 𝔄 ↦↦DG.tiny⇘β⇙ 𝔅"
proof(intro is_tiny_dghmI)
  interpret β: 𝒵 β by (rule assms(1))
  show "𝔉 : 𝔄 ↦↦DG⇘β⇙ 𝔅"
    by (intro dghm_is_dghm_if_ge_Limit)
      (use assms(2) in ‹cs_concl cs_shallow cs_intro: dg_cs_intros›)+
  show "tiny_digraph β 𝔄" "tiny_digraph β 𝔅"
    by 
      (
        simp_all add: 
          assms 
          HomDom.dg_tiny_digraph_if_ge_Limit 
          HomCod.dg_tiny_digraph_if_ge_Limit
      )
qed


subsubsection‹Opposite tiny digraph homomorphism›

lemma (in is_tiny_dghm) is_tiny_dghm_op: 
  "op_dghm 𝔉 : op_dg 𝔄 ↦↦DG.tiny⇘α⇙ op_dg 𝔅"
  by (intro is_tiny_dghmI) 
    (cs_concl cs_shallow cs_intro: dg_small_cs_intros dg_cs_intros dg_op_intros)+

lemma (in is_tiny_dghm) is_tiny_dghm_op'[dg_op_intros]:  
  assumes "𝔄' = op_dg 𝔄" and "𝔅' = op_dg 𝔅" and "α' = α"
  shows "op_dghm 𝔉 : 𝔄' ↦↦DG.tiny⇘α'⇙ 𝔅'"
  unfolding assms by (rule is_tiny_dghm_op)

lemmas is_tiny_dghm_op[dg_op_intros] = is_tiny_dghm.is_tiny_dghm_op'


subsubsection‹Composition of tiny digraph homomorphisms›

lemma dghm_comp_is_tiny_dghm[dg_small_cs_intros]:
  assumes "𝔊 : 𝔅 ↦↦DG.tiny⇘α⇙ ℭ" and "𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ 𝔅"
  shows "𝔊 ∘DGHM 𝔉 : 𝔄 ↦↦DG.tiny⇘α⇙ ℭ"
proof-
  interpret 𝔉: is_tiny_dghm α 𝔄 𝔅 𝔉 by (rule assms(2))
  interpret 𝔊: is_tiny_dghm α 𝔅 ℭ 𝔊 by (rule assms(1))
  show ?thesis 
    by (intro is_tiny_dghmI) 
      (auto simp: dg_small_cs_intros dg_cs_simps intro: dg_cs_intros)
qed


subsubsection‹Tiny constant digraph homomorphism›

lemma dghm_const_is_tiny_dghm:
  assumes "tiny_digraph α ℭ" and "tiny_digraph α 𝔇" and "f : a ↦⇘𝔇⇙ a"
  shows "dghm_const ℭ 𝔇 a f : ℭ ↦↦DG.tiny⇘α⇙ 𝔇"
proof(intro is_tiny_dghmI)
  from assms show "dghm_const ℭ 𝔇 a f : ℭ ↦↦DG⇘α⇙ 𝔇"
    by (cs_concl cs_simp: dg_cs_simps cs_intro: dg_cs_intros dg_small_cs_intros)
qed (auto simp: assms(1,2))

lemma dghm_const_is_tiny_dghm'[dg_small_cs_intros]:
  assumes "tiny_digraph α ℭ"
    and "tiny_digraph α 𝔇" 
    and "f : a ↦⇘𝔇⇙ a"
    and "ℭ' = ℭ"
    and "𝔇' = 𝔇"
  shows "dghm_const ℭ 𝔇 a f : ℭ' ↦↦DG.tiny⇘α⇙ 𝔇'"
  using assms(1-3) unfolding assms(4,5) by (rule dghm_const_is_tiny_dghm)

text‹\newpage›

end