Theory Transport_Functions_Galois_Relator

✐‹creator "Kevin Kappelmann"›
subsection ‹Galois Relator›
theory Transport_Functions_Galois_Relator
  imports
    Transport_Functions_Relation_Simplifications
begin

paragraph ‹Dependent Function Relator›

context transport_Dep_Fun_Rel
begin

interpretation flip : transport_Dep_Fun_Rel R1 L1 r1 l1 R2 L2 r2 l2
  rewrites "flip.t1.counit ≡ η1" by (simp only: t1.flip_counit_eq_unit)

lemma Dep_Fun_Rel_left_Galois_if_left_GaloisI:
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  and refl_L1: "reflexive_on (in_dom (≤L1)) (≤L1)"
  and mono_r2: "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and L2_le2: "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and ge_L2_r2_le2: "⋀x x' y'. x L1⪅ x' ⟹ in_dom (≤⇘R2 (l1 x) x'⇙) y' ⟹
    (≥⇘L2 x (r1 x')⇙) (r2⇘x (l1 x)⇙ y') ≤ (≥⇘L2 x (r1 x')⇙) (r2⇘x x'⇙ y')"
  and trans_L2: "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  and "f L⪅ g"
  shows "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
proof (intro Dep_Fun_Rel_relI)
  fix x x' assume "x L1⪅ x'"
  show "f x ⇘L2 x x'⇙⪅ g x'"
  proof (intro t2.left_GaloisI)
    from ‹x L1⪅ x'› ‹((≤L1) h⊴ (≤R1)) l1 r1› have "x ≤L1 r1 x'" "l1 x ≤R1 x'" by auto
    with ‹g ≤R g› have "g (l1 x) ≤⇘R2 (l1 x) x'⇙ g x'" by blast
    then show "in_codom (≤⇘R2 (l1 x) x'⇙) (g x')" by blast

    from ‹f L⪅ g› have "f ≤L r g" by blast
    moreover from refl_L1 ‹x L1⪅ x'› have "x ≤L1 x" by blast
    ultimately have "f x ≤⇘L2 x x⇙ (r g) x" by blast
    with L2_le2 ‹x ≤L1 r1 x'› have "f x ≤⇘L2 x (r1 x')⇙ (r g) x" by blast
    then have "f x ≤⇘L2 x (r1 x')⇙ r2⇘x (l1 x)⇙ (g (l1 x))" by simp
    with ge_L2_r2_le2 have "f x ≤⇘L2 x (r1 x')⇙ r2⇘x x'⇙ (g (l1 x))"
      using ‹x L1⪅ x'› ‹g (l1 x) ≤⇘R2 (l1 x) x'⇙ _› by blast
    moreover have "... ≤⇘L2 x (r1 x')⇙ r2⇘x x'⇙ (g x')"
      using mono_r2 ‹x L1⪅ x'› ‹g (l1 x) ≤⇘R2 (l1 x) x'⇙ g x'› by blast
    ultimately show "f x ≤⇘L2 x (r1 x')⇙ r2⇘x x'⇙ (g x')"
      using trans_L2 ‹x L1⪅ x'› by blast
  qed
qed

lemma left_rel_right_if_Dep_Fun_Rel_left_GaloisI:
  assumes mono_l1: "((≤L1) ⇒ (≤R1)) l1"
  and half_galois_prop_right1: "((≤L1) ⊴h (≤R1)) l1 r1"
  and L2_unit_le2: "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and ge_L2_r2_le1: "⋀x1 x2 y'. x1 ≤L1 x2 ⟹ in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y' ⟹
    (≥⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≥⇘L2 x1 x2⇙) (r2⇘x2 (l1 x2)⇙ y')"
  and rel_f_g: "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  shows "f ≤L r g"
proof (intro left_relI)
  fix x1 x2 assume "x1 ≤L1 x2"
  with mono_l1 half_galois_prop_right1 have "x1 L1⪅ l1 x2"
    by (intro t1.left_Galois_left_if_left_relI) auto
  with rel_f_g have "f x1 ⇘L2 x1 (l1 x2)⇙⪅ g (l1 x2)" by blast
  then have "in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) (g (l1 x2))"
    "f x1 ≤⇘L2 x1 (η1 x2)⇙ r2⇘x1 (l1 x2)⇙ (g (l1 x2))" by auto
  with L2_unit_le2 ‹x1 ≤L1 x2› have "f x1 ≤⇘L2 x1 x2⇙ r2⇘x1 (l1 x2)⇙ (g (l1 x2))" by blast
  with ge_L2_r2_le1 ‹x1 ≤L1 x2› ‹in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) (g (l1 x2))›
    have "f x1 ≤⇘L2 x1 x2⇙ r2⇘x2 (l1 x2)⇙ (g (l1 x2))" by blast
  then show "f x1 ≤⇘L2 x1 x2⇙ r g x2" by simp
qed

lemma left_Galois_if_Dep_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1 x2 y'. x1 ≤L1 x2 ⟹ in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y' ⟹
    (≥⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≥⇘L2 x1 x2⇙) (r2⇘x2 (l1 x2)⇙ y')"
  and "in_codom (≤R) g"
  and "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  shows "f L⪅ g"
  using assms by (intro left_GaloisI left_rel_right_if_Dep_Fun_Rel_left_GaloisI) auto

lemma left_right_rel_if_Dep_Fun_Rel_left_GaloisI:
  assumes mono_r1: "((≤R1) ⇒ (≤L1)) r1"
  and half_galois_prop_left2: "⋀x1' x2'. x1' ≤R1 x2' ⟹
    ((≤⇘L2 (r1 x1') (r1 x2')⇙) h⊴ (≤⇘R2 (ε1 x1') x2'⇙)) (l2⇘x2' (r1 x1')⇙) (r2⇘(r1 x1') x2'⇙)"
  and R2_le1: "⋀x1' x2'. x1' ≤R1 x2' ⟹ (≤⇘R2 (ε1 x1') x2'⇙) ≤ (≤⇘R2 x1' x2'⇙)"
  and R2_l2_le1: "⋀x1' x2' y. x1' ≤R1 x2' ⟹ in_dom (≤⇘L2 (r1 x1') (r1 x2')⇙) y ⟹
    (≤⇘R2 x1' x2'⇙) (l2⇘x2' (r1 x1')⇙ y) ≤ (≤⇘R2 x1' x2'⇙) (l2⇘x1' (r1 x1')⇙ y)"
  and rel_f_g: "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  shows "l f ≤R g"
proof (rule flip.left_relI)
  fix x1' x2' assume "x1' ≤R1 x2'"
  with mono_r1 have "r1 x1' L1⪅ x2'" by blast
  with rel_f_g have "f (r1 x1') ⇘L2 (r1 x1') x2'⇙⪅ g x2'" by blast
  with half_galois_prop_left2[OF ‹x1' ≤R1 x2'›]
    have "l2⇘x2' (r1 x1')⇙ (f (r1 x1')) ≤⇘R2 (ε1 x1') x2'⇙ g x2'" by auto
  with R2_le1 ‹x1' ≤R1 x2'› have "l2⇘x2' (r1 x1')⇙ (f (r1 x1')) ≤⇘R2 x1' x2'⇙ g x2'"
    by blast
  with R2_l2_le1 ‹x1' ≤R1 x2'› ‹f (r1 x1') ⇘L2 (r1 x1') x2'⇙⪅ _›
    have "l2⇘x1' (r1 x1')⇙ (f (r1 x1')) ≤⇘R2 x1' x2'⇙ g x2'" by blast
  then show "l f x1' ≤⇘R2 x1' x2'⇙ g x2'" by simp
qed

lemma left_Galois_if_Dep_Fun_Rel_left_GaloisI':
  assumes "((≤L1) ⇒ (≤R1)) l1" and "((≤R1) ⇒ (≤L1)) r1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹
    ((≤⇘L2 (r1 x1') (r1 x2')⇙) h⊴ (≤⇘R2 (ε1 x1') x2'⇙)) (l2⇘x2' (r1 x1')⇙) (r2⇘(r1 x1') x2'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ (≤⇘R2 (ε1 x1') x2'⇙) ≤ (≤⇘R2 x1' x2'⇙)"
  and "⋀x1 x2 y'. x1 ≤L1 x2 ⟹ in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y' ⟹
    (≥⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≥⇘L2 x1 x2⇙) (r2⇘x2 (l1 x2)⇙ y')"
  and "⋀x1' x2' y. x1' ≤R1 x2' ⟹ in_dom (≤⇘L2 (r1 x1') (r1 x2')⇙) y ⟹
    (≤⇘R2 x1' x2'⇙) (l2⇘x2' (r1 x1')⇙ y) ≤ (≤⇘R2 x1' x2'⇙) (l2⇘x1' (r1 x1')⇙ y)"
  and "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  shows "f L⪅ g"
  using assms by (intro left_Galois_if_Dep_Fun_Rel_left_GaloisI in_codomI[where ?x="l f"])
  (auto intro!: left_right_rel_if_Dep_Fun_Rel_left_GaloisI)

lemma left_Galois_iff_Dep_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_dom (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1 x2 y'. x1 ≤L1 x2 ⟹ in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y' ⟹
    (≥⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≥⇘L2 x1 x2⇙) (r2⇘x2 (l1 x2)⇙ y')"
  and "⋀x x' y'. x L1⪅ x' ⟹ in_dom (≤⇘R2 (l1 x) x'⇙) y' ⟹
    (≥⇘L2 x (r1 x')⇙) (r2⇘x (l1 x)⇙ y') ≤ (≥⇘L2 x (r1 x')⇙) (r2⇘x x'⇙ y')"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro iffI)
  (auto intro!: Dep_Fun_Rel_left_Galois_if_left_GaloisI left_Galois_if_Dep_Fun_Rel_left_GaloisI)

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI:
  assumes "⋀x1 x2. x1 ≤L1 x2 ⟹
    ((in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙)) ⇛ (≤⇘L2 x1 x2⇙)) (r2⇘x1 (l1 x2)⇙) (r2⇘x2 (l1 x2)⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  shows "⋀x1 x2 y'. x1 ≤L1 x2 ⟹ in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y' ⟹
    (≥⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≥⇘L2 x1 x2⇙) (r2⇘x2 (l1 x2)⇙ y')"
  using assms by blast

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI':
  assumes "⋀x x'. x L1⪅ x' ⟹
    ((in_dom (≤⇘R2 (l1 x) x'⇙)) ⇛ (≤⇘L2 x (r1 x')⇙)) (r2⇘x (l1 x)⇙) (r2⇘x x'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  shows "⋀x x' y'. x L1⪅ x' ⟹ in_dom (≤⇘R2 (l1 x) x'⇙) y' ⟹
    (≥⇘L2 x (r1 x')⇙) (r2⇘x (l1 x)⇙ y') ≤ (≥⇘L2 x (r1 x')⇙) (r2⇘x x'⇙ y')"
  using assms by blast

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_mono_assm_in_codom_rightI:
  assumes mono_l1: "((≤L1) ⇒ (≤R1)) l1"
  and half_galois_prop_right1: "((≤L1) ⊴h (≤R1)) l1 r1"
  and refl_L1: "reflexive_on (in_codom (≤L1)) (≤L1)"
  and L2_le_unit2: "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and mono_r2: mono_cond_right_fun
  and "x1 ≤L1 x2"
  shows "((in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙)) ⇛ (≤⇘L2 x1 x2⇙)) (r2⇘x1 (l1 x2)⇙) (r2⇘x2 (l1 x2)⇙)"
proof (intro Fun_Rel_predI)
  from mono_l1 half_galois_prop_right1 refl_L1 ‹x1 ≤L1 x2›
  have "l1 x2 ≤R1 l1 x2" "x2 L1⪅ l1 x2"
    by (blast intro: t1.left_Galois_left_if_left_relI)+
  fix y' assume "in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y'"
  with mono_r2 ‹x1 ≤L1 x2› ‹l1 x2 ≤R1 l1 x2›
    have "r2⇘x1 (l1 x2)⇙ y' ≤⇘L2 x1 (η1 x2)⇙ r2⇘x2 (l1 x2)⇙ y'" using ‹x2 L1⪅ l1 x2› by fastforce
  with L2_le_unit2 ‹x1 ≤L1 x2› show "r2⇘x1 (l1 x2)⇙ y' ≤⇘L2 x1 x2⇙ r2⇘x2 (l1 x2)⇙ y'" by blast
qed

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_mono_assm_in_dom_rightI:
  assumes mono_l1: "((≤L1) ⇒ (≤R1)) l1"
  and half_galois_prop_right1: "((≤L1) ⊴ (≤R1)) l1 r1"
  and refl_L1: "reflexive_on (in_dom (≤L1)) (≤L1)"
  and mono_r2: mono_cond_right_fun
  and "x L1⪅ x'"
  shows "((in_dom (≤⇘R2 (l1 x) x'⇙)) ⇛ (≤⇘L2 x (r1 x')⇙)) (r2⇘x (l1 x)⇙) (r2⇘x x'⇙)"
proof -
  from mono_l1 half_galois_prop_right1 refl_L1 ‹x L1⪅ x'›
    have "x ≤L1 x" "l1 x ≤R1 x'" "x L1⪅ l1 x"
    by (auto intro!: t1.half_galois_prop_leftD t1.left_Galois_left_if_left_relI)
  with mono_r2 show ?thesis by fastforce
qed

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_if_monoI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_GaloisI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI'
    left_Galois_iff_Dep_Fun_Rel_left_Galois_mono_assm_in_dom_rightI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_mono_assm_in_codom_rightI)
  (auto intro: reflexive_on_if_le_pred_if_reflexive_on in_field_if_in_dom
    in_field_if_in_codom)

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_le_assmI:
  assumes refl_L1: "reflexive_on (in_dom (≤L1)) (≤L1)"
  and mono_L2: "((x1 : ⊤) ⇒ ⦇x2 _ ∷ (≤L1) | x1 ≤L1 x2⦈ ⇒ (≤)) L2"
  and "x1 ≤L1 x2"
  shows "(≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)"
proof -
  from refl_L1 ‹x1 ≤L1 x2› have "x1 ≤L1 x1" by blast
  with mono_L2 ‹x1 ≤L1 x2› show "(≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)" by fastforce
qed

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_unit1_le_assmI:
  assumes mono_l1: "((≤L1) ⇒ (≤R1)) l1"
  and half_galois_prop_right1: "((≤L1) ⊴h (≤R1)) l1 r1"
  and refl_L1: "reflexive_on (in_codom (≤L1)) (≤L1)"
  and antimono_L2: "((x1 : ⊤) ⇒ ⦇x2 x3 ∷ (≤L1) | x1 ≤L1 x2 ∧ x3 ≤L1 η1 x2⦈ ⇒ (≥)) L2"
  and "x1 ≤L1 x2"
  shows "(≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
proof -
  from mono_l1 half_galois_prop_right1 refl_L1 ‹x1 ≤L1 x2› have "x2 ≤L1 η1 x2"
    by (blast intro: t1.rel_unit_if_reflexive_on_if_half_galois_prop_right_if_mono_wrt_rel)
  moreover with refl_L1 have "η1 x2 ≤L1 η1 x2" by blast
  ultimately show "(≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)" using antimono_L2 ‹x1 ≤L1 x2› by fastforce
qed

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_if_monoI':
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "((x1 : ⊤) ⇒ ⦇x2 _ ∷ (≤L1) | x1 ≤L1 x2⦈ ⇒ (≤)) L2"
  and "((x1 : ⊤) ⇒ ⦇x2 x3 ∷ (≤L1) | x1 ≤L1 x2 ∧ x3 ≤L1 η1 x2⦈ ⇒ (≥)) L2"
  and mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_monoI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_unit1_le_assmI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_le_assmI)
  (auto intro: reflexive_on_if_le_pred_if_reflexive_on in_field_if_in_codom
    in_field_if_in_dom)

corollary left_Galois_iff_Dep_Fun_Rel_left_Galois_if_mono_if_galois_connectionI:
  assumes "((≤L1) ⊣ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "((x1 : ⊤) ⇒ ⦇x2 _ ∷ (≤L1) | x1 ≤L1 x2⦈ ⇒ (≤)) L2"
  and "((x1 : ⊤) ⇒ ⦇x2 x3 ∷ (≤L1) | x1 ≤L1 x2 ∧ x3 ≤L1 η1 x2⦈ ⇒ (≥)) L2"
  and mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_monoI') auto

interpretation flip_inv : galois "(≥R1)" "(≥L1)" r1 l1 .

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_unit1_le_assm_if_galois_equivI:
  assumes galois_equiv1: "((≤L1) ≡G (≤R1)) l1 r1"
  and refl_L1: "reflexive_on (in_field (≤L1)) (≤L1)"
  and mono_L2: "((x1 : ⊤) ⇒ ⦇x2 _ ∷ (≤L1) | x1 ≤L1 x2⦈ ⇒ (≤)) L2"
  and "x1 ≤L1 x2"
  shows "(≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
proof -
  from refl_L1 ‹x1 ≤L1 x2› have "x1 ≤L1 x1" by blast
  from galois_equiv1 refl_L1 ‹x1 ≤L1 x2› have "η1 x2 ≤L1 x2" by (intro
    flip.t1.counit_rel_if_reflexive_on_if_half_galois_prop_left_if_mono_wrt_rel)
    blast+
  moreover have "x1 ≤L1 η1 x2" by (rule t1.rel_unit_if_left_rel_if_mono_wrt_relI)
    (insert galois_equiv1 refl_L1 ‹x1 ≤L1 x2›, auto)
  ultimately show "(≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)" using mono_L2 by fastforce
qed

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI:
  assumes "((≤L1) ≡G (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "((x1 : ⊤) ⇒ ⦇x2 _ ∷ (≤L1) | x1 ≤L1 x2⦈ ⇒ (≤)) L2"
  and mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro
    left_Galois_iff_Dep_Fun_Rel_left_Galois_if_monoI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_le_assmI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_unit1_le_assm_if_galois_equivI)
  auto

corollary left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI':
  assumes "((≤L1) ≡G (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and mono_cond_left_rel
  and mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI
    reflexive_on_in_field_mono_assm_left2I)
  auto

corollary left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI:
  assumes "((≤L1) ≡pre (≤R1)) l1 r1"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and mono_cond_left_rel
  and mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI')
  auto


corollary left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI':
  assumes "((≤L1) ≡pre (≤R1)) l1 r1"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡pre (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and mono_cond_left_rel
  and mono_cond_right_fun
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI
    transitive_left2_if_preorder_equivalenceI)
  (auto 5 0)


subparagraph ‹Simplification of Restricted Function Relator›

lemma Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1" and "((≤R1) ⇒ (≤L1)) r1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹
    ((≤⇘L2 (r1 x1') (r1 x2')⇙) h⊴ (≤⇘R2 (ε1 x1') x2'⇙)) (l2⇘x2' (r1 x1')⇙) (r2⇘(r1 x1') x2'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ (≤⇘R2 (ε1 x1') x2'⇙) ≤ (≤⇘R2 x1' x2'⇙)"
  and "⋀x1' x2' y. x1' ≤R1 x2' ⟹ in_dom (≤⇘L2 (r1 x1') (r1 x2')⇙) y ⟹
    (≤⇘R2 x1' x2'⇙) (l2⇘x2' (r1 x1')⇙ y) ≤ (≤⇘R2 x1' x2'⇙) (l2⇘x1' (r1 x1')⇙ y)"
  and "⋀x1 x2 y'. x1 ≤L1 x2 ⟹ in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y' ⟹
    (≥⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≥⇘L2 x1 x2⇙) (r2⇘x2 (l1 x2)⇙ y')"
  shows "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙
    = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))"
  using assms by (intro ext iffI rel_restrict_leftI rel_restrict_rightI
    in_domI[where ?y="r _"] left_rel_right_if_Dep_Fun_Rel_left_GaloisI
    in_codomI[where ?x="l _"] left_right_rel_if_Dep_Fun_Rel_left_GaloisI)
  auto

lemma Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_GaloisI':
  assumes "((≤L1) ⊣ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "reflexive_on (in_field (≤R1)) (≤R1)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹
    ((≤⇘L2 (r1 x1') (r1 x2')⇙) h⊴ (≤⇘R2 (ε1 x1') x2'⇙)) (l2⇘x2' (r1 x1')⇙) (r2⇘(r1 x1') x2'⇙)"
  and "((x1 x2 ∷ (≤L1)) ⇒ ⦇x3 x4 ∷ (≤L1) | x2 ≤L1 x3 ∧ x4 ≤L1 η1 x3⦈ ⇛ (≥)) L2"
  and "((x1' x2' ∷ (≤R1) | ε1 x2' ≤R1 x1') ⇒ ⦇x3' x4' ∷ (≤R1) | x2' ≤R1 x3'⦈ ⇛ (≤)) R2"
  and mono_conds_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ transitive (≤⇘R2 x1' x2'⇙)"
  shows "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙
    = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))"
  using assms by (intro
    Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_GaloisI
    left_rel_right_iff_left_right_rel_if_galois_prop_le_assms_leftI
    reflexive_on_in_field_mono_assm_left2I
    left_rel_right_iff_left_right_rel_if_galois_prop_le_assms_rightI
    mono_wrt_rel_left_in_dom_mono_left_assm
    galois_connection_left_right_if_galois_connection_mono_assms_leftI
    galois_connection_left_right_if_galois_connection_mono_assms_rightI
    left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI)
  auto

text ‹Simplification of Restricted Function Relator for Nested Transports›

lemma Dep_Fun_Rel_left_Galois_restrict_left_right_restrict_left_right_eq:
  fixes S :: "'a1 ⇒ 'a2 ⇒ 'b1 ⇒ 'b2 ⇒ bool"
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  shows "((x x' ∷ (L1⪅)) ⇛ (S x x')↾⇘in_dom (≤⇘L2 x (r1 x')⇙)⇙↿⇘in_codom (≤⇘R2 (l1 x) x'⇙)⇙)
      ↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙ =
    ((x x' ∷ (L1⪅)) ⇛ S x x')↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙" (is "?lhs = ?rhs")
proof -
  have "?lhs = ((x x' ∷ (L1⪅)) ⇛ (S x x')↿⇘in_codom (≤⇘R2 (l1 x) x'⇙)⇙)↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
    by (subst rel_restrict_left_right_eq_restrict_right_left,
      subst Dep_Fun_Rel_restrict_left_restrict_left_eq)
    auto
  also have "... = ?rhs"
    using assms by (subst rel_restrict_left_right_eq_restrict_right_left,
      subst Dep_Fun_Rel_restrict_right_restrict_right_eq)
    (auto elim!: in_codomE t1.left_GaloisE
      simp only: rel_restrict_left_right_eq_restrict_right_left)
  finally show ?thesis .
qed

end


paragraph ‹Function Relator›

context transport_Fun_Rel
begin

corollary Fun_Rel_left_Galois_if_left_GaloisI:
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_dom (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤R2) ⇒ (≤L2)) r2"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤L2)"
  and "g ≤R g"
  and "f L⪅ g"
  shows "((L1⪅) ⇛ (L2⪅)) f g"
  by (urule tdfr.Dep_Fun_Rel_left_Galois_if_left_GaloisI assms | simp)+

corollary left_Galois_if_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "in_codom (≤R) g"
  and "((L1⪅) ⇛ (L2⪅)) f g"
  shows "f L⪅ g"
  by (urule tdfr.left_Galois_if_Dep_Fun_Rel_left_GaloisI assms | simp)+

lemma left_Galois_if_Fun_Rel_left_GaloisI':
  assumes "((≤L1) ⇒ (≤R1)) l1" and "((≤R1) ⇒ (≤L1)) r1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and " ⋀x1' x2'. x1' ≤R1 x2' ⟹ ((≤L2) h⊴ (≤R2)) l2 r2"
  and "((L1⪅) ⇛ (L2⪅)) f g"
  shows "f L⪅ g"
  by (urule tdfr.left_Galois_if_Dep_Fun_Rel_left_GaloisI' assms | simp)+

corollary left_Galois_iff_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_dom (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤R2) ⇒ (≤L2)) r2"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤L2)"
  and "g ≤R g"
  shows "f L⪅ g ⟷ ((L1⪅) ⇛ (L2⪅)) f g"
  by (urule tdfr.left_Galois_iff_Dep_Fun_Rel_left_GaloisI assms | simp)+


subparagraph ‹Simplification of Restricted Function Relator›

lemma Fun_Rel_left_Galois_restrict_left_right_eq_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1" and "((≤R1) ⇒ (≤L1)) r1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ ((≤L2) h⊴ (≤R2)) l2 r2"
  shows "((L1⪅) ⇛ (L2⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙ = ((L1⪅) ⇛ (L2⪅))"
  by (urule tdfr.Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_GaloisI assms
  | simp)+

text ‹Simplification of Restricted Function Relator for Nested Transports›

lemma Fun_Rel_left_Galois_restrict_left_right_restrict_left_right_eq:
  fixes S :: "'b1 ⇒ 'b2 ⇒ bool"
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  shows "((L1⪅) ⇛ S↾⇘in_dom (≤⇘L2⇙)⇙↿⇘in_codom (≤⇘R2⇙)⇙)↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙ =
    ((L1⪅) ⇛ S)↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
  by (urule tdfr.Dep_Fun_Rel_left_Galois_restrict_left_right_restrict_left_right_eq assms | simp)+

end


paragraph ‹Monotone Dependent Function Relator›

context transport_Mono_Dep_Fun_Rel
begin

lemma Dep_Fun_Rel_left_Galois_if_left_GaloisI:
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_dom (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x x' y'. x L1⪅ x' ⟹ in_dom (≤⇘R2 (l1 x) x'⇙) y' ⟹
    (≥⇘L2 x (r1 x')⇙) (r2⇘x (l1 x)⇙ y') ≤ (≥⇘L2 x (r1 x')⇙) (r2⇘x x'⇙ y')"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "f L⪅ g"
  shows "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms unfolding left_rel_eq_tdfr_left_Refl_Rel right_rel_eq_tdfr_right_Refl_Rel
  by (intro tdfr.Dep_Fun_Rel_left_Galois_if_left_GaloisI tdfr.left_GaloisI)
  (auto elim!: galois_rel.left_GaloisE in_codomE)

lemma left_Galois_if_Dep_Fun_Rel_left_GaloisI:
  assumes "(tdfr.R ⇒ tdfr.L) r"
  and "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1 x2 y'. x1 ≤L1 x2 ⟹ in_codom (≤⇘R2 (l1 x1) (l1 x2)⇙) y' ⟹
    (≥⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≥⇘L2 x1 x2⇙) (r2⇘x2 (l1 x2)⇙ y')"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  and "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  shows "f L⪅ g"
  using assms unfolding left_rel_eq_tdfr_left_Refl_Rel right_rel_eq_tdfr_right_Refl_Rel
  by (intro tdfr.Galois_Refl_RelI tdfr.left_Galois_if_Dep_Fun_Rel_left_GaloisI)
  (auto simp: in_codom_eq_in_dom_if_reflexive_on_in_field)

lemma left_Galois_iff_Dep_Fun_Rel_left_GaloisI:
  assumes "(tdfr.R ⇒ tdfr.L) r"
  and "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and tdfr.mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro iffI Dep_Fun_Rel_left_Galois_if_left_GaloisI
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI'
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_mono_assm_in_dom_rightI)
  (auto intro!: left_Galois_if_Dep_Fun_Rel_left_GaloisI
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_mono_assm_in_codom_rightI
    intro: reflexive_on_if_le_pred_if_reflexive_on
      in_field_if_in_dom in_field_if_in_codom)

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_if_mono_if_galois_connectionI:
  assumes galois_conn1: "((≤L1) ⊣ (≤R1)) l1 r1"
  and refl_L1: "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 x1⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and L2_le_unit2: "⋀x1 x2. x1 ≤L1 x2 ⟹ (≤⇘L2 x1 (η1 x2)⇙) ≤ (≤⇘L2 x1 x2⇙)"
  and mono_r2: tdfr.mono_cond_right_fun
  and trans_L2: "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g" (is "?lhs ⟷ ?rhs")
proof -
  have "(≤⇘L2 x1 x2⇙) (r2⇘x1 (l1 x2)⇙ y') ≤ (≤⇘L2 x1 x2⇙) (r2⇘x1 (l1 x1)⇙ y')"
    if hyps: "x1 ≤L1 x2" "in_dom (≤⇘R2 (l1 x1) (l1 x2)⇙) y'" for x1 x2 y'
  proof -
    have "((in_dom (≤⇘R2 (l1 x1) (l1 x2)⇙)) ⇛ (≤⇘L2 x1 x2⇙)) (r2⇘x1 (l1 x1)⇙) (r2⇘x1 (l1 x2)⇙)"
    proof (intro Fun_Rel_predI)
      from galois_conn1 refl_L1 ‹x1 ≤L1 x2›
        have "x1 ≤L1 x1" "l1 x1 ≤R1 l1 x2" "x1 L1⪅ l1 x1"
        by (blast intro: t1.left_Galois_left_if_left_relI)+
      fix y' assume "in_dom (≤⇘R2 (l1 x1) (l1 x2)⇙) y'"
      with mono_r2 ‹x1 ≤L1 x1› ‹l1 x1 ≤R1 l1 x2› have "r2⇘x1 (l1 x1)⇙ y' ≤⇘L2 x1 (η1 x2)⇙ r2⇘x1 (l1 x2)⇙ y'"
        using ‹x1 L1⪅ l1 x1› by fastforce
      with L2_le_unit2 ‹x1 ≤L1 x2› show "r2⇘x1 (l1 x1)⇙ y' ≤⇘L2 x1 x2⇙ r2⇘x1 (l1 x2)⇙ y'" by blast
    qed
    with hyps show ?thesis using trans_L2 by blast
  qed
  then show ?thesis using assms
    using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_GaloisI
      tdfr.mono_wrt_rel_rightI
      tdfr.mono_wrt_rel_right2_if_mono_wrt_rel_right2_if_left_GaloisI
      tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_ge_left_rel2_assmI
      tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_mono_assm_in_codom_rightI)
    (auto intro: reflexive_on_if_le_pred_if_reflexive_on in_field_if_in_codom)
qed

corollary left_Galois_iff_Dep_Fun_Rel_left_Galois_if_mono_if_galois_connectionI':
  assumes "((≤L1) ⊣ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "((x1 : ⊤) ⇒ ⦇x2 _ ∷ (≤L1) | x1 ≤L1 x2⦈ ⇒ (≤)) L2"
  and "((x1 : ⊤) ⇒ ⦇x2 x3 ∷ (≤L1) | x1 ≤L1 x2 ∧ x3 ≤L1 η1 x2⦈ ⇒ (≥)) L2"
  and tdfr.mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g" (is "?lhs ⟷ ?rhs")
  using assms by (intro
    left_Galois_iff_Dep_Fun_Rel_left_Galois_if_mono_if_galois_connectionI
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_unit1_le_assmI
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_le_assmI)
  auto

corollary left_Galois_eq_Dep_Fun_Rel_left_Galois_restrict_if_mono_if_galois_connectionI:
  assumes "((≤L1) ⊣ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and "((x1 : ⊤) ⇒ ⦇x2 _ ∷ (≤L1) | x1 ≤L1 x2⦈ ⇒ (≤)) L2"
  and "((x1 : ⊤) ⇒ ⦇x2 x3 ∷ (≤L1) | x1 ≤L1 x2 ∧ x3 ≤L1 η1 x2⦈ ⇒ (≥)) L2"
  and tdfr.mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  shows "(L⪅) = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
  using assms by (intro ext iffI rel_restrict_leftI rel_restrict_rightI
    iffD1[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_mono_if_galois_connectionI'])
  (auto intro!:
    iffD2[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_mono_if_galois_connectionI'])

lemma left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI:
  assumes "((≤L1) ≡G (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and tdfr.mono_cond_left_rel
  and tdfr.mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_mono_if_galois_connectionI
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_le_assmI
    tdfr.reflexive_on_in_field_mono_assm_left2I
    tdfr.left_Galois_iff_Dep_Fun_Rel_left_Galois_left_rel2_unit1_le_assm_if_galois_equivI)
  auto

theorem left_Galois_eq_Dep_Fun_Rel_left_Galois_restrict_if_galois_equivalenceI:
  assumes "((≤L1) ≡G (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and tdfr.mono_cond_left_rel
  and tdfr.mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  shows "(L⪅) = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
  using assms by (intro ext iffI rel_restrict_leftI rel_restrict_rightI
    iffD1[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI])
  (auto intro!: iffD2[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI])

corollary left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI:
  assumes "((≤L1) ≡pre (≤R1)) l1 r1"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and tdfr.mono_cond_left_rel
  and tdfr.mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_galois_equivalenceI)
  auto

corollary left_Galois_eq_Dep_Fun_Rel_left_Galois_restrict_if_preorder_equivalenceI:
  assumes "((≤L1) ≡pre (≤R1)) l1 r1"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘R2 (l1 x) x'⇙) ⇒ (≤⇘L2 x (r1 x')⇙)) (r2⇘x x'⇙)"
  and tdfr.mono_cond_left_rel
  and tdfr.mono_cond_right_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  shows "(L⪅) = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
  using assms by (intro ext iffI rel_restrict_leftI rel_restrict_rightI
    iffD1[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI])
  (auto intro!: iffD2[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI])

corollary left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI':
  assumes "((≤L1) ≡pre (≤R1)) l1 r1"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡pre (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and tdfr.mono_cond_left_rel
  and tdfr.mono_cond_right_fun
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  shows "f L⪅ g ⟷ ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅)) f g"
  using assms by (intro left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI
    tdfr.transitive_left2_if_preorder_equivalenceI)
  (auto 5 0)

corollary left_Galois_eq_Dep_Fun_Rel_left_Galois_restrict_if_preorder_equivalenceI':
  assumes "((≤L1) ≡pre (≤R1)) l1 r1"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡pre (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and tdfr.mono_cond_left_rel
  and tdfr.mono_cond_right_fun
  shows "(L⪅) = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
  using assms by (intro ext iffI rel_restrict_leftI rel_restrict_rightI
    iffD1[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI'])
  (auto intro!: iffD2[OF left_Galois_iff_Dep_Fun_Rel_left_Galois_if_preorder_equivalenceI'])


subparagraph ‹Simplification of Restricted Function Relator›

lemma Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_Galois_if_reflexive_onI:
  assumes "reflexive_on (in_field tdfr.L) tdfr.L"
  and "reflexive_on (in_field tdfr.R) tdfr.R"
  and "((≤L1) ⊣ (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "reflexive_on (in_field (≤R1)) (≤R1)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹
    ((≤⇘L2 (r1 x1') (r1 x2')⇙) h⊴ (≤⇘R2 (ε1 x1') x2'⇙)) (l2⇘x2' (r1 x1')⇙) (r2⇘(r1 x1') x2'⇙)"
  and "((x1 x2 ∷ (≤L1)) ⇒ ⦇x3 x4 ∷ (≤L1) | x2 ≤L1 x3 ∧ x4 ≤L1 η1 x3⦈ ⇛ (≥)) L2"
  and "((x1' x2' ∷ (≤R1) | ε1 x2' ≤R1 x1') ⇒ ⦇x3' x4' ∷ (≤R1) | x2' ≤R1 x3'⦈ ⇛ (≤)) R2"
  and tdfr.mono_conds_fun
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤⇘L2 x1 x2⇙)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ transitive (≤⇘R2 x1' x2'⇙)"
  shows "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙
    = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))"
  using assms by (auto simp only: left_rel_eq_tdfr_left_rel_if_reflexive_on
      right_rel_eq_tdfr_right_rel_if_reflexive_on
    intro!: tdfr.Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_GaloisI')

interpretation flip : transport_Dep_Fun_Rel R1 L1 r1 l1 R2 L2 r2 l2
  rewrites "flip.t1.unit ≡ ε1" by (simp only: t1.flip_unit_eq_counit)

lemma Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ≡pre (≤R1)) l1 r1"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹
    ((≤⇘L2 (r1 x1') (r1 x2')⇙) h⊴ (≤⇘R2 (ε1 x1') x2'⇙)) (l2⇘x2' (r1 x1')⇙) (r2⇘(r1 x1') x2'⇙)"
  and tdfr.mono_conds
  and PERS: "⋀x1 x2. x1 ≤L1 x2 ⟹ partial_equivalence_rel (≤⇘L2 x1 x2⇙)"
    "⋀x1' x2'. x1' ≤R1 x2' ⟹ partial_equivalence_rel (≤⇘R2 x1' x2'⇙)"
  shows "((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙
    = ((x x' ∷ (L1⪅)) ⇛ (⇘L2 x x'⇙⪅))"
  using assms by (intro
    Dep_Fun_Rel_left_Galois_restrict_left_right_eq_Dep_Fun_Rel_left_Galois_if_reflexive_onI
    tdfr.reflexive_on_in_field_left_if_equivalencesI
    flip.reflexive_on_in_field_left_if_equivalencesI
    tdfr.galois_equivalence_if_mono_if_galois_equivalence_mono_assms_leftI
    flip.galois_equivalence_if_mono_if_galois_equivalence_mono_assms_leftI)
  (auto dest!: PERS elim!: tdfr.mono_condsE tdfr.mono_conds_relE)


text ‹Simplification of Restricted Function Relator for Nested Transports›

lemma Dep_Fun_Rel_left_Galois_restrict_left_right_restrict_left_right_eq:
  fixes S :: "'a1 ⇒ 'a2 ⇒ 'b1 ⇒ 'b2 ⇒ bool"
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  shows "((x x' ∷ (L1⪅)) ⇛ (S x x')↾⇘in_dom (≤⇘L2 x (r1 x')⇙)⇙↿⇘in_codom (≤⇘R2 (l1 x) x'⇙)⇙)
      ↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙ =
    ((x x' ∷ (L1⪅)) ⇛ S x x')↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
    (is "?lhs↾⇘?DL⇙↿⇘?CR⇙ = ?rhs↾⇘?DL⇙↿⇘?CR⇙")
proof (intro ext)
  fix f g
  have "?lhs↾⇘?DL⇙↿⇘?CR⇙ f g ⟷ ?lhs f g ∧ ?DL f ∧ ?CR g" by blast
  also have "... ⟷ ?lhs↾⇘in_dom tdfr.L⇙↿⇘in_codom tdfr.R⇙ f g ∧ ?DL f ∧ ?CR g"
    unfolding left_rel_eq_tdfr_left_Refl_Rel right_rel_eq_tdfr_right_Refl_Rel
    by blast
  also with assms have "... ⟷ ?rhs↾⇘in_dom tdfr.L⇙↿⇘in_codom tdfr.R⇙ f g ∧ ?DL f ∧ ?CR g"
    by (simp only:
      tdfr.Dep_Fun_Rel_left_Galois_restrict_left_right_restrict_left_right_eq)
  also have "... ⟷ ?rhs↾⇘?DL⇙↿⇘?CR⇙ f g"
    unfolding left_rel_eq_tdfr_left_Refl_Rel right_rel_eq_tdfr_right_Refl_Rel
    by blast
  finally show "?lhs↾⇘?DL⇙↿⇘?CR⇙ f g ⟷ ?rhs↾⇘?DL⇙↿⇘?CR⇙ f g" .
qed

end


paragraph ‹Monotone Function Relator›

context transport_Mono_Fun_Rel
begin

corollary Fun_Rel_left_Galois_if_left_GaloisI:
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_dom (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤R2) ⇒ (≤L2)) r2"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤L2)"
  and "f L⪅ g"
  shows "((L1⪅) ⇛ (L2⪅)) f g"
  by (urule tmdfr.Dep_Fun_Rel_left_Galois_if_left_GaloisI assms | simp)+

interpretation flip : transport_Mono_Fun_Rel R1 L1 r1 l1 R2 L2 r2 l2 .

lemma left_Galois_if_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ ((≤R2) ⇒ (≤L2)) r2"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  and "((L1⪅) ⇛ (L2⪅)) f g"
  shows "f L⪅ g"
  by (urule tmdfr.left_Galois_if_Dep_Fun_Rel_left_GaloisI flip.tfr.mono_wrt_rel_leftI)+
   (urule assms | simp)+

corollary left_Galois_iff_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_dom (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤R2) ⇒ (≤L2)) r2"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤L2)"
  and "in_dom (≤L) f"
  and "in_codom (≤R) g"
  shows "f L⪅ g ⟷ ((L1⪅) ⇛ (L2⪅)) f g"
  using assms by (intro iffI Fun_Rel_left_Galois_if_left_GaloisI)
  (auto intro!: left_Galois_if_Fun_Rel_left_GaloisI dest: tdfrs.t1.left_Galois_left_if_left_relI)

theorem left_Galois_eq_Fun_Rel_left_Galois_restrictI:
  assumes "((≤L1) ⇒ (≤R1)) l1"
  and "((≤L1) ⊴ (≤R1)) l1 r1"
  and "reflexive_on (in_dom (≤L1)) (≤L1)"
  and "⋀x x'. x L1⪅ x' ⟹ ((≤R2) ⇒ (≤L2)) r2"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ transitive (≤L2)"
  shows "(L⪅) = ((L1⪅) ⇛ (L2⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
  using assms by (intro ext iffI rel_restrict_leftI rel_restrict_rightI
    iffD1[OF left_Galois_iff_Fun_Rel_left_GaloisI])
  (auto intro!: iffD2[OF left_Galois_iff_Fun_Rel_left_GaloisI])


subparagraph ‹Simplification of Restricted Function Relator›

lemma Fun_Rel_left_Galois_restrict_left_right_eq_Fun_Rel_left_Galois_if_reflexive_onI:
  assumes "reflexive_on (in_field tfr.tdfr.L) tfr.tdfr.L"
  and "reflexive_on (in_field tfr.tdfr.R) tfr.tdfr.R"
  and "((≤L1) ⇒ (≤R1)) l1" and "((≤R1) ⇒ (≤L1)) r1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ ((≤L2) h⊴ (≤R2)) l2 r2"
  shows "((L1⪅) ⇛ (L2⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙ = ((L1⪅) ⇛ (L2⪅))"
  using assms by (auto simp only: tmdfr.left_rel_eq_tdfr_left_rel_if_reflexive_on
      tmdfr.right_rel_eq_tdfr_right_rel_if_reflexive_on
    intro!: tfr.Fun_Rel_left_Galois_restrict_left_right_eq_Fun_Rel_left_GaloisI)

lemma Fun_Rel_left_Galois_restrict_left_right_eq_Fun_Rel_left_GaloisI:
  assumes "((≤L1) ⇒ (≤R1)) l1" and "((≤R1) ⇒ (≤L1)) r1"
  and "((≤L1) ⊴h (≤R1)) l1 r1"
  and "reflexive_on (in_field (≤L1)) (≤L1)"
  and "reflexive_on (in_field (≤R1)) (≤R1)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ ((≤L2) h⊴ (≤R2)) l2 r2"
  and "⋀x1 x2. x1 ≤L1 x2 ⟹ partial_equivalence_rel (≤L2)"
  and "⋀x1' x2'. x1' ≤R1 x2' ⟹ partial_equivalence_rel (≤R2)"
  shows "((L1⪅) ⇛ (L2⪅))↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙ = ((L1⪅) ⇛ (L2⪅))"
  using assms by (intro
    Fun_Rel_left_Galois_restrict_left_right_eq_Fun_Rel_left_Galois_if_reflexive_onI
    tfr.reflexive_on_in_field_leftI
    flip.tfr.reflexive_on_in_field_leftI)
  auto


text ‹Simplification of Restricted Function Relator for Nested Transports›

lemma Fun_Rel_left_Galois_restrict_left_right_restrict_left_right_eq:
  fixes S :: "'b1 ⇒ 'b2 ⇒ bool"
  assumes "((≤L1) h⊴ (≤R1)) l1 r1"
  shows "((L1⪅) ⇛ S↾⇘in_dom (≤⇘L2⇙)⇙↿⇘in_codom (≤⇘R2⇙)⇙)↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙ =
    ((L1⪅) ⇛ S)↾⇘in_dom (≤⇘L⇙)⇙↿⇘in_codom (≤⇘R⇙)⇙"
  by (urule tmdfr.Dep_Fun_Rel_left_Galois_restrict_left_right_restrict_left_right_eq assms | simp)+

end


end