diff -r 93531ba2c784 -r 9c7cbad50e04 src/HOL/Finite_Set.thy --- a/src/HOL/Finite_Set.thy Mon Mar 20 15:01:12 2023 +0100 +++ b/src/HOL/Finite_Set.thy Mon Mar 20 15:01:59 2023 +0100 @@ -2465,6 +2465,113 @@ qed qed + +subsection \Minimal and maximal elements of finite sets\ + +context begin + +qualified lemma + assumes "finite A" and "A \ {}" and "transp_on A R" and "asymp_on A R" + shows + bex_min_element: "\m \ A. \x \ A. x \ m \ \ R x m" and + bex_max_element: "\m \ A. \x \ A. x \ m \ \ R m x" + unfolding atomize_conj + using assms +proof (induction A rule: finite_induct) + case empty + hence False + by simp + thus ?case .. +next + case (insert a A') + show ?case + proof (cases "A' = {}") + case True + show ?thesis + proof (intro conjI bexI) + show "\x\insert a A'. x \ a \ \ R x a" and "\x\insert a A'. x \ a \ \ R a x" + using True by blast+ + qed simp_all + next + case False + moreover have "transp_on A' R" + using insert.prems transp_on_subset by blast + moreover have "asymp_on A' R" + using insert.prems asymp_on_subset by blast + ultimately obtain min max where + "min \ A'" and "max \ A'" and + min_is_min: "\x\A'. x \ min \ \ R x min" and + max_is_max: "\x\A'. x \ max \ \ R max x" + using insert.IH by auto + + show ?thesis + proof (rule conjI) + show "\min\insert a A'. \x\insert a A'. x \ min \ \ R x min" + proof (cases "R a min") + case True + show ?thesis + proof (intro bexI ballI impI) + show "a \ insert a A'" + by simp + next + fix x + show "x \ insert a A' \ x \ a \ \ R x a" + using True \min \ A'\ min_is_min[rule_format, of x] insert.prems(2,3) + by (auto dest: asymp_onD transp_onD) + qed + next + case False + show ?thesis + proof (rule bexI) + show "min \ insert a A'" + using \min \ A'\ by auto + next + show "\x\insert a A'. x \ min \ \ R x min" + using False min_is_min by blast + qed + qed + next + show "\max\insert a A'. \x\insert a A'. x \ max \ \ R max x" + proof (cases "R max a") + case True + show ?thesis + proof (intro bexI ballI impI) + show "a \ insert a A'" + by simp + next + fix x + show "x \ insert a A' \ x \ a \ \ R a x" + using True \max \ A'\ max_is_max[rule_format, of x] insert.prems(2,3) + by (auto dest: asymp_onD transp_onD) + qed + next + case False + show ?thesis + proof (rule bexI) + show "max \ insert a A'" + using \max \ A'\ by auto + next + show "\x\insert a A'. x \ max \ \ R max x" + using False max_is_max by blast + qed + qed + qed + qed +qed + +end + +text \The following alternative form might sometimes be easier to work with.\ + +lemma is_min_element_in_set_iff: + "asymp_on A R \ (\y \ A. y \ x \ \ R y x) \ (\y. R y x \ y \ A)" + by (auto dest: asymp_onD) + +lemma is_max_element_in_set_iff: + "asymp_on A R \ (\y \ A. y \ x \ \ R x y) \ (\y. R x y \ y \ A)" + by (auto dest: asymp_onD) + + subsubsection \Finite orders\ context order