Theory Galois_Property
subsection ‹Galois Property›
theory Galois_Property
  imports
    Half_Galois_Property
begin
context galois_prop
begin
definition "galois_prop ≡ ((≤⇘L⇙) ⇩h⊴ (≤⇘R⇙)) ⊓ ((≤⇘L⇙) ⊴⇩h (≤⇘R⇙))"
notation galois_prop.galois_prop (infix ‹⊴› 50)
lemma galois_propI [intro]:
  assumes "((≤⇘L⇙) ⇩h⊴ (≤⇘R⇙)) l r"
  and "((≤⇘L⇙) ⊴⇩h (≤⇘R⇙)) l r"
  shows "((≤⇘L⇙) ⊴ (≤⇘R⇙)) l r"
  unfolding galois_prop_def using assms by auto
lemma galois_propI':
  assumes "⋀x y. in_dom (≤⇘L⇙) x ⟹ in_codom (≤⇘R⇙) y ⟹ x ≤⇘L⇙ r y ⟷ l x ≤⇘R⇙ y"
  shows "((≤⇘L⇙) ⊴ (≤⇘R⇙)) l r"
  using assms by (blast elim: galois_rel.left_GaloisE)
lemma galois_propE [elim]:
  assumes "((≤⇘L⇙) ⊴ (≤⇘R⇙)) l r"
  obtains "((≤⇘L⇙) ⇩h⊴ (≤⇘R⇙)) l r" "((≤⇘L⇙) ⊴⇩h (≤⇘R⇙)) l r"
  using assms unfolding galois_prop_def by auto
interpretation g : galois_prop S T f g for S T f g.
lemma galois_prop_eq_half_galois_prop_left_rel_inf_half_galois_prop_right:
  "((≤⇘L⇙) ⊴ (≤⇘R⇙)) = ((≤⇘L⇙) ⇩h⊴ (≤⇘R⇙)) ⊓ ((≤⇘L⇙) ⊴⇩h (≤⇘R⇙))"
  by (intro ext) auto
lemma galois_prop_left_rel_right_iff_left_right_rel:
  assumes "((≤⇘L⇙) ⊴ (≤⇘R⇙)) l r"
  and "in_dom (≤⇘L⇙) x" "in_codom (≤⇘R⇙) y"
  shows "x ≤⇘L⇙ r y ⟷ l x ≤⇘R⇙ y"
  using assms by blast
lemma rel_inv_galois_prop_eq_galois_prop_rel_inv [simp]:
  "((≤⇘R⇙) ⊴ (≤⇘L⇙))¯ = ((≥⇘L⇙) ⊴ (≥⇘R⇙))"
  by (intro ext) blast
corollary galois_prop_rel_inv_iff_galois_prop [iff]:
  "((≥⇘L⇙) ⊴ (≥⇘R⇙)) f g ⟷ ((≤⇘R⇙) ⊴ (≤⇘L⇙)) g f"
  by auto
end
context galois
begin
lemma galois_prop_left_right_if_transitive_if_deflationary_on_if_inflationary_on_if_mono_wrt_rel:
  assumes "((≤⇘L⇙) ⇒ (≤⇘R⇙)) l" and "((≤⇘R⇙) ⇒ (≤⇘L⇙)) r"
  and "inflationary_on (in_dom (≤⇘L⇙)) (≤⇘L⇙) η"
  and "deflationary_on (in_codom (≤⇘R⇙)) (≤⇘R⇙) ε"
  and "transitive (≤⇘L⇙)" "transitive (≤⇘R⇙)"
  shows "((≤⇘L⇙) ⊴ (≤⇘R⇙)) l r"
  using assms
  by (intro galois_propI
    half_galois_prop_left_left_right_if_transitive_if_deflationary_on_if_mono_wrt_rel
    half_galois_prop_right_left_right_if_transitive_if_inflationary_on_if_mono_wrt_rel)
end
end