Theory Transport_Rel_If

✐‹creator "Kevin Kappelmann"›
section ‹Transport using Conditional Relation›
theory Transport_Rel_If
  imports
    Transport_Base
begin

paragraph ‹Summary›
text ‹Setup for Transport using conditional relations.›

context fixes P :: "'a ⇒ bool" and R :: "'a ⇒ 'a ⇒ bool"
begin

lemma reflexive_on_rel_if_if_reflexive_onI [intro]:
  assumes "B ⟹ reflexive_on P R"
  shows "reflexive_on P (B ⟶r R)"
  using assms by (intro reflexive_onI) blast

lemma transitive_on_rel_if_if_transitive_onI [intro]:
  assumes "B ⟹ transitive_on P R"
  shows "transitive_on P (B ⟶r R)"
  using assms by (intro transitive_onI) (blast dest: transitive_onD)

lemma preorder_on_rel_if_if_preorder_onI [intro]:
  assumes "B ⟹ preorder_on P R"
  shows "preorder_on P (B ⟶r R)"
  using assms by (intro preorder_onI) auto

lemma symmetric_on_rel_if_if_symmetric_onI [intro]:
  assumes "B ⟹ symmetric_on P R"
  shows "symmetric_on P (B ⟶r R)"
  using assms by (intro symmetric_onI) (blast dest: symmetric_onD)

lemma partial_equivalence_rel_on_rel_if_if_partial_equivalence_rel_onI [intro]:
  assumes "B ⟹ partial_equivalence_rel_on P R"
  shows "partial_equivalence_rel_on P (B ⟶r R)"
  using assms by (intro partial_equivalence_rel_onI)
  auto

lemma dep_mono_wrt_rel_if_rel_if_if_imp_if_dep_mono_wrt_rel:
  assumes "B ⟹ B' ⟹ ((x y ∷ R) ⇒ S x y) f"
  and "B' ⟹ B"
  shows "((x y ∷ B ⟶r R) ⇒ (B' ⟶r S x y)) f"
  using assms by fastforce

end


locale transport_rel_if =
  fixes L :: "'a ⇒ 'a ⇒ bool"
  and R :: "'b ⇒ 'b ⇒ bool"
  and l :: "'a ⇒ 'b"
  and r :: "'b ⇒ 'a"
  and B B' :: bool
begin

sublocale t : transport L R l r .
sublocale transport "B ⟶r (≤L)" "B' ⟶r (≤R)" l r .

lemma half_galois_prop_left_if_imp_if_half_galois_prop_left:
  assumes "B ⟹ B' ⟹ ((≤L) h⊴ (≤R)) l r"
  and "B' ⟹ B"
  shows "((B ⟶r (≤L)) h⊴ (B' ⟶r (≤R))) l r"
  using assms by (intro half_galois_prop_leftI rel_if_if_imp) fast

lemma half_galois_prop_right_if_imp_if_half_galois_prop_right:
  assumes "B ⟹ B' ⟹ ((≤L) ⊴h (≤R)) l r"
  and "B ⟹ B'"
  shows "((B ⟶r (≤L)) ⊴h (B' ⟶r (≤R))) l r"
  using assms by (intro half_galois_prop_rightI) fast

lemma galois_prop_if_iff_if_galois_prop:
  assumes "B ⟹ B' ⟹ ((≤L) ⊴ (≤R)) l r"
  and "B ⟷ B'"
  shows "((B ⟶r (≤L)) ⊴ (B' ⟶r (≤R))) l r"
  using assms by (intro galois_propI
    half_galois_prop_left_if_imp_if_half_galois_prop_left
    half_galois_prop_right_if_imp_if_half_galois_prop_right)
  auto

lemma galois_connection_if_iff_if_galois_connection:
  assumes "B ⟹ B' ⟹ ((≤L) ⊣ (≤R)) l r"
  and "B ⟷ B'"
  shows "((B ⟶r (≤L)) ⊣ (B' ⟶r (≤R))) l r"
  by (urule (rr) galois_connectionI galois_prop_if_iff_if_galois_prop
    dep_mono_wrt_rel_if_rel_if_if_imp_if_dep_mono_wrt_rel)
  (use assms in auto)

lemma galois_equivalence_if_iff_if_galois_equivalence:
  assumes "B ⟹ B' ⟹ ((≤L) ≡G (≤R)) l r"
  and "B ⟷ B'"
  shows "((B ⟶r (≤L)) ≡G (B' ⟶r (≤R))) l r"
  using assms by (intro galois_equivalenceI
    galois_connection_if_iff_if_galois_connection
    transport_rel_if.galois_prop_if_iff_if_galois_prop)
  (auto elim: galois.galois_connectionE)

lemma preorder_equivalence_if_iff_if_preorder_equivalence:
  assumes "B ⟹ B' ⟹ ((≤L) ≡pre (≤R)) l r"
  and "B ⟷ B'"
  shows "((B ⟶r (≤L)) ≡pre (B' ⟶r (≤R))) l r"
  using assms by (intro preorder_equivalence_if_galois_equivalenceI
    galois_equivalence_if_iff_if_galois_equivalence
    preorder_on_rel_if_if_preorder_onI)
  blast+

lemma partial_equivalence_rel_equivalence_if_iff_if_partial_equivalence_rel_equivalence:
  assumes "B ⟹ B' ⟹ ((≤L) ≡PER (≤R)) l r"
  and "B ⟷ B'"
  shows "((B ⟶r (≤L)) ≡PER (B' ⟶r (≤R))) l r"
  using assms by (intro
    partial_equivalence_rel_equivalence_if_galois_equivalenceI
    galois_equivalence_if_iff_if_galois_equivalence)
  fastforce+

lemma left_Galois_eq_rel_if_left_Galois_if_iff:
  assumes "B ⟷ B'"
  shows "Galois = ((B ∧ B') ⟶r (L⪅))"
  using assms by (fastforce intro: galois_rel.left_GaloisI)

corollary left_Galois_if_iff_if_left_Galois:
  assumes "B ⟹ B' ⟹ x L⪅ y"
  and "B ⟷ B'"
  shows "Galois x y"
  using assms left_Galois_eq_rel_if_left_Galois_if_iff by auto

end

end