diff -r 19cc354ba625 -r 35b2143aeec6 src/HOL/Analysis/Path_Connected.thy --- a/src/HOL/Analysis/Path_Connected.thy Thu Mar 28 08:30:42 2024 +0100 +++ b/src/HOL/Analysis/Path_Connected.thy Thu Mar 28 13:32:57 2024 +0000 @@ -121,6 +121,20 @@ using assms by (simp add: loop_free_linear_image_eq path_linear_image_eq simple_path_def) +lemma simple_pathI [intro?]: + assumes "path p" + assumes "\x y. 0 \ x \ x < y \ y \ 1 \ p x = p y \ x = 0 \ y = 1" + shows "simple_path p" + unfolding simple_path_def loop_free_def +proof (intro ballI conjI impI) + fix x y assume "x \ {0..1}" "y \ {0..1}" "p x = p y" + thus "x = y \ x = 0 \ y = 1 \ x = 1 \ y = 0" + by (metis assms(2) atLeastAtMost_iff linorder_less_linear) +qed fact+ + +lemma arcD: "arc p \ p x = p y \ x \ {0..1} \ y \ {0..1} \ x = y" + by (auto simp: arc_def inj_on_def) + lemma arc_translation_eq: fixes g :: "real \ 'a::euclidean_space" shows "arc((\x. a + x) \ g) \ arc g" @@ -670,6 +684,38 @@ using pathfinish_in_path_image by (fastforce simp: arc_join_eq) +subsubsection\<^marker>\tag unimportant\\Symmetry and loops\ + +lemma path_sym: + "\pathfinish p = pathstart q; pathfinish q = pathstart p\ \ path(p +++ q) \ path(q +++ p)" + by auto + +lemma simple_path_sym: + "\pathfinish p = pathstart q; pathfinish q = pathstart p\ + \ simple_path(p +++ q) \ simple_path(q +++ p)" + by (metis (full_types) inf_commute insert_commute simple_path_joinE simple_path_join_loop) + +lemma path_image_sym: + "\pathfinish p = pathstart q; pathfinish q = pathstart p\ + \ path_image(p +++ q) = path_image(q +++ p)" + by (simp add: path_image_join sup_commute) + +lemma simple_path_joinI: + assumes "arc p1" "arc p2" "pathfinish p1 = pathstart p2" + assumes "path_image p1 \ path_image p2 + \ insert (pathstart p2) (if pathstart p1 = pathfinish p2 then {pathstart p1} else {})" + shows "simple_path (p1 +++ p2)" + by (smt (verit, best) Int_commute arc_imp_simple_path arc_join assms insert_commute simple_path_join_loop simple_path_sym) + +lemma simple_path_join3I: + assumes "arc p1" "arc p2" "arc p3" + assumes "path_image p1 \ path_image p2 \ {pathstart p2}" + assumes "path_image p2 \ path_image p3 \ {pathstart p3}" + assumes "path_image p1 \ path_image p3 \ {pathstart p1} \ {pathfinish p3}" + assumes "pathfinish p1 = pathstart p2" "pathfinish p2 = pathstart p3" + shows "simple_path (p1 +++ p2 +++ p3)" + using assms by (intro simple_path_joinI arc_join) (auto simp: path_image_join) + subsection\<^marker>\tag unimportant\\The joining of paths is associative\ lemma path_assoc: @@ -720,22 +766,6 @@ \ arc(p +++ (q +++ r)) \ arc((p +++ q) +++ r)" by (simp add: arc_simple_path simple_path_assoc) -subsubsection\<^marker>\tag unimportant\\Symmetry and loops\ - -lemma path_sym: - "\pathfinish p = pathstart q; pathfinish q = pathstart p\ \ path(p +++ q) \ path(q +++ p)" - by auto - -lemma simple_path_sym: - "\pathfinish p = pathstart q; pathfinish q = pathstart p\ - \ simple_path(p +++ q) \ simple_path(q +++ p)" - by (metis (full_types) inf_commute insert_commute simple_path_joinE simple_path_join_loop) - -lemma path_image_sym: - "\pathfinish p = pathstart q; pathfinish q = pathstart p\ - \ path_image(p +++ q) = path_image(q +++ p)" - by (simp add: path_image_join sup_commute) - subsection\Subpath\