(* 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 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 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. \\<^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 ‹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. \\<^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])
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›isalso 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\" 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" 🍋‹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\ \ (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
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\)" 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
--> --------------------
Messung V0.5
¤ Dauer der Verarbeitung: 0.46 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 und die Messung sind noch experimentell.