(* Title: HOL/Relation.thy Author: Lawrence C Paulson, Cambridge University Computer Laboratory Author: Stefan Berghofer, TU Muenchen Author: Martin Desharnais, MPI-INF Saarbruecken
*)
section \<open>Relations -- as sets of pairs, and binary predicates\<close>
theory Relation imports Product_Type Sum_Type Fields begin
text\<open>A preliminary: classical rules for reasoning on predicates\<close>
subsubsection \<open>Relations as sets of pairs\<close>
type_synonym'a rel = "('a \<times> 'a) set"
lemma subrelI: "(\x y. (x, y) \ r \ (x, y) \ s) \ r \ s" \<comment> \<open>Version of @{thm [source] subsetI} for binary relations\<close> by auto
lemma lfp_induct2: "(a, b) \ lfp f \ mono f \
(\<And>a b. (a, b) \<in> f (lfp f \<inter> {(x, y). P x y}) \<Longrightarrow> P a b) \<Longrightarrow> P a b" \<comment> \<open>Version of @{thm [source] lfp_induct} for binary relations\<close> using lfp_induct_set [of "(a, b)" f "case_prod P"] by auto
subsubsection \<open>Conversions between set and predicate relations\<close>
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 \<open>Properties of relations\<close>
subsubsection \<open>Reflexivity\<close>
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 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 \<open>Asymmetry\<close>
definition asym_on :: "'a set \ 'a rel \ bool" where "asym_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\<open>f ` A \<subseteq> B\<close> \<open>x \<in> A\<close> \<open>y \<in> A\<close> by blast+ ultimatelyhave"f x = f y" using\<open>antisymp_on B Q\<close>[THEN antisymp_onD] by iprover thus"x = y" using inj_f[THEN inj_onD] \<open>x \<in> A\<close> \<open>y \<in> A\<close> 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 \<open>Transitivity\<close>
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)"
abbreviation trans :: "'a rel \ bool" where "trans \ trans_on UNIV"
definition transp_on :: "'a set \ ('a \ 'a \ bool) \ bool" where "transp_on A R \ (\x \ A. \y \ A. \z \ A. R x y \ R y z \ R x z)"
abbreviation transp :: "('a \ 'a \ bool) \ bool" where "transp \ transp_on UNIV"
lemma trans_def[no_atp]: "trans r \ (\x y z. (x, y) \ r \ (y, z) \ r \ (x, z) \ r)" by (simp add: trans_on_def)
lemma transp_def: "transp R \ (\x y z. R x y \ R y z \ R x z)" by (simp add: transp_on_def)
text\<open>@{thm [source] trans_def} and @{thm [source] transp_def} are for backward compatibility.\<close>
lemma transp_on_trans_on_eq[pred_set_conv]: "transp_on A (\x y. (x, y) \ r) \ trans_on A r" by (simp add: trans_on_def transp_on_def)
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 \
(\<forall>(y2, z) \<in> r. y1 = y2 \<longrightarrow> z \<in> A \<longrightarrow> (x, z) \<in> 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 \<open>Totality\<close>
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)"
abbreviation total :: "'a rel \ bool" where "total \ total_on UNIV"
definition totalp_on :: "'a set \ ('a \ 'a \ bool) \ bool" where "totalp_on A R \ (\x \ A. \y \ A. x \ y \ R x y \ R y x)"
abbreviation totalp :: "('a \ 'a \ bool) \ bool" where "totalp \ totalp_on UNIV"
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\<open>f ` A \<subseteq> B\<close> inj_f by (auto dest: inj_onD) hence"Q (f x) (f y) \ Q (f y) (f x)" using\<open>totalp_on B Q\<close> by (iprover dest: totalp_onD) thus"R x y \ R y x" using Q_imp_R \<open>x \<in> A\<close> \<open>y \<in> A\<close> 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\<open>A \<subseteq> f ` B\<close> by blast hence"Q x' y' \ Q y' x'" using\<open>totalp_on B Q\<close>[THEN totalp_onD] by blast hence"R (f x') (f y') \ R (f y') (f x')" using Q_imp_R \<open>x' \<in> B\<close> \<open>y' \<in> B\<close> by blast thus"R x y \ R y x" using\<open>x = f x'\<close> \<open>y = f y'\<close> 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 \<open>Left uniqueness\<close>
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. \\<^sub>\\<^sub>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 \<open>Right uniqueness\<close>
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. \\<^sub>\\<^sub>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])
lemma single_valued_Id_on [simp]: "single_valued (Id_on A)" unfolding single_valued_def by blast
subsubsection \<open>Composition\<close>
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\<open>O\<close> 75) and relcompp (infixr \<open>OO\<close> 75) end
lemmas relcomppI = relcompp.intros
text\<open> For historic reasons, the elimination rules are not wholly corresponding.
Feel free to consolidate this. \<close>
inductive_cases relcompEpair: "(a, c) \ r O s" inductive_cases relcomppE [elim!]: "(r OO s) a c"
lemma relcompE [elim!]: "xz \ r O s \
(\<And>x y z. xz = (x, z) \<Longrightarrow> (x, y) \<in> r \<Longrightarrow> (y, z) \<in> s \<Longrightarrow> P) \<Longrightarrow> 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 \<open>Converse\<close>
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 (\<open>(\<open>notation=\<open>postfix -1\<close>\<close>_\<inverse>)\<close> [1000] 999) and
conversep (\<open>(\<open>notation=\<open>postfix -1-1\<close>\<close>_\<inverse>\<inverse>)\<close> [1000] 1000) notation (ASCII)
converse (\<open>(\<open>notation=\<open>postfix -1\<close>\<close>_^-1)\<close> [1000] 999) and
conversep (\<open>(\<open>notation=\<open>postfix -1-1\<close>\<close>_^--1)\<close> [1000] 1000) end
lemma converseI [sym]: "(a, b) \ r \ (b, a) \ r\" 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\ \ (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\ \ (\x y. yx = (y, x) \ (x, y) \ r \ P) \ P" \<comment> \<open>More general than \<open>converseD\<close>, as it ``splits'' the member of the relation.\<close> apply (cases yx) apply simp apply (erule converse.cases) apply iprover done
lemmas conversepE [elim!] = conversep.cases
lemma converse_iff [iff]: "(a, b) \ r\ \ (b, a) \ r" by (auto intro: converseI)
lemma conversep_iff [iff]: "r\\ a b = r b a" by (fact converse_iff [to_pred])
lemma converse_converse [simp]: "(r\)\ = r" by (simp add: set_eq_iff)
lemma conversep_conversep [simp]: "(r\\)\\ = r" by (fact converse_converse [to_pred])
lemma converse_empty[simp]: "{}\ = {}" by auto
lemma converse_UNIV[simp]: "UNIV\ = UNIV" by auto
lemma converse_relcomp: "(r O s)\ = s\ O r\" by blast
subsubsection \<open>Image of a set under a relation\<close>
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" \<comment> \<open>This version's more effective when we already have the required \<open>a\<close>\<close> 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})" \<comment> \<open>NOT suitable for rewriting\<close> 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\<open>Converse inclusion requires some assumptions\<close> lemma Image_INT_eq: assumes"single_valued (r\)" 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\) `` (- 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
--> --------------------
--> maximum size reached
--> --------------------
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
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 ist noch experimentell.