Theory Partial_Equiv_Rel
section ‹Partial equivalence relation›
theory Partial_Equiv_Rel
imports "Auto2_HOL.Auto2_Main"
begin
text ‹
Partial equivalence relations, following theory
Lib/Partial\_Equivalence\_Relation in \<^cite>‹"Collections-AFP"›.
›
definition part_equiv :: "('a × 'a) set ⇒ bool" where [rewrite]:
"part_equiv R ⟷ sym R ∧ trans R"
lemma part_equivI [forward]: "sym R ⟹ trans R ⟹ part_equiv R" by auto2
lemma part_equivD1 [forward]: "part_equiv R ⟹ sym R" by auto2
lemma part_equivD2 [forward]: "part_equiv R ⟹ trans R" by auto2
setup ‹del_prfstep_thm_eqforward @{thm part_equiv_def}›
subsection ‹Combining two elements in a partial equivalence relation›
definition per_union :: "('a × 'a) set ⇒ 'a ⇒ 'a ⇒ ('a × 'a) set" where [rewrite]:
"per_union R a b = R ∪ { (x,y). (x,a)∈R ∧ (b,y)∈R } ∪ { (x,y). (x,b)∈R ∧ (a,y)∈R }"
lemma per_union_memI1 [backward]:
"(x, y) ∈ R ⟹ (x, y) ∈ per_union R a b" by (simp add: per_union_def)
setup ‹add_forward_prfstep_cond @{thm per_union_memI1} [with_term "per_union ?R ?a ?b"]›
lemma per_union_memI2 [backward]:
"(x, a) ∈ R ⟹ (b, y) ∈ R ⟹ (x, y) ∈ per_union R a b" by (simp add: per_union_def)
lemma per_union_memI3 [backward]:
"(x, b) ∈ R ⟹ (a, y) ∈ R ⟹ (x, y) ∈ per_union R a b" by (simp add: per_union_def)
lemma per_union_memD:
"(x, y) ∈ per_union R a b ⟹ (x, y) ∈ R ∨ ((x, a) ∈ R ∧ (b, y) ∈ R) ∨ ((x, b) ∈ R ∧ (a, y) ∈ R)"
by (simp add: per_union_def)
setup ‹add_forward_prfstep_cond @{thm per_union_memD} [with_cond "?x ≠ ?y", with_filt (order_filter "x" "y")]›
setup ‹del_prfstep_thm @{thm per_union_def}›
lemma per_union_is_trans [forward]:
"trans R ⟹ trans (per_union R a b)" by auto2
lemma per_union_is_part_equiv [forward]:
"part_equiv R ⟹ part_equiv (per_union R a b)" by auto2
end