(* Title: Relational Characterisation of Paths Author:WalterGuttmann,PeterHoefner Maintainer:WalterGuttmann<walter.guttmannatcanterbury.ac.nz> PeterHoefner<peterathoefner-online.de>
*)
section‹Relational Characterisation of Paths›
text‹
theory provides the relation-algebraic characterisations of paths, as defined in Sections 3--5 of cite‹"BerghammerFurusawaGuttmannHoefner2020"›. ›
lemma no_start_end_points_iff: "no_start_end_points x ⟷ no_start_points x ∧ no_end_points x" by fastforce
lemma has_start_end_points_iff: "has_start_end_points x ⟷ has_start_points x ∧ has_end_points x" by (metis inf_eq_top_iff)
lemma terminating_iff: "terminating x ⟷ backward_terminating x ∧ forward_terminating x" by simp
lemma finite_iff: "finite x ⟷ backward_finite x ∧ forward_finite x" by (simp add: sup_inf_distrib1 inf.boundedI)
lemma no_start_end_points_path_iff: "no_start_end_points_path x ⟷ no_start_points_path x ∧ no_end_points_path x" by fastforce
lemma has_start_end_points_path_iff: "has_start_end_points_path x ⟷ has_start_points_path x ∧ has_end_points_path x" using has_start_end_points_iff by blast
lemma terminating_path_iff: "terminating_path x ⟷ backward_terminating_path x ∧ forward_terminating_path x" by fastforce
lemma finite_path_iff: "finite_path x ⟷ backward_finite_path x ∧ forward_finite_path x" using finite_iff by fastforce
text‹Closure under converse›
lemma connected_conv: "connected x ⟷ connected (xT)" by (metis comp_assoc conv_add conv_contrav conv_iso conv_one star_conv)
lemma conv_many_strongly_connected: "many_strongly_connected x ⟷ many_strongly_connected (xT)" by fastforce
lemma conv_one_strongly_connected: "one_strongly_connected x ⟷ one_strongly_connected (xT)" by (metis comp_assoc conv_contrav conv_iso conv_one star_conv)
lemma conv_path: "path x ⟷ path (xT)" using connected_conv inj_p_fun path_def by fastforce
lemma conv_cycle: "cycle x ⟷ cycle (xT)" using conv_path by fastforce
lemma conv_no_start_points: "no_start_points x ⟷ no_end_points (xT)" by simp
lemma conv_no_start_end_points: "no_start_end_points x ⟷ no_start_end_points (xT)" by fastforce
lemma conv_has_start_points: "has_start_points x ⟷ has_end_points (xT)" by (metis comp_assoc conv_compl conv_contrav conv_invol conv_one)
lemma conv_has_start_end_points: "has_start_end_points x ⟷ has_start_end_points (xT)" by (metis comp_assoc conv_compl conv_contrav conv_invol conv_one inf_eq_top_iff)
lemma conv_backward_terminating: "backward_terminating x ⟷ forward_terminating (xT)" by (metis comp_assoc conv_compl conv_contrav conv_iso conv_one)
lemma conv_backward_finite: "backward_finite x ⟷ forward_finite (xT)" by (metis comp_assoc conv_add conv_compl conv_contrav conv_iso conv_one star_conv)
lemma conv_finite: "finite x ⟷ finite (xT)" by (metis finite_iff conv_backward_finite conv_invol)
lemma conv_no_start_points_path: "no_start_points_path x ⟷ no_end_points_path (xT)" using conv_path by fastforce
lemma conv_no_start_end_points_path: "no_start_end_points_path x ⟷ no_start_end_points_path (xT)" using conv_path by fastforce
lemma conv_has_start_points_path: "has_start_points_path x ⟷ has_end_points_path (xT)" using conv_has_start_points conv_path by fastforce
lemma conv_has_start_end_points_path: "has_start_end_points_path x ⟷ has_start_end_points_path (xT)" using conv_has_start_end_points conv_path by fastforce
lemma conv_backward_terminating_path: "backward_terminating_path x ⟷ forward_terminating_path (xT)" using conv_backward_terminating conv_path by fastforce
lemma conv_terminating_path: "terminating_path x ⟷ terminating_path (xT)" using conv_path conv_terminating by fastforce
lemma conv_backward_finite_path: "backward_finite_path x ⟷ forward_finite_path (xT)" using conv_backward_finite conv_path by fastforce
lemma conv_finite_path: "finite_path x ⟷ finite_path (xT)" using conv_finite conv_path by blast
text‹Equivalences for ‹connected››
lemma connected_iff2: assumes"is_inj x" and"is_p_fun x" shows"connected x ⟷ x;1;xT≤ x\<star> + xT\<star>" proof assume1: "connected x" have"x;1;xT≤ x;1;x;xT" by (metis conv_invol modular_var_3 vector_meet_comp_x') alsohave"... ≤ (x+ + xT\<star>);xT" using1 mult_isor star_star_plus by fastforce alsohave"... ≤ x\<star>;x;xT + xT\<star>" using join_isol star_slide_var by simp alsofrom assms(1) have"... ≤ x\<star> + xT\<star>" by (metis is_inj_def comp_assoc join_iso mult_1_right mult_isol) finallyshow"x;1;xT≤ x\<star> + xT\<star>" . next assume2: "x;1;xT≤ x\<star> + xT\<star>" have"x;1;x ≤ x;1;xT;x" by (simp add: modular_var_3 vector_meet_comp_x) alsohave"... ≤ (x\<star> + xT+);x" using2by (metis mult_isor star_star_plus sup_commute) alsohave"... ≤ x\<star> + xT\<star>;xT;x" using join_iso star_slide_var by simp alsofrom assms(2) have"... ≤ x\<star> + xT\<star>" by (metis comp_assoc is_p_fun_def join_isol mult_1_right mult_isol) finallyshow"connected x" . qed
lemma connected_iff8: "connected x ⟷ (x+)T;1;(x+)T≤ x\<star> + xT\<star>" by (metis connected_iff4 comp_assoc conv_contrav conv_invol conv_one plus_conv star_conv top_plus)
text‹Equivalences and implications for ‹many_strongly_connected››
lemma many_strongly_connected_iff_1: "many_strongly_connected x ⟷ xT≤ x\<star>" apply (rule iffI,simp) by (metis conv_invol conv_iso order.eq_iff star_conv star_invol star_iso)
lemma many_strongly_connected_iff_2: "many_strongly_connected x ⟷ xT≤ x+" proof assume as: "many_strongly_connected x" hence"xT≤ x\<star> ⋅ (-(1') + x)" by (metis many_strongly_connected_iff_1 loop_backward_forward inf_greatest) alsohave"... ≤ (x\<star> ⋅ -(1')) + (x\<star> ⋅ x)" by (simp add: inf_sup_distrib1) alsohave"... ≤ x+" by (metis as order.eq_iff mult_1_right mult_isol star_ref sup.absorb1 conv_invol eq_refl galois_1
inf.absorb_iff1 inf.commute star_unfoldl_eq sup_mono many_strongly_connected_iff_1) finallyshow"xT≤ x+" . next show"xT≤ x+==> many_strongly_connected x" using order_trans star_1l many_strongly_connected_iff_1 by blast qed
lemma many_strongly_connected_iff_3: "many_strongly_connected x ⟷ x ≤ xT\<star>" by (metis conv_invol many_strongly_connected_iff_1)
lemma many_strongly_connected_iff_4: "many_strongly_connected x ⟷ x ≤ xT+" by (metis conv_invol many_strongly_connected_iff_2)
lemma many_strongly_connected_iff_5: "many_strongly_connected x ⟷ x\<star>;xT≤ x+" by (metis comp_assoc conv_contrav conway.dagger_unfoldr_distr star_conv star_denest_var_2
star_invol star_trans_eq star_unfoldl_eq sup.boundedE many_strongly_connected_iff_2)
lemma many_strongly_connected_iff_6: "many_strongly_connected x ⟷ xT;x\<star> ≤ x+" by (metis dual_order.trans star_1l star_conv star_inductl_star star_invol star_slide_var
many_strongly_connected_iff_1 many_strongly_connected_iff_5)
lemma many_strongly_connected_iff_7: "many_strongly_connected x ⟷ xT+ = x+" by (metis order.antisym conv_invol star_slide_var star_unfoldl_eq many_strongly_connected_iff_5)
lemma many_strongly_connected_iff_5_eq: "many_strongly_connected x ⟷ x\<star>;xT = x+" by (metis order.refl star_slide_var many_strongly_connected_iff_5 many_strongly_connected_iff_7)
lemma many_strongly_connected_iff_6_eq: "many_strongly_connected x ⟷ xT;x\<star> = x+" using many_strongly_connected_iff_6 many_strongly_connected_iff_7 by force
lemma one_strongly_connected_implies_7_eq: assumes"one_strongly_connected x" shows"x;1;x = x+" using assms many_strongly_connected_iff_7 one_strongly_connected_iff one_strongly_connected_iff_3_eq by force
lemma one_strongly_connected_implies_8: assumes"one_strongly_connected x" shows"x;1;x ≤ x\<star>" using assms one_strongly_connected_iff by fastforce
lemma one_strongly_connected_iff_4: assumes"is_inj x" shows"one_strongly_connected x ⟷ xT;1;x ≤ x+" proof assume"one_strongly_connected x" thus"xT;1;x ≤ x+" by (simp add: one_strongly_connected_iff_4_eq) next assume1: "xT;1;x ≤ x+" hence"xT;1;xT≤ x\<star>;x;xT" by (metis mult_isor star_slide_var comp_assoc conv_invol modular_var_3 vector_meet_comp_x
order.trans) alsofrom assms have"... ≤ x\<star>" using comp_assoc is_inj_def mult_isol mult_oner by fastforce finallyshow"one_strongly_connected x" using dual_order.trans star_1l by fastforce qed
lemma one_strongly_connected_iff_5: assumes"is_p_fun x" shows"one_strongly_connected x ⟷ x;1;xT≤ x+" apply (rule iffI) using one_strongly_connected_iff_5_eq apply simp by (metis assms comp_assoc mult_double_iso order.trans star_slide_var top_greatest top_plus
many_strongly_connected_iff_12 many_strongly_connected_iff_7 one_strongly_connected_iff_3)
lemma one_strongly_connected_iff_6: assumes"is_p_fun x" and"is_inj x" shows"one_strongly_connected x ⟷ x;1;x ≤ x;x+" proof assume"one_strongly_connected x" thus"x;1;x ≤ x;x+" by (simp add: one_strongly_connected_implies_6_eq) next assume1: "x;1;x ≤ x;x+" have"xT;1;x ≤ xT;x;xT;1;x" by (metis conv_invol mult_isor x_leq_triple_x) alsohave"... ≤ xT;x;1;x" by (metis comp_assoc mult_double_iso top_greatest) alsofrom1have"... ≤ xT;x;x+" by (simp add: comp_assoc mult_isol) alsofrom assms(1) have"... ≤ x+" by (metis comp_assoc is_p_fun_def mult_isor mult_onel) finallyshow"one_strongly_connected x" using assms(2) one_strongly_connected_iff_4 by blast qed
lemma one_strongly_connected_iff_6_eq: assumes"is_p_fun x" and"is_inj x" shows"one_strongly_connected x ⟷ x;1;x = x;x+" apply (rule iffI) using one_strongly_connected_implies_6_eq apply blast by (simp add: assms one_strongly_connected_iff_6)
text‹Start points and end points›
lemma start_end_implies_terminating: assumes"has_start_points x" and"has_end_points x" shows"terminating x" using assms by simp
lemma start_points_end_points_conv: "start_points x = end_points (xT)" by simp
lemma edge_end: assumes"is_point p" and"is_point q" and"p ≠ q" shows"end_points (p;qT) = q" using assms edge_start by simp
lemma loop_no_start: assumes"is_point p" shows"start_points (p;pT) = 0" by simp
lemma loop_no_end: assumes"is_point p" shows"end_points (p;pT) = 0" by simp
lemma start_point_no_predecessor: "x;start_points(x) = 0" by (metis inf_top.right_neutral modular_1_aux')
lemma end_point_no_successor: "xT;end_points(x) = 0" by (metis conv_invol start_point_no_predecessor)
lemma start_to_end: assumes"path x" shows"start_points(x);end_points(x)T≤ x\<star>" proof (cases "end_points(x) = 0") assume"end_points(x) = 0" thus ?thesis by simp next assume ass: "end_points(x) ≠ 0" hence nz: "x;end_points(x) ≠ 0" by (metis comp_res_aux compl_bot_eq inf.left_idem) have a: "x;end_points(x);end_points(x)T≤ x + xT" by (metis end_point_at_most_one assms(1) is_inj_def comp_assoc mult_isol mult_oner le_supI1)
have"start_points(x);end_points(x)T = start_points(x);1;end_points(x)T" using ass by (simp add: comp_assoc is_vector_def one_compl vector_1) alsohave"... = start_points(x);1;x;end_points(x);1;end_points(x)T" using nz tarski by (simp add: comp_assoc) alsohave"... = start_points(x);1;x;end_points(x);end_points(x)T" using ass by (simp add: comp_assoc is_vector_def one_compl vector_1) alsowith a assms(1) have"... ≤ x\<star>" using path_concat_aux_5 comp_assoc eq_refl by simp finallyshow ?thesis . qed
lemma path_acyclic: assumes"has_start_points_path x" shows"is_acyclic x" proof - let ?r = "start_points(x)" have pt: "point(?r)" using assms point_is_point start_point_iff2 by blast have"x+⋅1' = (x+)T⋅x+⋅1'" by (metis conv_e conv_times inf.assoc inf.left_idem inf_le2 many_strongly_connected_iff_7
mult_oner star_subid) alsohave"... ≤ xT;1⋅x+⋅1'" by (metis conv_contrav inf.commute maddux_20 meet_double_iso plus_top star_conv star_slide_var) finallyhave"?r;(x+⋅1') ≤ ?r;(xT;1⋅x+⋅1')" using mult_isol by blast alsohave"... = (?r⋅1;x);(x+⋅1')" by (metis (no_types, lifting) comp_assoc conv_contrav conv_invol conv_one inf.assoc
is_vector_def one_idem_mult vector_2) alsohave"... = ?r;x;(x+⋅1')" by (metis comp_assoc inf_top.right_neutral is_vector_def one_compl one_idem_mult vector_1) alsohave"... ≤ (x\<star> + xT\<star>);(x+⋅1')" using assms(1) mult_isor by (meson connected_iff4 dual_order.trans mult_subdistr path_concat_aux3_3) alsohave"... = x\<star>;(x+⋅1') + xT+;(x+⋅1')" by (metis distrib_right star_star_plus sup.commute) alsohave"... ≤ x\<star>;(x+⋅1') + xT;1" by (metis join_isol mult_isol plus_top top_greatest) finallyhave"?r;(x+⋅1');1 ≤ x\<star>;(x+⋅1');1 + xT;1" by (metis distrib_right inf_absorb2 mult_assoc mult_subdistr one_idem_mult) hence1: "?r;(x+⋅1');1 ≤ xT;1" using assms(1) path_def inj_implies_step_forwards_backwards sup_absorb2 by simp have"x+⋅1' ≤ (x+⋅1');1" by (simp add: maddux_20) alsohave"... ≤ ?rT;?r;(x+⋅1');1" using pt comp_assoc point_def ss423conv by fastforce alsohave"... ≤ ?rT;xT;1" using1by (simp add: comp_assoc mult_isol) alsohave"... = 0" by (metis start_point_no_predecessor annil conv_contrav conv_zero) finallyshow ?thesis using galois_aux le_bot by blast qed
text‹Equivalences for ‹terminating››
lemma backward_terminating_iff1: assumes"path x" shows"backward_terminating x ⟷ has_start_points x ∨ x = 0" proof assume"backward_terminating x" hence"1;x;1 ≤ 1;-(1;x);x;1;1" by (metis mult_isor mult_isol comp_assoc) alsohave"... = -(1;x);x;1" by (metis conv_compl conv_contrav conv_invol conv_one mult_assoc one_compl one_idem_mult) finallyhave"1;x;1 ≤ -(1;x);x;1" .
with tarski show"has_start_points x ∨ x = 0" by (metis top_le) next show"has_start_points x ∨ x = 0 ==> backward_terminating x" by fastforce qed
lemma forward_terminating_iff3: assumes"path x" shows"forward_terminating x ⟷ x ≤ x\<star>;-(x;1)" by (metis assms backward_terminating_iff1 backward_terminating_iff3 end_point_iff2
forward_terminating_iff1 compl_bot_eq conv_compl conv_invol conv_one conv_path
double_compl start_point_iff2)
lemma forward_terminating_iff4: assumes"path x" shows"forward_terminating x ⟷ x ≤ -(1;xT);xT\<star>" using forward_terminating_iff2 conv_contrav conv_iso star_conv assms conv_compl by force
lemma terminating_iff1: assumes"path x" shows"terminating x ⟷ has_start_end_points x ∨ x = 0" using assms backward_terminating_iff1 forward_terminating_iff1 by fastforce
lemma terminating_iff2: assumes"path x" shows"terminating x ⟷ x ≤ xT\<star>;-(xT;1) ⋅ -(1;xT);xT\<star>" using assms backward_terminating_iff2 forward_terminating_iff2 conv_compl conv_iso star_conv by force
lemma terminating_iff3: assumes"path x" shows"terminating x ⟷ x ≤ x\<star>;-(x;1) ⋅ -(1;x);x\<star>" using assms backward_terminating_iff4 forward_terminating_iff3 by fastforce
lemma backward_terminating_path_irreflexive: assumes"backward_terminating_path x" shows"x ≤ -1'" proof - have1: "x;xT≤ 1'" using assms is_inj_def path_def by blast have"x;(xT⋅ 1') ≤ x;xT⋅ x" by (metis inf.bounded_iff inf.commute mult_1_right mult_subdistl) alsohave"... ≤ 1' ⋅ x" using1 meet_iso by blast alsohave"... = 1' ⋅ xT" by (metis conv_e conv_times inf.cobounded1 is_test_def test_eq_conv) finallyhave2: "xT;-(xT⋅ 1') ≤ -(xT⋅ 1')" by (metis compl_le_swap1 conv_galois_1 inf.commute) have"xT⋅ 1' ≤ xT;1" by (simp add: le_infI1 maddux_20) hence"-(xT;1) ≤ -(xT⋅ 1')" using compl_mono by blast hence"xT;-(xT⋅ 1') + -(xT;1) ≤ -(xT⋅ 1')" using2by (simp add: le_supI) hence"xT\<star>;-(xT;1) ≤ -(xT⋅ 1')" by (simp add: rtc_inductl) hence"xT⋅ 1' ⋅ xT\<star>;-(xT;1) = 0" by (simp add: compl_le_swap1 galois_aux) hence"xT⋅ 1' = 0" using assms backward_terminating_iff3 inf.order_iff le_infI1 by blast hence"x ⋅ 1' = 0" by (simp add: conv_self_conjugate) thus ?thesis by (simp add: galois_aux) qed
lemma forward_terminating_path_end_points_1: assumes"forward_terminating_path x" shows"x ≤ x+;end_points x" proof - have1: "-(x;1) ⋅ x = 0" by (simp add: galois_aux maddux_20) have"x = x\<star>;-(x;1) ⋅ x" using assms forward_terminating_iff3 inf.absorb2 by fastforce alsohave"... = (x+;-(x;1) + 1';-(x;1)) ⋅ x" by (simp add: sup.commute) alsohave"... = x+;-(x;1) ⋅ x + -(x;1) ⋅ x" using inf_sup_distrib2 by fastforce alsohave"... = x+;-(x;1) ⋅ x" using1by simp alsohave"... ≤ x+;(-(x;1) ⋅ (x+)T;x)" using modular_1_var by blast alsohave"... = x+;(-(x;1) ⋅ xT+;x)" using plus_conv by fastforce alsohave"... ≤ x+;end_points x" by (metis inf_commute inf_top_right modular_1' mult_subdistl plus_conv plus_top) finallyshow ?thesis . qed
lemma forward_terminating_path_end_points_2: assumes"forward_terminating_path x" shows"xT≤ x\<star>;end_points x" proof - have"xT≤ xT;x;xT" by (metis conv_invol x_leq_triple_x) alsohave"... ≤ xT;x;1" using mult_isol top_greatest by blast alsohave"... ≤ xT;x+;end_points x;1" by (metis assms forward_terminating_path_end_points_1 comp_assoc mult_isol mult_isor) alsohave"... = xT;x+;end_points x" by (metis inf_commute mult_assoc one_compl ra_1) alsohave"... ≤ x\<star>;end_points x" by (metis assms comp_assoc compl_le_swap1 conv_galois_1 conv_invol p_fun_compl path_def) finallyshow ?thesis . qed
lemma forward_terminating_path_end_points_3: assumes"forward_terminating_path x" shows"start_points x ≤ x+;end_points x" proof - have"start_points x ≤ x+;end_points x;1" using assms forward_terminating_path_end_points_1 comp_assoc mult_isor inf.coboundedI1 by blast alsohave"... = x+;end_points x" by (metis inf_commute mult_assoc one_compl ra_1 ) finallyshow ?thesis . qed
lemma backward_terminating_path_start_points_1: assumes"backward_terminating_path x" shows"xT≤ xT+;start_points x" using assms forward_terminating_path_end_points_1 conv_backward_terminating_path by fastforce
lemma backward_terminating_path_start_points_2: assumes"backward_terminating_path x" shows"x ≤ xT\<star>;start_points x" using assms forward_terminating_path_end_points_2 conv_backward_terminating_path by fastforce
lemma backward_terminating_path_start_points_3: assumes"backward_terminating_path x" shows"end_points x ≤ xT+;start_points x" using assms forward_terminating_path_end_points_3 conv_backward_terminating_path by fastforce
(* lemma not shown in the paper; not necessary for other theorems *) lemma path_aux1a: assumes"forward_terminating_path x" shows"x ≠ 0 ⟷ end_points x ≠ 0" using assms end_point_iff2 forward_terminating_iff1 end_point_iff1 galois_aux2 by force
(* lemma not shown in the paper; not necessary for other theorems *) lemma path_aux1b: assumes"backward_terminating_path y" shows"y ≠ 0 ⟷ start_points y ≠ 0" using assms start_point_iff2 backward_terminating_iff1 start_point_iff1 galois_aux2 byforce
(* lemma not shown in the paper; not necessary for other theorems *) lemma path_aux1: assumes"forward_terminating_path x" and"backward_terminating_path y" shows"x ≠ 0 ∨ y ≠ 0 ⟷ end_points x ≠ 0 ∨ start_points y ≠ 0" using assms path_aux1a path_aux1b by blast
text‹Equivalences for ‹finite››
lemma backward_finite_iff_msc: "backward_finite x ⟷ many_strongly_connected x ∨ backward_terminating x" proof assume1: "backward_finite x" thus"many_strongly_connected x ∨ backward_terminating x" proof (cases "-(1;x);x;1 = 0") assume"-(1;x);x;1 = 0" thus"many_strongly_connected x ∨ backward_terminating x" using1by (metis conv_invol many_strongly_connected_iff_1 sup_bot_right) next assume"-(1;x);x;1 ≠ 0" hence"1;-(1;x);x;1 = 1" by (simp add: comp_assoc tarski) hence"-(1;x);x;1 = 1" by (metis comp_assoc conv_compl conv_contrav conv_invol conv_one one_compl) thus"many_strongly_connected x ∨ backward_terminating x" using1by simp qed next assume"many_strongly_connected x ∨ backward_terminating x" thus"backward_finite x" by (metis star_ext sup.coboundedI1 sup.coboundedI2) qed
lemma forward_finite_iff_msc: "forward_finite x ⟷ many_strongly_connected x ∨ forward_terminating x" by (metis backward_finite_iff_msc conv_backward_finite conv_backward_terminating conv_invol)
lemma finite_iff_msc: "finite x ⟷ many_strongly_connected x ∨ terminating x" using backward_finite_iff_msc forward_finite_iff_msc finite_iff by fastforce
text‹Path concatenation›
lemma path_concatenation: assumes"forward_terminating_path x" and"backward_terminating_path y" and"end_points x = start_points y" and"x;1 ⋅ (xT;1 + y;1) ⋅ yT;1 = 0" shows"path (x+y)" proof (cases "y = 0") assume"y = 0" thus ?thesis using assms(1) by fastforce next assume as: "y ≠ 0" show ?thesis proof (unfold path_def; intro conjI) from assms(4) have a: "x;1 ⋅ xT;1 ⋅ yT;1 + x;1 ⋅ y;1 ⋅ yT;1= 0" by (simp add: inf_sup_distrib1 inf_sup_distrib2) hence aux1: "x;1 ⋅ xT;1 ⋅ yT;1 = 0" using sup_eq_bot_iff by blast from a have aux2: "x;1 ⋅ y;1 ⋅ yT;1= 0" using sup_eq_bot_iff by blast
show"is_inj (x + y)" proof (unfold is_inj_def; auto simp add: distrib_left) show"x;xT≤ 1'" using assms(1) path_def is_inj_def by blast show"y;yT≤ 1'" using assms(2) path_def is_inj_def by blast have"y;xT = 0" by (metis assms(3) aux1 annir comp_assoc conv_one le_bot modular_var_2 one_idem_mult
path_concat_aux_2 schroeder_2) thus"y;xT≤ 1'" using bot_least le_bot by blast thus"x;yT≤ 1'" using conv_iso by force qed
show"is_p_fun (x + y)" proof (unfold is_p_fun_def; auto simp add: distrib_left) show"xT;x ≤ 1'" using assms(1) path_def is_p_fun_def by blast show"yT;y ≤ 1'" using assms(2) path_def is_p_fun_def by blast have"yT;x ≤ yT;(y;1 ⋅ x;1)" by (metis conjugation_prop2 inf.commute inf_top.left_neutral maddux_20 mult_isol order_trans
schroeder_1_var) alsohave"... = 0" using assms(3) aux2 annir inf_commute path_concat_aux_1 by fastforce finallyshow"yT;x ≤ 1'" using bot_least le_bot by blast thus"xT;y ≤ 1'" using conv_iso by force qed
show"connected (x + y)" proof (auto simp add: distrib_left) have"x;1;x ≤ x\<star> + xT\<star>" using assms(1) path_def by simp alsohave"... ≤ (x\<star>;y\<star>)\<star> + (xT\<star>;yT\<star>)\<star>" using join_iso join_isol star_subdist by simp finallyshow"x;1;x ≤ (x\<star>;y\<star>)\<star> + (xT\<star>;yT\<star>)\<star>" . have"y;1;y ≤ y\<star> + yT\<star>" using assms(2) path_def by simp alsohave"... ≤ (x\<star>;y\<star>)\<star> + (xT\<star>;yT\<star>)\<star>" by (metis star_denest star_subdist sup.mono sup_commute) finallyshow"y;1;y ≤ (x\<star>;y\<star>)\<star> + (xT\<star>;yT\<star>)\<star>" .
show"y;1;x ≤ (x\<star>;y\<star>)\<star> + (xT\<star>;yT\<star>)\<star>" proof - have"(y;1);1;(1;x) ≤ yT\<star>;xT\<star>" proof (rule_tac v="start_points y"in path_concat_aux_0) show"is_vector (start_points y)" by (metis is_vector_def comp_assoc one_compl one_idem_mult ra_1) show"start_points y ≠ 0" using as by (metis assms(2) conv_compl conv_contrav conv_one inf.orderE inf_bot_right
inf_top.right_neutral maddux_141) have"(start_points y);1;yT≤ y\<star>" by (rule path_concat_aux_5) (simp_all add: assms(2)) thus"y;1;(start_points y)T≤ yT\<star>" by (metis (mono_tags, lifting) conv_iso comp_assoc conv_contrav conv_invol conv_one
star_conv) have"end_points x;1;x ≤ xT\<star>" apply (rule path_concat_aux_5) using assms(1) conv_path by simp_all thus"start_points y;(1;x) ≤ xT\<star>" by (metis assms(3) mult_assoc) qed thus ?thesis by (metis comp_assoc le_supI2 less_eq_def one_idem_mult star_denest star_subdist_var_1
sup.commute) qed
show"x;1;y ≤ (x\<star>;y\<star>)\<star> + (xT\<star>;yT\<star>)\<star>" proof - have"(x;1);1;(1;y) ≤ x\<star>;y\<star>" proof (rule_tac v="start_points y"in path_concat_aux_0) show"is_vector (start_points y)" by (simp add: comp_assoc is_vector_def one_compl vector_1_comm) show"start_points y ≠ 0" using as assms(2,4) backward_terminating_iff1 galois_aux2 start_point_iff1 start_point_iff2 by blast have"end_points x;1;xT≤ xT\<star>" apply (rule path_concat_aux_5) using assms(1) conv_path by simp_all hence"(end_points x;1;xT)T≤ (xT\<star>)T" using conv_iso by blast thus"x;1;(start_points y)T≤ x\<star>" by (simp add: assms(3) comp_assoc star_conv) have"start_points y;1;y ≤ y\<star>" by (rule path_concat_aux_5) (simp_all add: assms(2)) thus"start_points y;(1;y) ≤ y\<star>" by (simp add: mult_assoc) qed thus ?thesis by (metis comp_assoc dual_order.trans le_supI1 one_idem_mult star_ext) qed qed qed qed
lemma start_point_no_cycle: assumes"has_start_points_path x" shows"¬ cycle x" using assms many_strongly_connected_implies_no_start_end_points no_start_end_points_iff
start_point_iff1 start_point_iff2 by blast
lemma end_point_no_cycle: assumes"has_end_points_path x" shows"¬ cycle x" using assms end_point_iff2 end_point_iff1 many_strongly_connected_implies_no_start_end_points
no_start_end_points_iff by blast
lemma cycle_no_points: assumes"cycle x" shows"start_points x = 0" and"end_points x = 0" by (metis assms inf_compl_bot many_strongly_connected_implies_no_start_end_points)+
text‹Path concatenation to cycle›
lemma path_path_equals_cycle_aux: assumes"has_start_end_points_path x" and"has_start_end_points_path y" and"start_points x = end_points y" and"end_points x = start_points y" shows"x ≤ (x+y)T\<star>" proof- let ?e = "end_points(x)" let ?s = "start_points(x)" have sp: "is_point(?s)" using assms(1) start_point_iff2 has_start_end_points_path_iff by blast have ep: "is_point(?e)" using assms(1) end_point_iff2 has_start_end_points_path_iff by blast
have"x ≤ xT\<star>;?s;1 ⋅ 1;?eT;xT\<star>" by (metis assms(1) backward_terminating_path_start_points_2 end_point_iff2 ep
forward_terminating_iff1 forward_terminating_path_end_points_2 comp_assoc
conv_contrav conv_invol conv_iso inf.boundedI point_equations(1) point_equations(4)
star_conv sp start_point_iff2) alsohave"... = xT\<star>;?s;1;?eT;xT\<star>" by (metis inf_commute inf_top_right ra_1) alsohave"... = xT\<star>;?s;?eT;xT\<star>" by (metis ep comp_assoc point_equations(4)) alsohave"... ≤ xT\<star>;yT\<star>;xT\<star>" by (metis (mono_tags, lifting) assms(2-4) start_to_end comp_assoc conv_contrav conv_invol
conv_iso mult_double_iso star_conv) alsohave"... = (x\<star>;y\<star>;x\<star>)T" by (simp add: comp_assoc star_conv) alsohave"... ≤ ((x+y)\<star>;(x+y)\<star>;(x+y)\<star>)T" by (metis conv_invol conv_iso prod_star_closure star_conv star_denest star_ext star_iso
star_trans_eq sup_ge1) alsohave"... = (x+y)T\<star>" by (metis star_conv star_trans_eq) finallyshow x: "x ≤ (x+y)T\<star>" . qed
lemma path_edge_equals_cycle: assumes"has_start_end_points_path x" shows"cycle(x + end_points(x);(start_points x)T)" proof (rule path_path_equals_cycle) let ?s = "start_points x" let ?e = "end_points x" let ?y = "(?e;?sT)"
have sp: "is_point(?s)" using start_point_iff2 assms has_start_end_points_path_iff by blast have ep: "is_point(?e)" using end_point_iff2 assms has_start_end_points_path_iff by blast
show"has_start_end_points_path x" using assms by blast show"has_start_end_points_path ?y" using edge_is_path by (metis assms edge_end edge_start end_point_iff2 end_point_iff1 galois_aux2
has_start_end_points_iff inf.left_idem inf_compl_bot_right start_point_iff2) show"?s = end_points ?y" by (metis sp ep edge_end annil conv_zero inf.left_idem inf_compl_bot_right) thus"?e = start_points ?y" by (metis edge_start ep conv_contrav conv_invol sp) show"x;1 ⋅ (xT;1 + ?e;?sT;1) ⋅ (?e;?sT)T;1 = 0" proof - have"x;1 ⋅ (xT;1 + ?e;?sT;1) ⋅ (?e;?sT)T;1 = x;1 ⋅ (xT;1 + ?e;1;?sT;1) ⋅ (?s;?eT);1" using sp comp_assoc point_equations(3) by fastforce alsohave"... = x;1 ⋅ (xT;1 + ?e;1) ⋅ ?s;1" by (metis sp ep comp_assoc point_equations(1,3)) alsohave"... ≤ 0" by (simp add: sp ep inf.assoc point_equations(1)) finallyshow ?thesis using bot_unique by blast qed qed
text‹Break cycles›
lemma cycle_remove_edge: assumes"cycle x" and"point s" and"point e" and"e;sT≤ x" shows"path(x ⋅ -(e;sT))" and"start_points (x ⋅ -(e;sT)) ≤ s" and"end_points (x ⋅ -(e;sT)) ≤ e" proof - show"path(x ⋅ -(e;sT))" proof (unfold path_def; intro conjI) show1: "is_p_fun(x ⋅ -(e;sT))" using assms(1) path_def is_p_fun_def p_fun_mult_var by blast show2: "is_inj(x ⋅ -(e;sT))" using assms(1) path_def inf.cobounded1 injective_down_closed by blast show"connected (x ⋅ -(e;sT))" proof - have"x\<star> = ((x ⋅ -(e;sT)) + e;sT)\<star>"
by (metis assms(4) aux4_comm inf.absorb2)
also have "... = (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; (e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>)\<^sup>\<star>"
by simp
also have "... = (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; (1' + e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>;(e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>)\<^sup>\<star>)"
by fastforce
also have "... = (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>;(e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>)\<^sup>\<star>"
by (simp add: distrib_left mult_assoc)
also have "... = (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; e;(s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>;e)\<^sup>\<star>;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>"
by (simp add: comp_assoc star_slide)
also have "... \<le> (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; e;1;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>" using top_greatest join_isol mult_double_iso by (metis mult_assoc)
also have "... = (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>" using assms(3) by (simp add: comp_assoc is_vector_def point_def)
finally have 3: "x\<^sup>\<star> \<le> (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>" .
from assms(4) have "e;s\<^sup>T \<le> e;e\<^sup>T;x" using assms(3) comp_assoc mult_isol point_def ss423conv by fastforce
also have "... \<le> e;e\<^sup>T;(x\<^sup>\<star>)\<^sup>T" using assms(1) many_strongly_connected_iff_3 mult_isol star_conv by fastforce
also have "... \<le> e;e\<^sup>T;((x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>)\<^sup>T" using3 conv_iso mult_isol by blast
also have "... \<le> e;e\<^sup>T;((x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star> ; s;e\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>)"
by (simp add: star_conv comp_assoc)
also have "... \<le> e;e\<^sup>T;(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star> + e;e\<^sup>T;(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star> ; s;e\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>"
by (simp add: comp_assoc distrib_left)
also have "... \<le> e;e\<^sup>T;(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star> + e;1;e\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>"
by (metis comp_assoc join_isol mult_isol mult_isor top_greatest)
also have "... \<le> e;e\<^sup>T;(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star> + e;e\<^sup>T;(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>" using assms(3) by (simp add: point_equations(1) point_is_point)
also have "... = e;e\<^sup>T;(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>"
by simp
also have "... \<le> 1';(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>" using assms(3) is_inj_def point_def join_iso mult_isor by blast
finally have 4: "e;s\<^sup>T \<le>(x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>"
by simp
have "(x \<cdot> -(e;s\<^sup>T));1;(x \<cdot> -(e;s\<^sup>T)) \<le> x;1;x"
by (simp add: mult_isol_var)
also have "...\<le> x\<^sup>\<star>" using assms(1) connected_iff4 one_strongly_connected_iff one_strongly_connected_implies_8
path_concat_aux3_3 by blast
also have "... \<le> (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; e;s\<^sup>T ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>"
by (rule 3)
also have "... \<le> (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> ; (x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star> ; (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star>" using4 by (metis comp_assoc join_isol mult_isol mult_isor)
also have "... \<le> (x \<cdot> -(e;s\<^sup>T))\<^sup>\<star> + (x \<cdot> -(e;s\<^sup>T))\<^sup>T\<^sup>\<star>" using12 triple_star by force
finally show ?thesis .
qed
qed
next
show "start_points (x \<cdot> -(e;s\<^sup>T)) \<le> s"
proof -
have 1: "is_vector(-s)" using assms(2) by (simp add: point_def vector_compl)
have "(x \<cdot> -(e;s\<^sup>T));1 \<cdot> -s \<le> x;1 \<cdot> -s" using meet_iso mult_subdistr by blast
also have "... \<le> x\<^sup>T;1 \<cdot> -s" using assms(1) many_strongly_connected_implies_no_start_end_points meet_iso
no_start_end_points_path_iff by blast
also have "... \<le> (x\<^sup>T \<cdot> -s);1" using1 by (simp add: vector_1_comm)
also have "... \<le> (x\<^sup>T \<cdot> -(s;e\<^sup>T));1"
by (metis 1 galois_aux inf.boundedI inf.cobounded1 inf.commute mult_isor schroeder_2
vector_1_comm)
also have "... = (x \<cdot> -(e;s\<^sup>T))\<^sup>T;1"
by (simp add: conv_compl)
finally show ?thesis
by (simp add: galois_1 sup_commute)
qed
next
show "end_points (x \<cdot> -(e;s\<^sup>T)) \<le> e"
proof -
have 1: "is_vector(-e)" using assms(3) by (simp add: point_def vector_compl)
have "(x \<cdot> -(e;s\<^sup>T))\<^sup>T;1 \<cdot> -e \<le> x\<^sup>T;1 \<cdot> -e" using meet_iso mult_subdistr by simp
also have "... \<le> x;1 \<cdot> -e" using assms(1) many_strongly_connected_implies_no_start_end_points meet_iso
no_start_end_points_path_iff by blast
also have "... \<le> (x \<cdot> -e);1" using1 by (simp add: vector_1_comm)
also have "... \<le> (x \<cdot> -(e;s\<^sup>T));1"
by (metis 1 galois_aux inf.boundedI inf.cobounded1 inf.commute mult_isor schroeder_2
vector_1_comm)
finally show ?thesis
by (simp add: galois_1 sup_commute)
qed
qed
lemma cycle_remove_edge':
assumes "cycle x" and"point s" and"point e" and"s\<noteq>e" and"e;s\<^sup>T \<le> x"
shows "path(x \<cdot> -(e;s\<^sup>T))" and"s = start_points (x \<cdot> -(e;s\<^sup>T))" and"e = end_points (x \<cdot> -(e;s\<^sup>T))"
proof -
show "path (x \<cdot> - (e ; s\<^sup>T))" using assms(1,2,3,5) cycle_remove_edge(1) by blast
next
show "s = start_points (x \<cdot> - (e ; s\<^sup>T))"
proof (simp only: order.eq_iff; rule conjI)
show "s \<le> start_points (x \<cdot> - (e ; s\<^sup>T))"
proof -
have a: "s \<le> (x \<cdot> - (e ; s\<^sup>T));1"
proof -
have 1: "is_vector(-e)" using assms(3) point_def vector_compl by blast
from assms(2-4) have "s = s \<cdot> -e" using comp_assoc edge_end point_equations(1) point_equations(3) point_is_point by fastforce
also have "... \<le> x\<^sup>T;e \<cdot> -e" using assms(3,5) conv_iso meet_iso point_def ss423conv by fastforce
also have "... \<le> x;1 \<cdot> -e"
by (metis assms(1) many_strongly_connected_implies_no_start_end_points meet_iso mult_isol
top_greatest)
also have "... \<le> (x \<cdot> -e);1" using1 by (simp add: vector_1_comm)
also have "... \<le> (x \<cdot> - (e ; s\<^sup>T));1"
by (metis assms(3) comp_anti is_vector_def meet_isor mult_isol mult_isor point_def
top_greatest)
finally show ?thesis .
qed
have b: "s \<le> -((x \<cdot> - (e ; s\<^sup>T))\<^sup>T;1)"
proof -
have 1: "x;s =e" using assms predecessor_point' by blast
have "s \<cdot> x\<^sup>T = s;(e\<^sup>T+-(e\<^sup>T)) \<cdot> x\<^sup>T" using assms(2) point_equations(1) point_is_point by fastforce
also have "... = s;e\<^sup>T \<cdot> x\<^sup>T"
by (metis 1 conv_contrav inf.commute inf_sup_absorb modular_1')
also have "... \<le> e\<^sup>T"
by (metis assms(3) inf.coboundedI1 mult_isor point_equations(4) point_is_point
top_greatest)
finally have "s \<cdot> x\<^sup>T \<le> s \<cdot> e\<^sup>T"
by simp
also have "... \<le> s ; e\<^sup>T" using assms(2,3) by (simp add: point_def vector_meet_comp)
finally have 2: "s \<cdot> x\<^sup>T \<cdot> -(s ; e\<^sup>T) = 0" using galois_aux2 by blast
thus ?thesis
proof -
have "s ; e\<^sup>T = e\<^sup>T \<cdot> s" using assms(2,3) inf_commute point_def vector_meet_comp by force
thus ?thesis using2
by (metis assms(2,3) conv_compl conv_invol conv_one conv_times galois_aux
inf.assoc point_def point_equations(1) point_is_point schroeder_2
vector_meet_comp)
qed
qed
with a show ?thesis
by simp
qed
show "start_points (x \<cdot> - (e ; s\<^sup>T)) \<le> s" using assms(1,2,3,5) cycle_remove_edge(2) by blast
qed
next
show "e = end_points (x \<cdot> - (e ; s\<^sup>T))"
proof (simp only: order.eq_iff; rule conjI)
show "e \<le> end_points (x \<cdot> - (e ; s\<^sup>T))"
(* just copied and adapted the proof of the previous case (start_point) *)
proof -
have a: "e \<le> (x \<cdot> - (e ; s\<^sup>T))\<^sup>T;1"
proof -
have 1: "is_vector(-s)" using assms(2) point_def vector_compl by blast
from assms(2-4) have "e = e \<cdot> -s" using comp_assoc edge_end point_equations(1) point_equations(3) point_is_point by fastforce
also have "... \<le> x;s \<cdot> -s" using assms(2,5) meet_iso point_def ss423bij by fastforce
also have "... \<le> x\<^sup>T;1 \<cdot> -s"
by (metis assms(1) many_strongly_connected_implies_no_start_end_points meet_iso mult_isol
top_greatest)
also have "... \<le> (x\<^sup>T \<cdot> -s);1" using1 by (simp add: vector_1_comm)
also have "... \<le> (x\<^sup>T \<cdot> - (s ; e\<^sup>T));1"
by (metis assms(2) comp_anti is_vector_def meet_isor mult_isol mult_isor point_def
top_greatest)
finally show ?thesis
by (simp add: conv_compl)
qed
have b: "e \<le> -((x \<cdot> - (e ; s\<^sup>T));1)"
proof -
have 1: "x\<^sup>T;e =s" using assms predecessor_point' by (metis conv_contrav conv_invol conv_iso conv_path)
have "e \<cdot> x = e;(s\<^sup>T+-(s\<^sup>T)) \<cdot> x" using assms(3) point_equations(1) point_is_point by fastforce
also have "... = e;s\<^sup>T \<cdot> x"
by (metis 1 conv_contrav conv_invol inf.commute inf_sup_absorb modular_1')
also have "... \<le> s\<^sup>T"
by (metis assms(2) inf.coboundedI1 mult_isor point_equations(4) point_is_point top_greatest)
finally have "e \<cdot> x \<le> e \<cdot> s\<^sup>T"
by simp
also have "... \<le> e ; s\<^sup>T" using assms(2,3) by (simp add: point_def vector_meet_comp)
finally have 2: "e \<cdot> x \<cdot> -(e ; s\<^sup>T) = 0" using galois_aux2 by blast
thus ?thesis
proof -
have "e ; s\<^sup>T = s\<^sup>T \<cdot> e" using assms(2,3) inf_commute point_def vector_meet_comp by force
thus ?thesis using2
by (metis assms(2,3) conv_one galois_aux inf.assoc point_def point_equations(1)
point_is_point schroeder_2 vector_meet_comp)
qed
qed
with a show ?thesis
by simp
qed
show "end_points (x \<cdot> - (e ; s\<^sup>T)) \<le> e" using assms(1,2,3,5) cycle_remove_edge(3) by blast
qed
qed
end (* context relation_algebra_rtc_tarski *)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.58 Sekunden
(vorverarbeitet am 2026-06-10)
¤
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.