Theory Galois_Equivalences
subsection ‹Galois Equivalences›
theory Galois_Equivalences
imports
Galois_Connections
Order_Equivalences
Partial_Equivalence_Relations
begin
context galois
begin
text‹In the literature, an adjoint equivalence is an adjunction for which
the unit and counit are natural isomorphisms.
Translated to the category of orders,
this means that a ∗‹Galois equivalence› between two relations
@{term "(≤⇘L⇙)"} and @{term "(≤⇘R⇙)"} is a Galois connection for which the unit
@{term "η"} is @{term "deflationary"} and the counit @{term "ε"} is
@{term "inflationary"}.
For reasons of symmetry, we give a different definition which next to
@{term "((≤⇘L⇙) ⊣ (≤⇘R⇙)) l r"} requires @{term "((≤⇘L⇙) ⊴ (≤⇘R⇙)) l r"}.
In other words, a Galois equivalence is a Galois connection for which the left
and right adjoints are also right and left adjoints, respectively.
As shown below, in the case of preorders, the definitions coincide.›
definition "galois_equivalence ≡ ((≤⇘L⇙) ⊣ (≤⇘R⇙)) l r ∧ ((≤⇘R⇙) ⊴ (≤⇘L⇙)) r l"
notation galois.galois_equivalence (infix ‹≡⇩G› 50)
lemma galois_equivalenceI [intro]:
assumes "((≤⇘L⇙) ⊣ (≤⇘R⇙)) l r"
and "((≤⇘R⇙) ⊴ (≤⇘L⇙)) r l"
shows "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
unfolding galois_equivalence_def using assms by blast
lemma galois_equivalenceE [elim]:
assumes "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
obtains "((≤⇘L⇙) ⊣ (≤⇘R⇙)) l r" "((≤⇘R⇙) ⊣ (≤⇘L⇙)) r l"
using assms unfolding galois_equivalence_def
by (blast intro: galois.galois_connectionI)
context
begin
interpretation g : galois S T f g for S T f g.
lemma galois_equivalence_eq_galois_connection_rel_inf_galois_prop:
"((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) = ((≤⇘L⇙) ⊣ (≤⇘R⇙)) ⊓ ((≥⇘L⇙) ⊴ (≥⇘R⇙))"
by (intro ext) auto
lemma rel_inv_galois_equivalence_eq_galois_equivalence [simp]:
"((≤⇘R⇙) ≡⇩G (≤⇘L⇙))¯ = ((≤⇘L⇙) ≡⇩G (≤⇘R⇙))"
by (intro ext) auto
corollary galois_equivalence_right_left_iff_galois_equivalence_left_right:
"((≤⇘R⇙) ≡⇩G (≤⇘L⇙)) r l ⟷ ((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
by auto
lemma galois_equivalence_rel_inv_eq_galois_equivalence [simp]:
"((≥⇘L⇙) ≡⇩G (≥⇘R⇙)) = ((≤⇘L⇙) ≡⇩G (≤⇘R⇙))"
by (intro ext) auto
lemma inflationary_on_unit_if_reflexive_on_if_galois_equivalence:
fixes P :: "'a ⇒ bool"
assumes "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
and "reflexive_on P (≤⇘L⇙)"
shows "inflationary_on P (≤⇘L⇙) η"
using assms by (intro inflationary_on_unit_if_reflexive_on_if_galois_connection)
(elim galois_equivalenceE)
end
lemma deflationary_on_unit_if_reflexive_on_if_galois_equivalence:
fixes P :: "'a ⇒ bool"
assumes "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
and "reflexive_on P (≤⇘L⇙)"
shows "deflationary_on P (≤⇘L⇙) η"
proof -
interpret flip : galois R L r l .
show ?thesis using assms
by (auto intro: flip.deflationary_on_counit_if_reflexive_on_if_galois_connection
simp only: flip.flip_unit_eq_counit)
qed
text ‹Every @{term "galois_equivalence"} on reflexive orders is a Galois
equivalence in the sense of the common literature.›
lemma rel_equivalence_on_unit_if_reflexive_on_if_galois_equivalence:
fixes P :: "'a ⇒ bool"
assumes "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
and "reflexive_on P (≤⇘L⇙)"
shows "rel_equivalence_on P (≤⇘L⇙) η"
using assms by (intro rel_equivalence_onI
inflationary_on_unit_if_reflexive_on_if_galois_equivalence
deflationary_on_unit_if_reflexive_on_if_galois_equivalence)
lemma galois_equivalence_partial_equivalence_rel_not_reflexive_not_transitive:
assumes "∃(y :: 'b) y'. y ≠ y'"
shows "∃(L :: 'a ⇒ 'a ⇒ bool) (R :: 'b ⇒ 'b ⇒ bool) l r.
(L ≡⇩G R) l r ∧ partial_equivalence_rel L ∧
¬(reflexive_on (in_field R) R) ∧ ¬(transitive_on (in_field R) R)"
proof -
from assms obtain cy cy' where "(cy :: 'b) ≠ cy'" by blast
let ?cx = "undefined :: 'a"
let ?L = "λx x'. ?cx = x ∧ x = x'"
and ?R = "λy y'. (y = cy ∨ y = cy') ∧ (y' = cy ∨ y' = cy') ∧ (y ≠ cy' ∨ y' ≠ cy')"
and ?l = "λ(a :: 'a). cy"
and ?r = "λ(b :: 'b). ?cx"
interpret g : galois ?L ?R ?l ?r .
interpret flip_g : galois ?R ?L ?r ?l .
have "(?L ≡⇩G ?R) ?l ?r" using ‹cy ≠ cy'› by blast
moreover have "partial_equivalence_rel ?L" by blast
moreover have
"¬(transitive_on (in_field ?R) ?R)" and "¬(reflexive_on (in_field ?R) ?R)"
using ‹cy ≠ cy'› by auto
ultimately show "?thesis" by blast
qed
subsection ‹Equivalence of Order Equivalences and Galois Equivalences›
text ‹In general categories, every adjoint equivalence is an equivalence but not vice versa.
In the category of preorders, however, they are morally the same: the
adjoint zigzag equations are satisfied up to unique isomorphism rather than equality.
In the category of partial orders, the concepts coincide.›
lemma half_galois_prop_left_left_right_if_transitive_if_order_equivalence:
assumes "((≤⇘L⇙) ≡⇩o (≤⇘R⇙)) l r"
and "transitive (≤⇘L⇙)" "transitive (≤⇘R⇙)"
shows "((≤⇘L⇙) ⇩h⊴ (≤⇘R⇙)) l r"
using assms
by (intro half_galois_prop_left_left_right_if_transitive_if_deflationary_on_if_mono_wrt_rel)
(auto elim!: order_equivalenceE
intro: deflationary_on_if_le_pred_if_deflationary_on in_field_if_in_codom
intro!: le_predI)
lemma half_galois_prop_right_left_right_if_transitive_if_order_equivalence:
assumes "((≤⇘L⇙) ≡⇩o (≤⇘R⇙)) l r"
and "transitive (≤⇘L⇙)" "transitive (≤⇘R⇙)"
shows "((≤⇘L⇙) ⊴⇩h (≤⇘R⇙)) l r"
using assms
by (intro half_galois_prop_right_left_right_if_transitive_if_inflationary_on_if_mono_wrt_rel)
(auto elim!: order_equivalenceE
intro: inflationary_on_if_le_pred_if_inflationary_on in_field_if_in_dom
intro!: le_predI
simp only: flip_counit_eq_unit)
lemma galois_prop_left_right_if_transitive_if_order_equivalence:
assumes "((≤⇘L⇙) ≡⇩o (≤⇘R⇙)) l r"
and "transitive (≤⇘L⇙)" "transitive (≤⇘R⇙)"
shows "((≤⇘L⇙) ⊴ (≤⇘R⇙)) l r"
using assms
half_galois_prop_left_left_right_if_transitive_if_order_equivalence
half_galois_prop_right_left_right_if_transitive_if_order_equivalence
by blast
corollary galois_connection_left_right_if_transitive_if_order_equivalence:
assumes "((≤⇘L⇙) ≡⇩o (≤⇘R⇙)) l r"
and "transitive (≤⇘L⇙)" "transitive (≤⇘R⇙)"
shows "((≤⇘L⇙) ⊣ (≤⇘R⇙)) l r"
using assms galois_prop_left_right_if_transitive_if_order_equivalence
by (intro galois_connectionI) auto
interpretation flip : galois R L r l
rewrites "flip.unit ≡ ε"
by (simp only: flip_unit_eq_counit)
corollary galois_equivalence_left_right_if_transitive_if_order_equivalence:
assumes "((≤⇘L⇙) ≡⇩o (≤⇘R⇙)) l r"
and "transitive (≤⇘L⇙)" "transitive (≤⇘R⇙)"
shows "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
using assms galois_connection_left_right_if_transitive_if_order_equivalence
flip.galois_prop_left_right_if_transitive_if_order_equivalence
by (intro galois_equivalenceI)
(auto simp only: order_equivalence_right_left_iff_order_equivalence_left_right)
lemma order_equivalence_if_reflexive_on_in_field_if_galois_equivalence:
assumes "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) l r"
and "reflexive_on (in_field (≤⇘L⇙)) (≤⇘L⇙)" "reflexive_on (in_field (≤⇘R⇙)) (≤⇘R⇙)"
shows "((≤⇘L⇙) ≡⇩o (≤⇘R⇙)) l r"
using assms rel_equivalence_on_unit_if_reflexive_on_if_galois_equivalence
flip.rel_equivalence_on_unit_if_reflexive_on_if_galois_equivalence
by (intro order_equivalenceI)
(auto simp only: galois_equivalence_right_left_iff_galois_equivalence_left_right)
corollary galois_equivalence_eq_order_equivalence_if_preorder_on_in_field:
assumes "preorder_on (in_field (≤⇘L⇙)) (≤⇘L⇙)" "preorder_on (in_field (≤⇘R⇙)) (≤⇘R⇙)"
shows "((≤⇘L⇙) ≡⇩G (≤⇘R⇙)) = ((≤⇘L⇙) ≡⇩o (≤⇘R⇙))"
using assms
galois.order_equivalence_if_reflexive_on_in_field_if_galois_equivalence
galois.galois_equivalence_left_right_if_transitive_if_order_equivalence
by (elim preorder_on_in_fieldE, intro ext) blast
end
end