Theory Transport_Functions_Order_Base
subsection ‹Basic Order Properties›
theory Transport_Functions_Order_Base
  imports
    Transport_Functions_Base
begin
paragraph ‹Dependent Function Relator›
context hom_Dep_Fun_Rel_orders
begin
lemma reflexive_on_in_domI:
  assumes refl_L: "reflexive_on (in_codom (≤⇘L⇙)) (≤⇘L⇙)"
  and R_le_R_if_L: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x2 x2⇙) ≤ (≤⇘R x1 x2⇙)"
  and pequiv_R: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ partial_equivalence_rel (≤⇘R x1 x2⇙)"
  shows "reflexive_on (in_dom DFR) DFR"
proof (intro reflexive_onI Dep_Fun_Rel_relI)
  fix f x1 x2
  assume "in_dom DFR f"
  then obtain g where "DFR f g" by auto
  moreover assume "x1 ≤⇘L⇙ x2"
  moreover with refl_L have "x2 ≤⇘L⇙ x2" by blast
  ultimately have "f x1 ≤⇘R x1 x2⇙ g x2" "f x2 ≤⇘R x1 x2⇙ g x2"
    using R_le_R_if_L by auto
  moreover with pequiv_R ‹x1 ≤⇘L⇙ x2›  have "g x2 ≤⇘R x1 x2⇙ f x2"
    by (blast dest: symmetricD)
  ultimately show "f x1 ≤⇘R x1 x2⇙ f x2" using pequiv_R ‹x1 ≤⇘L⇙ x2› by blast
qed
lemma reflexive_on_in_codomI:
  assumes refl_L: "reflexive_on (in_dom (≤⇘L⇙)) (≤⇘L⇙)"
  and R_le_R_if_L: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x1 x1⇙) ≤ (≤⇘R x1 x2⇙)"
  and pequiv_R: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ partial_equivalence_rel (≤⇘R x1 x2⇙)"
  shows "reflexive_on (in_codom DFR) DFR"
proof (intro reflexive_onI Dep_Fun_Rel_relI)
  fix f x1 x2
  assume "in_codom DFR f"
  then obtain g where "DFR g f" by auto
  moreover assume "x1 ≤⇘L⇙ x2"
  moreover with refl_L have "x1 ≤⇘L⇙ x1" by blast
  ultimately have "g x1 ≤⇘R x1 x2⇙ f x2" "g x1 ≤⇘R x1 x2⇙ f x1"
    using R_le_R_if_L by auto
  moreover with pequiv_R ‹x1 ≤⇘L⇙ x2›  have "f x1 ≤⇘R x1 x2⇙ g x1"
    by (blast dest: symmetricD)
  ultimately show "f x1 ≤⇘R x1 x2⇙ f x2" using pequiv_R ‹x1 ≤⇘L⇙ x2› by blast
qed
corollary reflexive_on_in_fieldI:
  assumes "reflexive_on (in_field (≤⇘L⇙)) (≤⇘L⇙)"
  and "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x2 x2⇙) ≤ (≤⇘R x1 x2⇙)"
  and "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x1 x1⇙) ≤ (≤⇘R x1 x2⇙)"
  and "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ partial_equivalence_rel (≤⇘R x1 x2⇙)"
  shows "reflexive_on (in_field DFR) DFR"
proof -
  from assms have "reflexive_on (in_dom DFR) DFR"
    by (intro reflexive_on_in_domI)
    (auto intro: reflexive_on_if_le_pred_if_reflexive_on in_field_if_in_codom)
  moreover from assms have "reflexive_on (in_codom DFR) DFR"
    by (intro reflexive_on_in_codomI)
    (auto intro: reflexive_on_if_le_pred_if_reflexive_on in_field_if_in_dom)
  ultimately show ?thesis by (auto iff: in_field_iff_in_dom_or_in_codom)
qed
lemma transitiveI:
  assumes refl_L: "reflexive_on (in_dom (≤⇘L⇙)) (≤⇘L⇙)"
  and R_le_R_if_L: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x1 x1⇙) ≤ (≤⇘R x1 x2⇙)"
  and trans: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ transitive (≤⇘R x1 x2⇙)"
  shows "transitive DFR"
proof (intro transitiveI Dep_Fun_Rel_relI)
  fix f1 f2 f3 x1 x2 assume "x1 ≤⇘L⇙ x2"
  with refl_L have "x1 ≤⇘L⇙ x1" by blast
  moreover assume "DFR f1 f2"
  ultimately have "f1 x1 ≤⇘R x1 x1⇙ f2 x1" by blast
  with R_le_R_if_L have "f1 x1 ≤⇘R x1 x2⇙ f2 x1" using ‹x1 ≤⇘L⇙ x2› by blast
  assume "DFR f2 f3"
  with ‹x1 ≤⇘L⇙ x2› have "f2 x1 ≤⇘R x1 x2⇙ f3 x2" by blast
  with ‹f1 x1 ≤⇘R x1 x2⇙ f2 x1› show "f1 x1 ≤⇘R x1 x2⇙  f3 x2"
    using trans ‹x1 ≤⇘L⇙ x2› by blast
qed
lemma transitiveI':
  assumes refl_L: "reflexive_on (in_codom (≤⇘L⇙)) (≤⇘L⇙)"
  and R_le_R_if_L: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x2 x2⇙) ≤ (≤⇘R x1 x2⇙)"
  and trans: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ transitive (≤⇘R x1 x2⇙)"
  shows "transitive DFR"
proof (intro Binary_Relations_Transitive.transitiveI Dep_Fun_Rel_relI)
  fix f1 f2 f3 x1 x2 assume "DFR f1 f2" "x1 ≤⇘L⇙ x2"
  then have "f1 x1 ≤⇘R x1 x2⇙ f2 x2" by blast
  from ‹x1 ≤⇘L⇙ x2› refl_L have "x2 ≤⇘L⇙ x2" by blast
  moreover assume "DFR f2 f3"
  ultimately have "f2 x2 ≤⇘R x2 x2⇙ f3 x2" by blast
  with R_le_R_if_L have "f2 x2 ≤⇘R x1 x2⇙ f3 x2" using ‹x1 ≤⇘L⇙ x2› by blast
  with ‹f1 x1 ≤⇘R x1 x2⇙ f2 x2› show "f1 x1 ≤⇘R x1 x2⇙ f3 x2"
    using trans ‹x1 ≤⇘L⇙ x2› by blast
qed
lemma preorder_on_in_fieldI:
  assumes "reflexive_on (in_field (≤⇘L⇙)) (≤⇘L⇙)"
  and "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x2 x2⇙) ≤ (≤⇘R x1 x2⇙)"
  and "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x1 x1⇙) ≤ (≤⇘R x1 x2⇙)"
  and pequiv_R: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ partial_equivalence_rel (≤⇘R x1 x2⇙)"
  shows "preorder_on (in_field DFR) DFR"
  using assms by (intro preorder_onI reflexive_on_in_fieldI)
  (auto intro!: transitiveI dest: pequiv_R elim!: partial_equivalence_relE)
lemma symmetricI:
  assumes sym_L: "symmetric (≤⇘L⇙)"
  and R_le_R_if_L: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ (≤⇘R x1 x2⇙) ≤ (≤⇘R x2 x1⇙)"
  and sym_R: "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ symmetric (≤⇘R x1 x2⇙)"
  shows "symmetric DFR"
proof (intro symmetricI Dep_Fun_Rel_relI)
  fix f g x y assume "x ≤⇘L⇙ y"
  with sym_L have "y ≤⇘L⇙ x" by (rule symmetricD)
  moreover assume "DFR f g"
  ultimately have "f y ≤⇘R y x⇙ g x" by blast
  with sym_R ‹y ≤⇘L⇙ x› have "g x ≤⇘R y x⇙ f y" by (blast dest: symmetricD)
  with R_le_R_if_L ‹y ≤⇘L⇙ x› show "g x ≤⇘R x y⇙ f y" by blast
qed
corollary partial_equivalence_relI:
  assumes "reflexive_on (in_field (≤⇘L⇙)) (≤⇘L⇙)"
  and sym_L: "symmetric (≤⇘L⇙)"
  and mono_R: "((x1 x2 ∷ (≤⇘L⇙)) ⇒ (x3 x4 ∷ (≤⇘L⇙) | x1 ≤⇘L⇙ x3) ⇛ (≤)) R"
  and "⋀x1 x2. x1 ≤⇘L⇙ x2 ⟹ partial_equivalence_rel (≤⇘R x1 x2⇙)"
  shows "partial_equivalence_rel DFR"
proof -
  have "(≤⇘R x1 x2⇙) ≤ (≤⇘R x2 x1⇙)" if "x1 ≤⇘L⇙ x2" for x1 x2
  proof -
    from sym_L ‹x1 ≤⇘L⇙ x2› have "x2 ≤⇘L⇙ x1" by (rule symmetricD)
    with mono_R ‹x1 ≤⇘L⇙ x2› show ?thesis by blast
  qed
  with assms show ?thesis
    by (intro partial_equivalence_relI transitiveI symmetricI)
    (blast elim: partial_equivalence_relE[OF assms(4)])+
qed
end
context transport_Dep_Fun_Rel
begin
lemmas reflexive_on_in_field_leftI = dfro1.reflexive_on_in_fieldI
  [folded left_rel_eq_Dep_Fun_Rel]
lemmas transitive_leftI = dfro1.transitiveI[folded left_rel_eq_Dep_Fun_Rel]
lemmas transitive_leftI' = dfro1.transitiveI'[folded left_rel_eq_Dep_Fun_Rel]
lemmas preorder_on_in_field_leftI = dfro1.preorder_on_in_fieldI
  [folded left_rel_eq_Dep_Fun_Rel]
lemmas symmetric_leftI = dfro1.symmetricI[folded left_rel_eq_Dep_Fun_Rel]
lemmas partial_equivalence_rel_leftI = dfro1.partial_equivalence_relI
  [folded left_rel_eq_Dep_Fun_Rel]
subparagraph ‹Introduction Rules for Assumptions›
lemma transitive_left2_if_transitive_left2_if_left_GaloisI:
  assumes "((≤⇘L1⇙) ⇒ (≤⇘R1⇙)) l1"
  and "((≤⇘L1⇙) ⊴⇩h (≤⇘R1⇙)) l1 r1"
  and L2_eq: "(≤⇘L2 x1 x2⇙) = (≤⇘L2 x1 (η⇩1 x2)⇙)"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ transitive (≤⇘L2 x (r1 x')⇙)"
  and "x1 ≤⇘L1⇙ x2"
  shows "transitive (≤⇘L2 x1 x2⇙)"
  by (subst L2_eq) (auto intro!: assms t1.left_Galois_left_if_left_relI)
lemma symmetric_left2_if_symmetric_left2_if_left_GaloisI:
  assumes "((≤⇘L1⇙) ⇒ (≤⇘R1⇙)) l1"
  and "((≤⇘L1⇙) ⊴⇩h (≤⇘R1⇙)) l1 r1"
  and L2_eq: "(≤⇘L2 x1 x2⇙) = (≤⇘L2 x1 (η⇩1 x2)⇙)"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ symmetric (≤⇘L2 x (r1 x')⇙)"
  and "x1 ≤⇘L1⇙ x2"
  shows "symmetric (≤⇘L2 x1 x2⇙)"
  by (subst L2_eq) (auto intro!: assms t1.left_Galois_left_if_left_relI)
lemma partial_equivalence_rel_left2_if_partial_equivalence_rel_left2_if_left_GaloisI:
  assumes "((≤⇘L1⇙) ⇒ (≤⇘R1⇙)) l1"
  and "((≤⇘L1⇙) ⊴⇩h (≤⇘R1⇙)) l1 r1"
  and L2_eq: "(≤⇘L2 x1 x2⇙) = (≤⇘L2 x1 (η⇩1 x2)⇙)"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ partial_equivalence_rel (≤⇘L2 x (r1 x')⇙)"
  and "x1 ≤⇘L1⇙ x2"
  shows "partial_equivalence_rel (≤⇘L2 x1 x2⇙)"
  by (subst L2_eq) (auto intro!: assms t1.left_Galois_left_if_left_relI)
context
  assumes galois_prop: "((≤⇘L1⇙) ⊴ (≤⇘R1⇙)) l1 r1"
begin
interpretation flip_inv :
  transport_Dep_Fun_Rel "(≥⇘R1⇙)" "(≥⇘L1⇙)" r1 l1 "flip2 R2" "flip2 L2" r2 l2
  rewrites "flip_inv.t1.unit ≡ ε⇩1"
  and "⋀R x y. (flip2 R x y) ≡ (R y x)¯"
  and "⋀R S. R¯ = S¯ ≡ R = S"
  and "⋀R S. (R¯ ⇒ S¯) ≡ (R ⇒ S)"
  and "⋀x x'. x' ⇘R1⇙⪆ x ≡ x ⇘L1⇙⪅ x'"
  and "((≥⇘R1⇙) ⊴⇩h (≥⇘L1⇙)) r1 l1 ≡ True"
  and "⋀(R :: 'z ⇒ 'z ⇒ bool). transitive R¯ ≡ transitive R"
  and "⋀(R :: 'z ⇒ 'z ⇒ bool). symmetric R¯ ≡ symmetric R"
  and "⋀(R :: 'z ⇒ 'z ⇒ bool). partial_equivalence_rel R¯ ≡ partial_equivalence_rel R"
  and "⋀P. (True ⟹ P) ≡ Trueprop P"
  and "⋀P Q. (True ⟹ PROP P ⟹ PROP Q) ≡ (PROP P ⟹ True ⟹ PROP Q)"
  using galois_prop
  by (auto intro!: Eq_TrueI simp: t1.flip_unit_eq_counit
    galois_prop.half_galois_prop_right_rel_inv_iff_half_galois_prop_left
    mono_wrt_rel_eq_dep_mono_wrt_rel
    simp del: rel_inv_iff_rel)
lemma transitive_right2_if_transitive_right2_if_left_GaloisI:
  assumes "((≤⇘R1⇙) ⇒ (≤⇘L1⇙)) r1"
  and "(≤⇘R2 x1 x2⇙) = (≤⇘R2 (ε⇩1 x1) x2⇙)"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ transitive (≤⇘R2 (l1 x) x'⇙)"
  and "x1 ≤⇘R1⇙ x2"
  shows "transitive (≤⇘R2 x1 x2⇙)"
  using galois_prop assms
  by (intro flip_inv.transitive_left2_if_transitive_left2_if_left_GaloisI
    [simplified rel_inv_iff_rel, of x1])
  auto
lemma symmetric_right2_if_symmetric_right2_if_left_GaloisI:
  assumes "((≤⇘R1⇙) ⇒ (≤⇘L1⇙)) r1"
  and "(≤⇘R2 x1 x2⇙) = (≤⇘R2 (ε⇩1 x1) x2⇙)"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ symmetric (≤⇘R2 (l1 x) x'⇙)"
  and "x1 ≤⇘R1⇙ x2"
  shows "symmetric (≤⇘R2 x1 x2⇙)"
  using galois_prop assms
  by (intro flip_inv.symmetric_left2_if_symmetric_left2_if_left_GaloisI
    [simplified rel_inv_iff_rel, of x1])
  auto
lemma partial_equivalence_rel_right2_if_partial_equivalence_rel_right2_if_left_GaloisI:
  assumes "((≤⇘R1⇙) ⇒ (≤⇘L1⇙)) r1"
  and "(≤⇘R2 x1 x2⇙) = (≤⇘R2 (ε⇩1 x1) x2⇙)"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ partial_equivalence_rel (≤⇘R2 (l1 x) x'⇙)"
  and "x1 ≤⇘R1⇙ x2"
  shows "partial_equivalence_rel (≤⇘R2 x1 x2⇙)"
  using galois_prop assms
  by (intro flip_inv.partial_equivalence_rel_left2_if_partial_equivalence_rel_left2_if_left_GaloisI
    [simplified rel_inv_iff_rel, of x1])
  auto
end
lemma transitive_left2_if_preorder_equivalenceI:
  assumes pre_equiv1: "((≤⇘L1⇙) ≡⇘pre⇙ (≤⇘R1⇙)) l1 r1"
  and "((x1 x2 ∷ (≥⇘L1⇙)) ⇒ (x3 x4 ∷ (≤⇘L1⇙) | x1 ≤⇘L1⇙ x3) ⇛ (≤)) L2"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡⇘pre⇙ (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and "x1 ≤⇘L1⇙ x2"
  shows "transitive (≤⇘L2 x1 x2⇙)"
proof -
  from ‹x1 ≤⇘L1⇙ x2› pre_equiv1 have "x2 ≡⇘L1⇙ η⇩1 x2"
    by (blast elim: t1.preorder_equivalence_order_equivalenceE
      intro: bi_related_if_rel_equivalence_on)
  with assms have "(≤⇘L2 x1 x2⇙) = (≤⇘L2 x1 (η⇩1 x2)⇙)"
    by (intro left2_eq_if_bi_related_if_monoI) blast+
  with assms show ?thesis
    by (intro transitive_left2_if_transitive_left2_if_left_GaloisI[of x1]) blast+
qed
lemma symmetric_left2_if_partial_equivalence_rel_equivalenceI:
  assumes PER_equiv1: "((≤⇘L1⇙) ≡⇘PER⇙ (≤⇘R1⇙)) l1 r1"
  and "((x1 x2 ∷ (≥⇘L1⇙)) ⇒ (x3 x4 ∷ (≤⇘L1⇙) | x1 ≤⇘L1⇙ x3) ⇛ (≤)) L2"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡⇘PER⇙ (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and "x1 ≤⇘L1⇙ x2"
  shows "symmetric (≤⇘L2 x1 x2⇙)"
proof -
  from ‹x1 ≤⇘L1⇙ x2› PER_equiv1 have "x2 ≡⇘L1⇙ η⇩1 x2"
    by (blast elim: t1.preorder_equivalence_order_equivalenceE
      intro: bi_related_if_rel_equivalence_on)
  with assms have "(≤⇘L2 x1 x2⇙) = (≤⇘L2 x1 (η⇩1 x2)⇙)"
    by (intro left2_eq_if_bi_related_if_monoI) blast+
  with assms show ?thesis
    by (intro symmetric_left2_if_symmetric_left2_if_left_GaloisI[of x1]) blast+
qed
lemma partial_equivalence_rel_left2_if_partial_equivalence_rel_equivalenceI:
  assumes PER_equiv1: "((≤⇘L1⇙) ≡⇘PER⇙ (≤⇘R1⇙)) l1 r1"
  and "((x1 x2 ∷ (≥⇘L1⇙)) ⇒ (x3 x4 ∷ (≤⇘L1⇙) | x1 ≤⇘L1⇙ x3) ⇛ (≤)) L2"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡⇘PER⇙ (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and "x1 ≤⇘L1⇙ x2"
  shows "partial_equivalence_rel (≤⇘L2 x1 x2⇙)"
proof -
  from ‹x1 ≤⇘L1⇙ x2› PER_equiv1 have "x2 ≡⇘L1⇙ η⇩1 x2"
    by (blast elim: t1.preorder_equivalence_order_equivalenceE
      intro: bi_related_if_rel_equivalence_on)
  with assms have "(≤⇘L2 x1 x2⇙) = (≤⇘L2 x1 (η⇩1 x2)⇙)"
    by (intro left2_eq_if_bi_related_if_monoI) blast+
  with assms show ?thesis
    by (intro partial_equivalence_rel_left2_if_partial_equivalence_rel_left2_if_left_GaloisI[of x1])
    blast+
qed
interpretation flip : transport_Dep_Fun_Rel R1 L1 r1 l1 R2 L2 r2 l2
  rewrites "flip.t1.counit ≡ η⇩1" and "flip.t1.unit ≡ ε⇩1"
  by (simp_all only: t1.flip_counit_eq_unit t1.flip_unit_eq_counit)
lemma transitive_right2_if_preorder_equivalenceI:
  assumes pre_equiv1: "((≤⇘L1⇙) ≡⇘pre⇙ (≤⇘R1⇙)) l1 r1"
  and "((x1' x2' ∷ (≥⇘R1⇙)) ⇒ (x3' x4' ∷ (≤⇘R1⇙) | x1' ≤⇘R1⇙ x3') ⇛ (≤)) R2"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡⇘pre⇙ (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and "x1' ≤⇘R1⇙ x2'"
  shows "transitive (≤⇘R2 x1' x2'⇙)"
proof -
  from ‹x1' ≤⇘R1⇙ x2'› pre_equiv1 have "x1' ≡⇘R1⇙ ε⇩1 x1'"
    by (blast elim: t1.preorder_equivalence_order_equivalenceE
      intro: bi_related_if_rel_equivalence_on)
  with assms have "(≤⇘R2 x1' x2'⇙) = (≤⇘R2 (ε⇩1 x1') x2'⇙)"
    by (intro flip.left2_eq_if_bi_related_if_monoI) blast+
  with assms show ?thesis
    by (intro transitive_right2_if_transitive_right2_if_left_GaloisI[of x1']) blast+
qed
lemma symmetric_right2_if_partial_equivalence_rel_equivalenceI:
  assumes PER_equiv1: "((≤⇘L1⇙) ≡⇘PER⇙ (≤⇘R1⇙)) l1 r1"
  and "((x1' x2' ∷ (≥⇘R1⇙)) ⇒ (x3' x4' ∷ (≤⇘R1⇙) | x1' ≤⇘R1⇙ x3') ⇛ (≤)) R2"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡⇘PER⇙ (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and "x1' ≤⇘R1⇙ x2'"
  shows "symmetric (≤⇘R2 x1' x2'⇙)"
proof -
  from ‹x1' ≤⇘R1⇙ x2'› PER_equiv1 have "x1' ≡⇘R1⇙ ε⇩1 x1'"
    by (blast elim: t1.preorder_equivalence_order_equivalenceE
      intro: bi_related_if_rel_equivalence_on)
  with assms have "(≤⇘R2 x1' x2'⇙) = (≤⇘R2 (ε⇩1 x1') x2'⇙)"
    by (intro flip.left2_eq_if_bi_related_if_monoI) blast+
  with assms show ?thesis
    by (intro symmetric_right2_if_symmetric_right2_if_left_GaloisI[of x1']) blast+
qed
lemma partial_equivalence_rel_right2_if_partial_equivalence_rel_equivalenceI:
  assumes PER_equiv1: "((≤⇘L1⇙) ≡⇘PER⇙ (≤⇘R1⇙)) l1 r1"
  and "((x1' x2' ∷ (≥⇘R1⇙)) ⇒ (x3' x4' ∷ (≤⇘R1⇙) | x1' ≤⇘R1⇙ x3') ⇛ (≤)) R2"
  and "⋀x x'. x ⇘L1⇙⪅ x' ⟹ ((≤⇘L2 x (r1 x')⇙) ≡⇘PER⇙ (≤⇘R2 (l1 x) x'⇙)) (l2⇘x' x⇙) (r2⇘x x'⇙)"
  and "x1' ≤⇘R1⇙ x2'"
  shows "partial_equivalence_rel (≤⇘R2 x1' x2'⇙)"
proof -
  from ‹x1' ≤⇘R1⇙ x2'› PER_equiv1 have "x1' ≡⇘R1⇙ ε⇩1 x1'"
    by (blast elim: t1.preorder_equivalence_order_equivalenceE
      intro: bi_related_if_rel_equivalence_on)
  with assms have "(≤⇘R2 x1' x2'⇙) = (≤⇘R2 (ε⇩1 x1') x2'⇙)"
    by (intro flip.left2_eq_if_bi_related_if_monoI) blast+
  with assms show ?thesis
    by (intro partial_equivalence_rel_right2_if_partial_equivalence_rel_right2_if_left_GaloisI[of x1'])
    blast+
qed
end
paragraph ‹Function Relator›
context transport_Fun_Rel
begin
lemma reflexive_on_in_field_leftI:
  assumes "reflexive_on (in_field (≤⇘L1⇙)) (≤⇘L1⇙)"
  and "partial_equivalence_rel (≤⇘L2⇙)"
  shows "reflexive_on (in_field (≤⇘L⇙)) (≤⇘L⇙)"
  using assms by (intro tdfr.reflexive_on_in_field_leftI) simp_all
lemma transitive_leftI:
  assumes "reflexive_on (in_dom (≤⇘L1⇙)) (≤⇘L1⇙)"
  and "transitive (≤⇘L2⇙)"
  shows "transitive (≤⇘L⇙)"
  using assms by (intro tdfr.transitive_leftI) simp_all
lemma transitive_leftI':
  assumes "reflexive_on (in_codom (≤⇘L1⇙)) (≤⇘L1⇙)"
  and "transitive (≤⇘L2⇙)"
  shows "transitive (≤⇘L⇙)"
  using assms by (intro tdfr.transitive_leftI') simp_all
lemma preorder_on_in_field_leftI:
  assumes "reflexive_on (in_field (≤⇘L1⇙)) (≤⇘L1⇙)"
  and "partial_equivalence_rel (≤⇘L2⇙)"
  shows "preorder_on (in_field (≤⇘L⇙)) (≤⇘L⇙)"
  using assms by (intro tdfr.preorder_on_in_field_leftI) simp_all
lemma symmetric_leftI:
  assumes "symmetric (≤⇘L1⇙)"
  and "symmetric (≤⇘L2⇙)"
  shows "symmetric (≤⇘L⇙)"
  using assms by (intro tdfr.symmetric_leftI) simp_all
corollary partial_equivalence_rel_leftI:
  assumes "reflexive_on (in_field (≤⇘L1⇙)) (≤⇘L1⇙)"
  and "symmetric (≤⇘L1⇙)"
  and "partial_equivalence_rel (≤⇘L2⇙)"
  shows "partial_equivalence_rel (≤⇘L⇙)"
  using assms by (intro tdfr.partial_equivalence_rel_leftI) auto
end
paragraph ‹Monotone Dependent Function Relator›
context transport_Mono_Dep_Fun_Rel
begin
lemmas reflexive_on_in_field_leftI = Refl_Rel_reflexive_on_in_field[of tdfr.L,
  folded left_rel_eq_tdfr_left_Refl_Rel]
lemmas transitive_leftI = Refl_Rel_transitiveI
  [of tdfr.L, folded left_rel_eq_tdfr_left_Refl_Rel]
lemmas preorder_on_in_field_leftI = Refl_Rel_preorder_on_in_fieldI[of tdfr.L,
  folded left_rel_eq_tdfr_left_Refl_Rel]
lemmas symmetric_leftI = Refl_Rel_symmetricI[of tdfr.L,
  OF tdfr.symmetric_leftI, folded left_rel_eq_tdfr_left_Refl_Rel]
lemmas partial_equivalence_rel_leftI = Refl_Rel_partial_equivalence_relI[of tdfr.L,
  OF tdfr.partial_equivalence_rel_leftI, folded left_rel_eq_tdfr_left_Refl_Rel]
end
paragraph ‹Monotone Function Relator›
context transport_Mono_Fun_Rel
begin
lemma symmetric_leftI:
  assumes "symmetric (≤⇘L1⇙)"
  and "symmetric (≤⇘L2⇙)"
  shows "symmetric (≤⇘L⇙)"
  using assms by (intro tpdfr.symmetric_leftI) auto
lemma partial_equivalence_rel_leftI:
  assumes "reflexive_on (in_field (≤⇘L1⇙)) (≤⇘L1⇙)"
  and "symmetric (≤⇘L1⇙)"
  and "partial_equivalence_rel (≤⇘L2⇙)"
  shows "partial_equivalence_rel (≤⇘L⇙)"
  using assms by (intro tpdfr.partial_equivalence_rel_leftI) auto
end
end