(* Title: HOL/Relation.thy Author: Lawrence C Paulson, Cambridge University Computer Laboratory Author: Stefan Berghofer, TU Muenchen Author: Martin Desharnais, MPI-INF Saarbruecken *)
section‹Relations -- as sets of pairs, and binary predicates›
theory Relation imports Product_Type Sum_Type Fields begin
text‹A preliminary: classical rules for reasoning on predicates›
lemma subrelI: "(∧x y. (x, y) ∈ r ==> (x, y) ∈ s) ==> r ⊆ s" 🍋‹Version of @{thm [source] subsetI} for binary relations› by auto
lemma lfp_induct2: "(a, b) ∈ lfp f ==> mono f ==> (∧a b. (a, b) ∈ f (lfp f ∩ {(x, y). P x y}) ==> P a b) ==> P a b" 🍋‹Version of @{thm [source] lfp_induct} for binary relations› using lfp_induct_set [of "(a, b)" f "case_prod P"] by auto
subsubsection ‹Conversions between set and predicate relations›
lemma pred_equals_eq [pred_set_conv]: "(λx. x ∈ R) = (λx. x ∈ S) ⟷ R = S" by (simp add: set_eq_iff fun_eq_iff)
lemma pred_equals_eq2 [pred_set_conv]: "(λx y. (x, y) ∈ R) = (λx y. (x, y) ∈ S) ⟷ R = S" by (simp add: set_eq_iff fun_eq_iff)
lemma pred_subset_eq [pred_set_conv]: "(λx. x ∈ R) ≤ (λx. x ∈ S) ⟷ R ⊆ S" by (simp add: subset_iff le_fun_def)
lemma pred_subset_eq2 [pred_set_conv]: "(λx y. (x, y) ∈ R) ≤ (λx y. (x, y) ∈ S) ⟷ R ⊆ S" by (simp add: subset_iff le_fun_def)
lemma bot_empty_eq [pred_set_conv]: "⊥ = (λx. x ∈ {})" by (auto simp add: fun_eq_iff)
lemma bot_empty_eq2 [pred_set_conv]: "⊥ = (λx y. (x, y) ∈ {})" by (auto simp add: fun_eq_iff)
lemma top_empty_eq: "⊤ = (λx. x ∈ UNIV)" by (auto simp add: fun_eq_iff)
lemma top_empty_eq2: "⊤ = (λx y. (x, y) ∈ UNIV)" by (auto simp add: fun_eq_iff)
lemma inf_Int_eq [pred_set_conv]: "(λx. x ∈ R) ⊓ (λx. x ∈ S) = (λx. x ∈ R ∩ S)" by (simp add: inf_fun_def)
lemma inf_Int_eq2 [pred_set_conv]: "(λx y. (x, y) ∈ R) ⊓ (λx y. (x, y) ∈ S) = (λx y. (x, y) ∈ R ∩ S)" by (simp add: inf_fun_def)
lemma sup_Un_eq [pred_set_conv]: "(λx. x ∈ R) ⊔ (λx. x ∈ S) = (λx. x ∈ R ∪ S)" by (simp add: sup_fun_def)
lemma sup_Un_eq2 [pred_set_conv]: "(λx y. (x, y) ∈ R) ⊔ (λx y. (x, y) ∈ S) = (λx y. (x, y) ∈ R ∪ S)" by (simp add: sup_fun_def)
lemma INF_INT_eq [pred_set_conv]: "(⊓i∈S. (λx. x ∈ r i)) = (λx. x ∈ (∩i∈S. r i))" by (simp add: fun_eq_iff)
lemma INF_INT_eq2 [pred_set_conv]: "(⊓i∈S. (λx y. (x, y) ∈ r i)) = (λx y. (x, y) ∈ (∩i∈S. r i))" by (simp add: fun_eq_iff)
lemma SUP_UN_eq [pred_set_conv]: "(⊔i∈S. (λx. x ∈ r i)) = (λx. x ∈ (∪i∈S. r i))" by (simp add: fun_eq_iff)
lemma SUP_UN_eq2 [pred_set_conv]: "(⊔i∈S. (λx y. (x, y) ∈ r i)) = (λx y. (x, y) ∈ (∪i∈S. r i))" by (simp add: fun_eq_iff)
lemma Inf_INT_eq [pred_set_conv]: "⊓S = (λx. x ∈ (∩(Collect ` S)))" by (simp add: fun_eq_iff)
lemma INF_Int_eq [pred_set_conv]: "(⊓i∈S. (λx. x ∈ i)) = (λx. x ∈∩S)" by (simp add: fun_eq_iff)
lemma Inf_INT_eq2 [pred_set_conv]: "⊓S = (λx y. (x, y) ∈ (∩(Collect ` case_prod ` S)))" by (simp add: fun_eq_iff)
lemma INF_Int_eq2 [pred_set_conv]: "(⊓i∈S. (λx y. (x, y) ∈ i)) = (λx y. (x, y) ∈∩S)" by (simp add: fun_eq_iff)
lemma Sup_SUP_eq [pred_set_conv]: "⊔S = (λx. x ∈∪(Collect ` S))" by (simp add: fun_eq_iff)
lemma SUP_Sup_eq [pred_set_conv]: "(⊔i∈S. (λx. x ∈ i)) = (λx. x ∈∪S)" by (simp add: fun_eq_iff)
lemma Sup_SUP_eq2 [pred_set_conv]: "⊔S = (λx y. (x, y) ∈ (∪(Collect ` case_prod ` S)))" by (simp add: fun_eq_iff)
lemma SUP_Sup_eq2 [pred_set_conv]: "(⊔i∈S. (λx y. (x, y) ∈ i)) = (λx y. (x, y) ∈∪S)" by (simp add: fun_eq_iff)
subsection‹Properties of relations›
subsubsection ‹Reflexivity›
definition refl_on :: "'a set ==> 'a rel ==> bool" where"refl_on A r ⟷ (∀x∈A. (x, x) ∈ r)"
abbreviation refl :: "'a rel ==> bool"🍋‹reflexivity over a type› where"refl ≡ refl_on UNIV"
definition reflp_on :: "'a set ==> ('a ==> 'a ==> bool) ==> bool" where"reflp_on A R ⟷ (∀x∈A. R x x)"
lemma reflp_onI: "(∧x. x ∈ A ==> R x x) ==> reflp_on A R" by (simp add: reflp_on_def)
lemma reflpI[intro?]: "(∧x. R x x) ==> reflp R" by (rule reflp_onI)
lemma refl_onD: "refl_on A r ==> a ∈ A ==> (a, a) ∈ r" unfolding refl_on_def by blast
lemma reflD: "refl r ==> (a, a) ∈ r" unfolding refl_on_def by blast
lemma reflp_onD: "reflp_on A R ==> x ∈ A ==> R x x" by (simp add: reflp_on_def)
lemma reflpD[dest?]: "reflp R ==> R x x" by (simp add: reflp_onD)
lemma reflpE: assumes"reflp r" obtains"r x x" using assms by (auto dest: refl_onD simp add: reflp_def)
lemma refl_on_top[simp]: "refl_on A ⊤" by (simp add: refl_on_def)
lemma reflp_on_top[simp]: "reflp_on A ⊤" by (simp add: reflp_on_def)
lemma reflp_on_mono_strong: "reflp_on B R ==> A ⊆ B ==> (∧x y. x ∈ A ==> y ∈ A ==> R x y ==> Q x y) ==> reflp_on A Q" by (rule reflp_onI) (auto dest: reflp_onD)
lemma reflp_on_mono[mono]: "A ⊆ B ==> R ≤ Q ==> reflp_on B R ≤ reflp_on A Q" by (simp add: reflp_on_mono_strong le_fun_def)
lemma reflp_on_subset: "reflp_on B R ==> A ⊆ B ==> reflp_on A R" using reflp_on_mono_strong .
lemma reflp_on_image: "reflp_on (f ` A) R ⟷ reflp_on A (λa b. R (f a) (f b))" by (simp add: reflp_on_def)
lemma refl_on_Int: "refl_on A r ==> refl_on B s ==> refl_on (A ∩ B) (r ∩ s)" unfolding refl_on_def by blast
lemma reflp_on_inf: "reflp_on A R ==> reflp_on B S ==> reflp_on (A ∩ B) (R ⊓ S)" by (auto intro: reflp_onI dest: reflp_onD)
lemma reflp_inf: "reflp r ==> reflp s ==> reflp (r ⊓ s)" by (rule reflp_on_inf[of UNIV _ UNIV, unfolded Int_absorb])
lemma refl_on_Un: "refl_on A r ==> refl_on B s ==> refl_on (A ∪ B) (r ∪ s)" unfolding refl_on_def by blast
lemma reflp_on_sup: "reflp_on A R ==> reflp_on B S ==> reflp_on (A ∪ B) (R ⊔ S)" by (auto intro: reflp_onI dest: reflp_onD)
lemma reflp_sup: "reflp r ==> reflp s ==> reflp (r ⊔ s)" by (rule reflp_on_sup[of UNIV _ UNIV, unfolded Un_absorb])
lemma refl_on_INTER: "∀x∈S. refl_on (A x) (r x) ==> refl_on (∩(A ` S)) (∩(r ` S))" unfolding refl_on_def by fast
lemma irreflp_on_mono_strong: "irreflp_on B Q ==> A ⊆ B ==> (∧x y. x ∈ A ==> y ∈ A ==> R x y ==> Q x y) ==> irreflp_on A R" by (rule irreflp_onI) (auto dest: irreflp_onD)
lemma irreflp_on_mono[mono]: "A ⊆ B ==> R ≤ Q ==> irreflp_on B Q ≤ irreflp_on A R" by (simp add: irreflp_on_mono_strong le_fun_def)
lemma irrefl_on_subset: "irrefl_on B r ==> A ⊆ B ==> irrefl_on A r" by (auto simp: irrefl_on_def)
lemma irreflp_on_subset: "irreflp_on B R ==> A ⊆ B ==> irreflp_on A R" using irreflp_on_mono_strong .
lemma irreflp_on_image: "irreflp_on (f ` A) R ⟷ irreflp_on A (λa b. R (f a) (f b))" by (simp add: irreflp_on_def)
lemma (in preorder) irreflp_on_less[simp]: "irreflp_on A (<)" by (simp add: irreflp_onI)
lemma (in preorder) irreflp_on_greater[simp]: "irreflp_on A (>)" by (simp add: irreflp_onI)
subsubsection ‹Asymmetry›
definition asym_on :: "'a set ==> 'a rel ==> bool"where "asym_on A r ⟷ (∀x ∈ A. ∀y ∈ A. (x, y) ∈ r ⟶ (y, x) ∉ r)"
lemma asym_onI[intro]: "(∧x y. x ∈ A ==> y ∈ A ==> (x, y) ∈ r ==> (y, x) ∉ r) ==> asym_on A r" by (simp add: asym_on_def)
lemma asymI[intro]: "(∧x y. (x, y) ∈ r ==> (y, x) ∉ r) ==> asym r" by (simp add: asym_onI)
lemma asymp_onI[intro]: "(∧x y. x ∈ A ==> y ∈ A ==> R x y ==>¬ R y x) ==> asymp_on A R" by (rule asym_onI[to_pred])
lemma asympI[intro]: "(∧x y. R x y ==>¬ R y x) ==> asymp R" by (rule asymI[to_pred])
lemma asym_onD: "asym_on A r ==> x ∈ A ==> y ∈ A ==> (x, y) ∈ r ==> (y, x) ∉ r" by (simp add: asym_on_def)
lemma asymD: "asym r ==> (x, y) ∈ r ==> (y, x) ∉ r" by (simp add: asym_onD)
lemma asymp_onD: "asymp_on A R ==> x ∈ A ==> y ∈ A ==> R x y ==>¬ R y x" by (rule asym_onD[to_pred])
lemma asympD: "asymp R ==> R x y ==>¬ R y x" by (rule asymD[to_pred])
lemma asym_on_bot[simp]: "asym_on A ⊥" by (simp add: asym_on_def)
lemma asymp_on_bot[simp]: "asymp_on A ⊥" using asym_on_bot[to_pred] .
lemma asym_iff: "asym r ⟷ (∀x y. (x,y) ∈ r ⟶ (y,x) ∉ r)" by (blast dest: asymD)
lemma asymp_on_mono_strong: "asymp_on B Q ==> A ⊆ B ==> (∧x y. x ∈ A ==> y ∈ A ==> R x y ==> Q x y) ==> asymp_on A R" by (rule asymp_onI) (auto dest: asymp_onD)
lemma asymp_on_mono[mono]: "A ⊆ B ==> R ≤ Q ==> asymp_on B Q ≤ asymp_on A R" by (simp add: asymp_on_mono_strong le_fun_def)
lemma asym_on_subset: "asym_on B r ==> A ⊆ B ==> asym_on A r" by (auto simp: asym_on_def)
lemma asymp_on_subset: "asymp_on B R ==> A ⊆ B ==> asymp_on A R" using asymp_on_mono_strong .
lemma asymp_on_image: "asymp_on (f ` A) R ⟷ asymp_on A (λa b. R (f a) (f b))" by (simp add: asymp_on_def)
lemma irrefl_on_if_asym_on[simp]: "asym_on A r ==> irrefl_on A r" by (auto intro: irrefl_onI dest: asym_onD)
lemma irreflp_on_if_asymp_on[simp]: "asymp_on A r ==> irreflp_on A r" by (rule irrefl_on_if_asym_on[to_pred])
lemma (in preorder) asymp_on_less[simp]: "asymp_on A (<)" by (auto intro: dual_order.asym)
lemma (in preorder) asymp_on_greater[simp]: "asymp_on A (>)" by (auto intro: dual_order.asym)
subsubsection ‹Symmetry›
definition sym_on :: "'a set ==> 'a rel ==> bool"where "sym_on A r ⟷ (∀x ∈ A. ∀y ∈ A. (x, y) ∈ r ⟶ (y, x) ∈ r)"
lemma antisym_onI: "(∧x y. x ∈ A ==> y ∈ A ==> (x, y) ∈ r ==> (y, x) ∈ r ==> x = y) ==> antisym_on A r" unfolding antisym_on_def by simp
lemma antisymI [intro?]: "(∧x y. (x, y) ∈ r ==> (y, x) ∈ r ==> x = y) ==> antisym r" by (simp add: antisym_onI)
lemma antisymp_onI: "(∧x y. x ∈ A ==> y ∈ A ==> R x y ==> R y x ==> x = y) ==> antisymp_on A R" by (rule antisym_onI[to_pred])
lemma antisympI [intro?]: "(∧x y. R x y ==> R y x ==> x = y) ==> antisymp R" by (rule antisymI[to_pred])
lemma antisym_onD: "antisym_on A r ==> x ∈ A ==> y ∈ A ==> (x, y) ∈ r ==> (y, x) ∈ r ==> x = y" by (simp add: antisym_on_def)
lemma antisymD [dest?]: "antisym r ==> (x, y) ∈ r ==> (y, x) ∈ r ==> x = y" by (simp add: antisym_onD)
lemma antisymp_onD: "antisymp_on A R ==> x ∈ A ==> y ∈ A ==> R x y ==> R y x ==> x = y" by (rule antisym_onD[to_pred])
lemma antisympD [dest?]: "antisymp R ==> R x y ==> R y x ==> x = y" by (rule antisymD[to_pred])
lemma antisym_on_bot[simp]: "antisym_on A ⊥" by (simp add: antisym_on_def)
lemma antisymp_on_bot[simp]: "antisymp_on A ⊥" using antisym_on_bot[to_pred] .
lemma antisymp_on_mono_stronger: fixes
A :: "'a set"and R :: "'a ==> 'a ==> bool"and
B :: "'b set"and Q :: "'b ==> 'b ==> bool"and
f :: "'a ==> 'b" assumes"antisymp_on B Q"and"f ` A ⊆ B"and
Q_imp_R: "∧x y. x ∈ A ==> y ∈ A ==> R x y ==> Q (f x) (f y)"and
inj_f: "inj_on f A" shows"antisymp_on A R" proof (rule antisymp_onI) fix x y :: 'a assume"x ∈ A"and"y ∈ A"and"R x y"and"R y x" hence"Q (f x) (f y)"and"Q (f y) (f x)" using Q_imp_R by iprover+ moreoverhave"f x ∈ B"and"f y ∈ B" using‹f ` A ⊆ B›‹x ∈ A›‹y ∈ A›by blast+ ultimatelyhave"f x = f y" using‹antisymp_on B Q›[THEN antisymp_onD] by iprover thus"x = y" using inj_f[THEN inj_onD] ‹x ∈ A›‹y ∈ A›by iprover qed
lemma antisymp_on_mono_strong: "antisymp_on B Q ==> A ⊆ B ==> (∧x y. x ∈ A ==> y ∈ A ==> R x y ==> Q x y) ==> antisymp_on A R" using antisymp_on_mono_stronger[of B Q "λx. x" A R, OF _ _ _ inj_on_id2, unfolded image_ident] .
lemma antisymp_on_mono[mono]: "A ⊆ B ==> R ≤ Q ==> antisymp_on B Q ≤ antisymp_on A R" by (simp add: antisymp_on_mono_strong le_fun_def)
lemma antisym_on_subset: "antisym_on B r ==> A ⊆ B ==> antisym_on A r" by (auto simp: antisym_on_def)
lemma antisymp_on_subset: "antisymp_on B R ==> A ⊆ B ==> antisymp_on A R" using antisymp_on_mono_strong .
lemma antisymp_on_image: assumes"inj_on f A" shows"antisymp_on (f ` A) R ⟷ antisymp_on A (λa b. R (f a) (f b))" using assms by (auto simp: antisymp_on_def inj_on_def)
lemma antisym_subset: "r ⊆ s ==> antisym s ==> antisym r" unfolding antisym_def by blast
lemma antisymp_less_eq: "r ≤ s ==> antisymp s ==> antisymp r" by (fact antisym_subset [to_pred])
lemma antisymp_on_equality[simp]: "antisymp_on A (=)" by (auto intro: antisymp_onI)
lemma antisym_singleton [simp]: "antisym {x}" by (blast intro: antisymI)
lemma antisym_on_if_asym_on: "asym_on A r ==> antisym_on A r" by (auto intro: antisym_onI dest: asym_onD)
lemma antisymp_on_if_asymp_on: "asymp_on A R ==> antisymp_on A R" by (rule antisym_on_if_asym_on[to_pred])
lemma (in preorder) antisymp_on_less[simp]: "antisymp_on A (<)" by (rule antisymp_on_if_asymp_on[OF asymp_on_less])
lemma (in preorder) antisymp_on_greater[simp]: "antisymp_on A (>)" by (rule antisymp_on_if_asymp_on[OF asymp_on_greater])
lemma (in order) antisymp_on_le[simp]: "antisymp_on A (≤)" by (simp add: antisymp_onI)
lemma (in order) antisymp_on_ge[simp]: "antisymp_on A (≥)" by (simp add: antisymp_onI)
subsubsection ‹Transitivity›
definition trans_on :: "'a set ==> 'a rel ==> bool"where "trans_on A r ⟷ (∀x ∈ A. ∀y ∈ A. ∀z ∈ A. (x, y) ∈ r ⟶ (y, z) ∈ r ⟶ (x, z) ∈ r)"
lemma trans_onI: "(∧x y z. x ∈ A ==> y ∈ A ==> z ∈ A ==> (x, y) ∈ r ==> (y, z) ∈ r ==> (x, z) ∈ r) ==> trans_on A r" unfolding trans_on_def by (intro ballI) iprover
lemma transI [intro?]: "(∧x y z. (x, y) ∈ r ==> (y, z) ∈ r ==> (x, z) ∈ r) ==> trans r" by (rule trans_onI)
lemma transp_onI: "(∧x y z. x ∈ A ==> y ∈ A ==> z ∈ A ==> R x y ==> R y z ==> R x z) ==> transp_on A R" by (rule trans_onI[to_pred])
lemma transpI [intro?]: "(∧x y z. R x y ==> R y z ==> R x z) ==> transp R" by (rule transI[to_pred])
lemma transE: assumes"trans r"and"(x, y) ∈ r"and"(y, z) ∈ r" obtains"(x, z) ∈ r" using assms by (unfold trans_def) iprover
lemma transpE: assumes"transp r"and"r x y"and"r y z" obtains"r x z" using assms by (rule transE [to_pred])
lemma trans_onD: "trans_on A r ==> x ∈ A ==> y ∈ A ==> z ∈ A ==> (x, y) ∈ r ==> (y, z) ∈ r ==> (x, z) ∈ r" unfolding trans_on_def by (elim ballE) iprover+
lemma transD[dest?]: "trans r ==> (x, y) ∈ r ==> (y, z) ∈ r ==> (x, z) ∈ r" by (simp add: trans_onD[of UNIV r x y z])
lemma transp_onD: "transp_on A R ==> x ∈ A ==> y ∈ A ==> z ∈ A ==> R x y ==> R y z==> R x z" by (rule trans_onD[to_pred])
lemma transpD[dest?]: "transp R ==> R x y ==> R y z ==> R x z" by (rule transD[to_pred])
lemma trans_on_subset: "trans_on B r ==> A ⊆ B ==> trans_on A r" by (auto simp: trans_on_def)
lemma transp_on_subset: "transp_on B R ==> A ⊆ B ==> transp_on A R" by (auto simp: transp_on_def)
lemma transp_on_image: "transp_on (f ` A) R ⟷ transp_on A (λa b. R (f a) (f b))" by (simp add: transp_on_def)
lemma trans_Int: "trans r ==> trans s ==> trans (r ∩ s)" by (fast intro: transI elim: transE)
lemma transp_inf: "transp r ==> transp s ==> transp (r ⊓ s)" by (fact trans_Int [to_pred])
lemma trans_INTER: "∀x∈S. trans (r x) ==> trans (∩(r ` S))" by (fast intro: transI elim: transD)
lemma trans_on_join [code]: "trans_on A r ⟷ (∀(x, y1) ∈ r. x ∈ A ⟶ y1 ∈ A ⟶ (∀(y2, z) ∈ r. y1 = y2 ⟶ z ∈ A ⟶ (x, z) ∈ r))" by (auto simp: trans_on_def)
lemma trans_join: "trans r ⟷ (∀(x, y1) ∈ r. ∀(y2, z) ∈ r. y1 = y2 ⟶ (x, z) ∈ r)" by (auto simp add: trans_def)
lemma transp_trans: "transp r ⟷ trans {(x, y). r x y}" by (simp add: trans_def transp_def)
lemma transp_on_equality[simp]: "transp_on A (=)" by (auto intro: transp_onI)
lemma trans_on_bot[simp]: "trans_on A ⊥" by (simp add: trans_on_def)
lemma transp_on_bot[simp]: "transp_on A ⊥" using trans_on_bot[to_pred] .
lemma trans_on_top[simp]: "trans_on A ⊤" by (simp add: trans_on_def)
lemma transp_on_top[simp]: "transp_on A ⊤" by (simp add: transp_on_def)
lemma transp_empty [simp]: "transp (λx y. False)" using transp_on_bot unfolding bot_fun_def bot_bool_def .
lemma trans_singleton [simp]: "trans {(a, a)}" by (blast intro: transI)
lemma transp_singleton [simp]: "transp (λx y. x = a ∧ y = a)" by (simp add: transp_def)
lemma asym_on_iff_irrefl_on_if_trans_on: "trans_on A r ==> asym_on A r ⟷ irrefl_on A r" by (auto intro: irrefl_on_if_asym_on dest: trans_onD irrefl_onD)
lemma asymp_on_iff_irreflp_on_if_transp_on: "transp_on A R ==> asymp_on A R ⟷ irreflp_on A R" by (rule asym_on_iff_irrefl_on_if_trans_on[to_pred])
lemma (in preorder) transp_on_le[simp]: "transp_on A (≤)" by (auto intro: transp_onI order_trans)
lemma (in preorder) transp_on_less[simp]: "transp_on A (<)" by (auto intro: transp_onI less_trans)
lemma (in preorder) transp_on_ge[simp]: "transp_on A (≥)" by (auto intro: transp_onI order_trans)
lemma (in preorder) transp_on_greater[simp]: "transp_on A (>)" by (auto intro: transp_onI less_trans)
subsubsection ‹Totality›
definition total_on :: "'a set ==> 'a rel ==> bool"where "total_on A r ⟷ (∀x∈A. ∀y∈A. x ≠ y ⟶ (x, y) ∈ r ∨ (y, x) ∈ r)"
lemma totalp_on_total_on_eq[pred_set_conv]: "totalp_on A (λx y. (x, y) ∈ r) ⟷ total_on A r" by (simp add: totalp_on_def total_on_def)
lemma total_onI [intro?]: "(∧x y. x ∈ A ==> y ∈ A ==> x ≠ y ==> (x, y) ∈ r ∨ (y, x) ∈ r) ==> total_on A r" unfolding total_on_def by blast
lemma totalI: "(∧x y. x ≠ y ==> (x, y) ∈ r ∨ (y, x) ∈ r) ==> total r" by (rule total_onI)
lemma totalp_onI: "(∧x y. x ∈ A ==> y ∈ A ==> x ≠ y ==> R x y ∨ R y x) ==> totalp_on A R" by (rule total_onI[to_pred])
lemma totalpI: "(∧x y. x ≠ y ==> R x y ∨ R y x) ==> totalp R" by (rule totalI[to_pred])
lemma totalp_onD: "totalp_on A R ==> x ∈ A ==> y ∈ A ==> x ≠ y ==> R x y ∨ R y x" by (simp add: totalp_on_def)
lemma totalpD: "totalp R ==> x ≠ y ==> R x y ∨ R y x" by (simp add: totalp_onD)
lemma total_on_top[simp]: "total_on A ⊤" by (simp add: total_on_def)
lemma totalp_on_top[simp]: "totalp_on A ⊤" by (simp add: totalp_on_def)
lemma totalp_on_mono_stronger: fixes
A :: "'a set"and R :: "'a ==> 'a ==> bool"and
B :: "'b set"and Q :: "'b ==> 'b ==> bool"and
f :: "'a ==> 'b" assumes"totalp_on B Q"and"f ` A ⊆ B"and
Q_imp_R: "∧x y. x ∈ A ==> y ∈ A ==> Q (f x) (f y) ==> R x y"and
inj_f: "inj_on f A" shows"totalp_on A R" proof (rule totalp_onI) fix x y :: 'a assume"x ∈ A"and"y ∈ A"and"x ≠ y" hence"f x ∈ B"and"f y ∈ B"and"f x ≠ f y" using‹f ` A ⊆ B› inj_f by (auto dest: inj_onD) hence"Q (f x) (f y) ∨ Q (f y) (f x)" using‹totalp_on B Q›by (iprover dest: totalp_onD) thus"R x y ∨ R y x" using Q_imp_R ‹x ∈ A›‹y ∈ A›by iprover qed
lemma totalp_on_mono_stronger_alt: fixes
A :: "'a set"and R :: "'a ==> 'a ==> bool"and
B :: "'b set"and Q :: "'b ==> 'b ==> bool"and
f :: "'b ==> 'a" assumes"totalp_on B Q"and"A ⊆ f ` B"and
Q_imp_R: "∧x y. x ∈ B ==> y ∈ B ==> Q x y ==> R (f x) (f y)" shows"totalp_on A R" proof (rule totalp_onI) fix x y :: 'a assume"x ∈ A"and"y ∈ A"and"x ≠ y" thenobtain x' y' where"x' ∈ B"and"x = f x'"and"y' ∈ B"and"y = f y'"and"x' ≠ y'" using‹A ⊆ f ` B›by blast hence"Q x' y' ∨ Q y' x'" using‹totalp_on B Q›[THEN totalp_onD] by blast hence"R (f x') (f y') ∨ R (f y') (f x')" using Q_imp_R ‹x' ∈ B›‹y' ∈ B›by blast thus"R x y ∨ R y x" using‹x = f x'›‹y = f y'›by blast qed
lemma totalp_on_mono_strong: "totalp_on B Q ==> A ⊆ B ==> (∧x y. x ∈ A ==> y ∈ A ==> Q x y ==> R x y) ==> totalp_on A R" using totalp_on_mono_stronger[of B Q "λx. x" A R, simplified] .
lemma totalp_on_mono[mono]: "A ⊆ B ==> Q ≤ R ==> totalp_on B Q ≤ totalp_on A R" by (auto intro: totalp_on_mono_strong)
lemma total_on_subset: "total_on B r ==> A ⊆ B ==> total_on A r" by (auto simp: total_on_def)
lemma totalp_on_subset: "totalp_on B R ==> A ⊆ B ==> totalp_on A R" using totalp_on_mono_strong .
lemma totalp_on_image: assumes"inj_on f A" shows"totalp_on (f ` A) R ⟷ totalp_on A (λa b. R (f a) (f b))" using assms by (auto simp: totalp_on_def inj_on_def)
lemma total_on_empty [simp]: "total_on {} r" by (simp add: total_on_def)
lemma totalp_on_empty [simp]: "totalp_on {} R" by (simp add: totalp_on_def)
lemma total_on_singleton [simp]: "total_on {x} r" by (simp add: total_on_def)
lemma totalp_on_singleton [simp]: "totalp_on {x} R" by (simp add: totalp_on_def)
lemma (in linorder) totalp_on_less[simp]: "totalp_on A (<)" by (auto intro: totalp_onI)
lemma (in linorder) totalp_on_greater[simp]: "totalp_on A (>)" by (auto intro: totalp_onI)
lemma (in linorder) totalp_on_le[simp]: "totalp_on A (≤)" by (rule totalp_onI, rule linear)
lemma (in linorder) totalp_on_ge[simp]: "totalp_on A (≥)" by (rule totalp_onI, rule linear)
subsubsection ‹Left uniqueness›
definition left_unique :: "('a ==> 'b ==> bool) ==> bool"where "left_unique R ⟷ (∀x y z. R x z ⟶ R y z ⟶ x = y)"
lemma left_uniqueI: "(∧x y z. A x z ==> A y z ==> x = y) ==> left_unique A" unfolding left_unique_def by blast
lemma left_uniqueD: "left_unique A ==> A x z ==> A y z ==> x = y" unfolding left_unique_def by blast
lemma left_unique_iff_Uniq: "left_unique r ⟷ (∀y. ∃🪙≤🪙1x. r x y)" unfolding Uniq_def left_unique_def by blast
lemma left_unique_bot[simp]: "left_unique ⊥" by (simp add: left_unique_def)
lemma left_unique_mono_strong: "left_unique Q ==> (∧x y. R x y ==> Q x y) ==> left_unique R" by (rule left_uniqueI) (auto dest: left_uniqueD)
lemma left_unique_mono[mono]: "R ≤ Q ==> left_unique Q ≤ left_unique R" using left_unique_mono_strong[of Q R] by (simp add: le_fun_def)
subsubsection ‹Right uniqueness›
definition single_valued :: "('a × 'b) set ==> bool" where"single_valued r ⟷ (∀x y. (x, y) ∈ r ⟶ (∀z. (x, z) ∈ r ⟶ y = z))"
definition right_unique :: "('a ==> 'b ==> bool) ==> bool"where "right_unique R ⟷ (∀x y z. R x y ⟶ R x z ⟶ y = z)"
lemma right_unique_single_valued_eq [pred_set_conv]: "right_unique (λx y. (x, y) ∈ r) ⟷ single_valued r" by (simp add: single_valued_def right_unique_def)
lemma right_unique_iff_Uniq: "right_unique r ⟷ (∀x. ∃🪙≤🪙1y. r x y)" unfolding Uniq_def right_unique_def by auto
lemma single_valuedI: "(∧x y. (x, y) ∈ r ==> (∧z. (x, z) ∈ r ==> y = z)) ==> single_valued r" unfolding single_valued_def by blast
lemma right_uniqueI: "(∧x y z. R x y ==> R x z ==> y = z) ==> right_unique R" unfolding right_unique_def by fast
lemma single_valuedD: "single_valued r ==> (x, y) ∈ r ==> (x, z) ∈ r ==> y = z" by (simp add: single_valued_def)
lemma right_uniqueD: "right_unique R ==> R x y ==> R x z ==> y = z" unfolding right_unique_def by fast
lemma single_valued_empty [simp]: "single_valued {}" by (simp add: single_valued_def)
lemma right_unique_bot[simp]: "right_unique ⊥" by (fact single_valued_empty[to_pred])
lemma right_unique_mono_strong: "right_unique Q ==> (∧x y. R x y ==> Q x y) ==> right_unique R" by (rule right_uniqueI) (auto dest: right_uniqueD)
lemma right_unique_mono[mono]: "R ≤ Q ==> right_unique Q ≤ right_unique R" using right_unique_mono_strong[of Q R] by (simp add: le_fun_def)
lemma single_valued_subset: "r ⊆ s ==> single_valued s ==> single_valued r" unfolding single_valued_def by blast
lemma right_unique_less_eq: "r ≤ s ==> right_unique s ==> right_unique r" by (fact single_valued_subset [to_pred])
subsection‹Relation operations›
subsubsection ‹The identity relation›
definition Id :: "'a rel" where"Id = {p. ∃x. p = (x, x)}"
lemma IdI [intro]: "(a, a) ∈ Id" by (simp add: Id_def)
lemma IdE [elim!]: "p ∈ Id ==> (∧x. p = (x, x) ==> P) ==> P" unfolding Id_def by (iprover elim: CollectE)
lemma pair_in_Id_conv [iff]: "(a, b) ∈ Id ⟷ a = b" unfolding Id_def by blast
lemma refl_Id: "refl Id" by (simp add: refl_on_def)
lemma antisym_Id: "antisym Id" 🍋‹A strange result, since ‹Id›is also symmetric.› by (simp add: antisym_def)
lemma sym_Id: "sym Id" by (simp add: sym_def)
lemma trans_Id: "trans Id" by (simp add: trans_def)
lemma single_valued_Id [simp]: "single_valued Id" by (unfold single_valued_def) blast
lemma single_valued_Id_on [simp]: "single_valued (Id_on A)" unfolding single_valued_def by blast
subsubsection ‹Composition›
inductive_set relcomp :: "('a × 'b) set ==> ('b × 'c) set ==> ('a × 'c) set" for r :: "('a × 'b) set"and s :: "('b × 'c) set" where relcompI [intro]: "(a, b) ∈ r ==> (b, c) ∈ s ==> (a, c) ∈ relcomp r s"
open_bundle relcomp_syntax begin notation relcomp (infixr‹O› 75) and relcompp (infixr‹OO› 75) end
lemmas relcomppI = relcompp.intros
text‹ For historic reasons, the elimination rules are not wholly corresponding. Feel free to consolidate this. ›
inductive_cases relcompEpair: "(a, c) ∈ r O s" inductive_cases relcomppE [elim!]: "(r OO s) a c"
lemma relcompE [elim!]: "xz ∈ r O s ==> (∧x y z. xz = (x, z) ==> (x, y) ∈ r ==> (y, z) ∈ s ==> P) ==> P" apply (cases xz) apply simp apply (erule relcompEpair) apply iprover done
lemma R_O_Id [simp]: "R O Id = R" by fast
lemma Id_O_R [simp]: "Id O R = R" by fast
lemma relcomp_empty1 [simp]: "{} O R = {}" by blast
lemma relcompp_bot1 [simp]: "⊥ OO R = ⊥" by (fact relcomp_empty1 [to_pred])
lemma relcomp_empty2 [simp]: "R O {} = {}" by blast
lemma O_assoc: "(R O S) O T = R O (S O T)" by blast
lemma relcompp_assoc: "(r OO s) OO t = r OO (s OO t)" by (fact O_assoc [to_pred])
lemma trans_O_subset: "trans r ==> r O r ⊆ r" by (unfold trans_def) blast
lemma transp_relcompp_less_eq: "transp r ==> r OO r ≤ r " by (fact trans_O_subset [to_pred])
lemma relcomp_mono: "r' ⊆ r ==> s' ⊆ s ==> r' O s' ⊆ r O s" by blast
lemma relcompp_mono: "r' ≤ r ==> s' ≤ s ==> r' OO s' ≤ r OO s " by (fact relcomp_mono [to_pred])
lemma relcomp_subset_Sigma: "r ⊆ A × B ==> s ⊆ B × C ==> r O s ⊆ A × C" by blast
lemma relcomp_distrib [simp]: "R O (S ∪ T) = (R O S) ∪ (R O T)" by auto
lemma relcompp_distrib [simp]: "R OO (S ⊔ T) = R OO S ⊔ R OO T" by (fact relcomp_distrib [to_pred])
lemma relcomp_distrib2 [simp]: "(S ∪ T) O R = (S O R) ∪ (T O R)" by auto
lemma relcompp_distrib2 [simp]: "(S ⊔ T) OO R = S OO R ⊔ T OO R" by (fact relcomp_distrib2 [to_pred])
lemma relcomp_UNION_distrib: "s O ∪(r ` I) = (∪i∈I. s O r i) " by auto
lemma relcompp_SUP_distrib: "s OO ⊔(r ` I) = (⊔i∈I. s OO r i)" by (fact relcomp_UNION_distrib [to_pred])
lemma relcomp_UNION_distrib2: "∪(r ` I) O s = (∪i∈I. r i O s) " by auto
lemma relcompp_SUP_distrib2: "⊔(r ` I) OO s = (⊔i∈I. r i OO s)" by (fact relcomp_UNION_distrib2 [to_pred])
lemma single_valued_relcomp: "single_valued r ==> single_valued s ==> single_valued (r O s)" unfolding single_valued_def by blast
lemma relcomp_unfold: "r O s = {(x, z). ∃y. (x, y) ∈ r ∧ (y, z) ∈ s}" by (auto simp add: set_eq_iff)
lemma relcompp_apply: "(R OO S) a c ⟷ (∃b. R a b ∧ S b c)" unfolding relcomp_unfold [to_pred] ..
lemma eq_OO: "(=) OO R = R" by blast
lemma OO_eq: "R OO (=) = R" by blast
subsubsection ‹Converse›
inductive_set converse :: "('a × 'b) set ==> ('b × 'a) set" for r :: "('a × 'b) set" where"(a, b) ∈ r ==> (b, a) ∈ converse r"
open_bundle converse_syntax begin notation
converse (‹(‹notation=‹postfix -1›\›_-1)› [1000] 999) and
conversep (‹(‹notation=‹postfix -1-1›\›_-1-1)› [1000] 1000) notation (ASCII)
converse (‹(‹notation=‹postfix -1›\›_^-1)› [1000] 999) and
conversep (‹(‹notation=‹postfix -1-1›\›_^--1)› [1000] 1000) end
lemma converseI [sym]: "(a, b) ∈ r ==> (b, a) ∈ r-1" by (fact converse.intros)
lemma conversepI (* CANDIDATE [sym] *): "r a b \<Longrightarrow> r\<inverse>\<inverse> b a" by (fact conversep.intros)
lemma converseD [sym]: "(a, b) ∈ r-1==> (b, a) ∈ r" by (erule converse.cases) iprover
lemma conversepD (* CANDIDATE [sym] *): "r\<inverse>\<inverse> b a \<Longrightarrow> r a b" by (fact converseD [to_pred])
lemma converseE [elim!]: "yx ∈ r-1==> (∧x y. yx = (y, x) ==> (x, y) ∈ r ==> P) ==> P" 🍋‹More general than ‹converseD›, as it ``splits'' the member of the relation.› apply (cases yx) apply simp apply (erule converse.cases) apply iprover done
lemmas conversepE [elim!] = conversep.cases
lemma converse_iff [iff]: "(a, b) ∈ r-1⟷ (b, a) ∈ r" by (auto intro: converseI)
lemma conversep_iff [iff]: "r-1-1 a b = r b a" by (fact converse_iff [to_pred])
lemma converse_converse [simp]: "(r-1)-1 = r" by (simp add: set_eq_iff)
lemma conversep_conversep [simp]: "(r-1-1)-1-1 = r" by (fact converse_converse [to_pred])
lemma converse_empty[simp]: "{}-1 = {}" by auto
lemma converse_UNIV[simp]: "UNIV-1 = UNIV" by auto
lemma converse_relcomp: "(r O s)-1 = s-1 O r-1" by blast
definition Image :: "('a × 'b) set ==> 'a set ==> 'b set" (infixr‹``› 90) where"r `` s = {y. ∃x∈s. (x, y) ∈ r}"
lemma Image_iff: "b ∈ r``A ⟷ (∃x∈A. (x, b) ∈ r)" by (simp add: Image_def)
lemma Image_singleton: "r``{a} = {b. (a, b) ∈ r}" by (simp add: Image_def)
lemma Image_singleton_iff [iff]: "b ∈ r``{a} ⟷ (a, b) ∈ r" by (rule Image_iff [THEN trans]) simp
lemma ImageI [intro]: "(a, b) ∈ r ==> a ∈ A ==> b ∈ r``A" unfolding Image_def by blast
lemma ImageE [elim!]: "b ∈ r `` A ==> (∧x. (x, b) ∈ r ==> x ∈ A ==> P) ==> P" unfolding Image_def by (iprover elim!: CollectE bexE)
lemma rev_ImageI: "a ∈ A ==> (a, b) ∈ r ==> b ∈ r `` A" 🍋‹This version's more effective when we already have the required ‹a›\by blast
lemma Image_empty1 [simp]: "{} `` X = {}" by auto
lemma Image_empty2 [simp]: "R``{} = {}" by blast
lemma Image_Id [simp]: "Id `` A = A" by blast
lemma Image_Id_on [simp]: "Id_on A `` B = A ∩ B" by blast
lemma Image_Int_subset: "R `` (A ∩ B) ⊆ R `` A ∩ R `` B" by blast
lemma Image_Int_eq: "single_valued (converse R) ==> R `` (A ∩ B) = R `` A ∩ R `` B" by (auto simp: single_valued_def)
lemma Image_Un: "R `` (A ∪ B) = R `` A ∪ R `` B" by blast
lemma Un_Image: "(R ∪ S) `` A = R `` A ∪ S `` A" by blast
lemma Image_subset: "r ⊆ A × B ==> r``C ⊆ B" by (iprover intro!: subsetI elim!: ImageE dest!: subsetD SigmaD2)
lemma Image_eq_UN: "r``B = (∪y∈ B. r``{y})" 🍋‹NOT suitable for rewriting› by blast
lemma Image_mono: "r' ⊆ r ==> A' ⊆ A ==> (r' `` A') ⊆ (r `` A)" by blast
lemma Image_UN: "r `` (∪(B ` A)) = (∪x∈A. r `` (B x))" by blast
lemma UN_Image: "(∪i∈I. X i) `` S = (∪i∈I. X i `` S)" by auto
lemma Image_INT_subset: "(r `` (∩(B ` A))) ⊆ (∩x∈A. r `` (B x))" by blast
text‹Converse inclusion requires some assumptions› lemma Image_INT_eq: assumes"single_valued (r-1)" and"A ≠ {}" shows"r `` (∩(B ` A)) = (∩x∈A. r `` B x)" proof(rule equalityI, rule Image_INT_subset) show"(∩x∈A. r `` B x) ⊆ r `` ∩ (B ` A)" proof fix x assume"x ∈ (∩x∈A. r `` B x)" thenshow"x ∈ r `` ∩ (B ` A)" using assms unfolding single_valued_def by simp blast qed qed
lemma Image_subset_eq: "r``A ⊆ B ⟷ A ⊆ - ((r-1) `` (- B))" by blast
lemma Image_Collect_case_prod [simp]: "{(x, y). P x y} `` A = {y. ∃x∈A. P x y}" by auto
lemma Sigma_Image: "(SIGMA x:A. B x) `` X = (∪x∈X ∩ A. B x)" by auto
lemma relcomp_Image: "(X O Y) `` Z = Y `` (X `` Z)" by auto
subsubsection ‹Inverse image›
definition inv_image :: "'b rel ==> ('a ==> 'b) ==> 'a rel" where"inv_image r f = {(x, y). (f x, f y) ∈ r}"
definition inv_imagep :: "('b ==> 'b ==> bool) ==> ('a ==> 'b) ==> 'a ==> 'a ==> bool" where"inv_imagep r f = (λx y. r (f x) (f y))"
lemma [pred_set_conv]: "inv_imagep (λx y. (x, y) ∈ r) f = (λx y. (x, y) ∈ inv_image r f)" by (simp add: inv_image_def inv_imagep_def)
lemma sym_inv_image: "sym r ==> sym (inv_image r f)" unfolding sym_def inv_image_def by blast
lemma trans_inv_image: "trans r ==> trans (inv_image r f)" unfolding trans_def inv_image_def by (simp (no_asm)) blast
lemma total_inv_image: "[inj f; total r]==> total (inv_image r f)" unfolding inv_image_def total_on_def by (auto simp: inj_eq)
lemma asym_inv_image: "asym R ==> asym (inv_image R f)" by (simp add: inv_image_def asym_iff)
lemma in_inv_image[simp]: "(x, y) ∈ inv_image r f ⟷ (f x, f y) ∈ r" by (auto simp: inv_image_def)
lemma converse_inv_image[simp]: "(inv_image R f)-1 = inv_image (R-1) f" unfolding inv_image_def converse_unfold by auto
lemma in_inv_imagep [simp]: "inv_imagep r f x y = r (f x) (f y)" by (simp add: inv_imagep_def)
subsubsection ‹Powerset›
definition Powp :: "('a ==> bool) ==> 'a set ==> bool" where"Powp A = (λB. ∀x ∈ B. A x)"
lemma Powp_Pow_eq [pred_set_conv]: "Powp (λx. x ∈ A) = (λx. x ∈ Pow A)" by (auto simp add: Powp_def fun_eq_iff)
lemmas Powp_mono [mono] = Pow_mono [to_pred]
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.39 Sekunden
(vorverarbeitet am 2026-04-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.