# HG changeset patch # User haftmann # Date 1749500078 -7200 # Node ID b69e4da2604bfd4cd2289dcde50cb5c47c9784eb # Parent cccbfa567117415ab061d2e2ca866606831e2395 more qualified auxiliary operations diff -r cccbfa567117 -r b69e4da2604b NEWS --- a/NEWS Fri Jun 06 18:36:29 2025 +0100 +++ b/NEWS Mon Jun 09 22:14:38 2025 +0200 @@ -87,11 +87,17 @@ thm remove_def ~> Set.remove_eq [simp] const Set.filter - thm filter_def → Set.filter_eq [simp] + thm filter_def ~> Set.filter_eq [simp] const [List.]can_select ~> Set.can_select thm can_select_def ~> Set.can_select_iff [simp] + const member ~> List.member + thm member_def ~> List.member_iff [simp] + + const null ~> List.null + thm null_def ~> List.null_iff [simp] + const List.all_interval_nat List.all_interval_int discontinued in favour of a generic List.all_range diff -r cccbfa567117 -r b69e4da2604b src/HOL/Computational_Algebra/Polynomial.thy --- a/src/HOL/Computational_Algebra/Polynomial.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Computational_Algebra/Polynomial.thy Mon Jun 09 22:14:38 2025 +0200 @@ -550,7 +550,7 @@ where [code]: "is_zero p \ List.null (coeffs p)" lemma is_zero_null [code_abbrev]: "is_zero p \ p = 0" - by (simp add: is_zero_def null_def) + by (simp add: is_zero_def) text \Reconstructing the polynomial from the list\ diff -r cccbfa567117 -r b69e4da2604b src/HOL/Import/HOL_Light_Maps.thy --- a/src/HOL/Import/HOL_Light_Maps.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Import/HOL_Light_Maps.thy Mon Jun 09 22:14:38 2025 +0200 @@ -286,7 +286,7 @@ lemma NULL[import_const NULL : List.null]: "List.null ([]::'t18373 list) = True \ List.null ((h::'t18373) # t) = False" - unfolding null_def by simp + by simp lemma ALL[import_const ALL : list_all]: "list_all (P::'t18393 \ bool) [] = True \ diff -r cccbfa567117 -r b69e4da2604b src/HOL/Library/AList_Mapping.thy --- a/src/HOL/Library/AList_Mapping.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Library/AList_Mapping.thy Mon Jun 09 22:14:38 2025 +0200 @@ -22,7 +22,7 @@ by transfer simp lemma is_empty_Mapping [code]: "Mapping.is_empty (Mapping xs) \ List.null xs" - by (cases xs) (simp_all add: is_empty_def null_def) + by (cases xs) (simp_all add: is_empty_def) lemma update_Mapping [code]: "Mapping.update k v (Mapping xs) = Mapping (AList.update k v xs)" by transfer (simp add: update_conv') diff -r cccbfa567117 -r b69e4da2604b src/HOL/Library/Dlist.thy --- a/src/HOL/Library/Dlist.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Library/Dlist.thy Mon Jun 09 22:14:38 2025 +0200 @@ -189,7 +189,7 @@ next case (Cons x xs) then have "\ Dlist.member (Dlist xs) x" and "P (Dlist xs)" - by (simp_all add: Dlist.member_def List.member_def) + by (simp_all add: Dlist.member_def) with insrt have "P (Dlist.insert x (Dlist xs))" . with Cons show ?case by (simp add: Dlist.insert_def distinct_remdups_id) qed @@ -212,7 +212,7 @@ case (Cons x xs) with dxs distinct have "\ Dlist.member (Dlist xs) x" and "dxs = Dlist.insert x (Dlist xs)" - by (simp_all add: Dlist.member_def List.member_def Dlist.insert_def distinct_remdups_id) + by (simp_all add: Dlist.member_def Dlist.insert_def distinct_remdups_id) with insert show ?thesis . qed qed diff -r cccbfa567117 -r b69e4da2604b src/HOL/Library/Multiset.thy --- a/src/HOL/Library/Multiset.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Library/Multiset.thy Mon Jun 09 22:14:38 2025 +0200 @@ -4318,7 +4318,7 @@ by simp lemma [code]: "Multiset.is_empty (mset xs) \ List.null xs" - by (simp add: Multiset.is_empty_def List.null_def) + by (simp add: Multiset.is_empty_def) lemma union_code [code]: "mset xs + mset ys = mset (xs @ ys)" by simp diff -r cccbfa567117 -r b69e4da2604b src/HOL/Library/Predicate_Compile_Alternative_Defs.thy --- a/src/HOL/Library/Predicate_Compile_Alternative_Defs.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Library/Predicate_Compile_Alternative_Defs.thy Mon Jun 09 22:14:38 2025 +0200 @@ -220,15 +220,17 @@ subsection \Alternative rules for membership in lists\ -declare in_set_member[code_pred_inline] +lemma in_set_member [code_pred_inline]: + "x \ set xs \ List.member xs x" + by simp lemma member_intros [code_pred_intro]: "List.member (x#xs) x" "List.member xs x \ List.member (y#xs) x" -by(simp_all add: List.member_def) + by simp_all code_pred List.member - by(auto simp add: List.member_def elim: list.set_cases) + by(auto simp add: elim: list.set_cases) code_identifier constant member_i_i \ (SML) "List.member_i_i" diff -r cccbfa567117 -r b69e4da2604b src/HOL/Library/Sublist.thy --- a/src/HOL/Library/Sublist.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Library/Sublist.thy Mon Jun 09 22:14:38 2025 +0200 @@ -1462,7 +1462,7 @@ case (1 P xs ys) show ?case by (induction ys arbitrary: xs) - (auto simp: list_emb_code List.null_def split: list.splits) + (auto simp: list_emb_code split: list.splits) qed lemma prefix_transfer [transfer_rule]: diff -r cccbfa567117 -r b69e4da2604b src/HOL/List.thy --- a/src/HOL/List.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/List.thy Mon Jun 09 22:14:38 2025 +0200 @@ -7846,20 +7846,23 @@ subsubsection \Counterparts for set-related operations\ -definition member :: \'a list \ 'a \ bool\ - where [code_abbrev]: \member xs x \ x \ set xs\ +context +begin + +qualified definition member :: \'a list \ 'a \ bool\ \ \only for code generation\ + where member_iff [code_abbrev, simp]: \member xs x \ x \ set xs\ text \ Use \member\ only for generating executable code. Otherwise use \<^prop>\x \ set xs\ instead --- it is much easier to reason about. \ -lemma member_rec [code]: - \member (x # xs) y \ x = y \ member xs y\ +qualified lemma member_code [code, no_atp]: \member [] y \ False\ - by (auto simp add: member_def) - -hide_const (open) member + \member (x # xs) y \ x = y \ member xs y\ + by auto + +end lemma list_all_iff [code_abbrev]: \list_all P xs \ Ball (set xs) P\ @@ -7941,8 +7944,8 @@ text \Executable checks for relations on sets\ -definition listrel1p :: \('a \ 'a \ bool) \ 'a list \ 'a list \ bool\ - where \listrel1p r xs ys \ (xs, ys) \ listrel1 {(x, y). r x y}\ +definition listrel1p :: \('a \ 'a \ bool) \ 'a list \ 'a list \ bool\ \ \only for code generation\ + where \listrel1p r xs ys \ (xs, ys) \ listrel1 {(x, y). r x y}\ lemma [code_unfold]: \(xs, ys) \ listrel1 r \ listrel1p (\x y. (x, y) \ r) xs ys\ @@ -7955,7 +7958,7 @@ r x y \ xs = ys \ x = y \ listrel1p r xs ys\ by (simp_all add: listrel1p_def) -definition lexordp :: \('a \ 'a \ bool) \ 'a list \ 'a list \ bool\ +definition lexordp :: \('a \ 'a \ bool) \ 'a list \ 'a list \ bool\ \ \only for code generation\ where \lexordp r xs ys \ (xs, ys) \ lexord {(x, y). r x y}\ lemma [code_unfold]: @@ -8145,24 +8148,23 @@ subsubsection \Operations for optimization and efficiency\ -definition null :: \'a list \ bool\ - where [code_abbrev]: \null xs \ xs = []\ - -text \ - Efficient emptyness check is implemented by \<^const>\null\. -\ - -lemma null_rec [code]: +context +begin + +qualified definition null :: \'a list \ bool\ \ \only for code generation\ + where null_iff [code_abbrev, simp]: \null xs \ xs = []\ + +lemma null_code [code, no_atp]: + \null [] \ True\ \null (x # xs) \ False\ - \null [] \ True\ - by (simp_all add: null_def) - -lemma equal_Nil_null [code_unfold]: + by simp_all + +lemma equal_Nil_null [code_unfold, no_atp]: \HOL.equal xs [] \ null xs\ \HOL.equal [] = null\ - by (auto simp add: equal null_def) - -hide_const (open) null + by (auto simp add: equal) + +end text \optimized code (tail-recursive) for \<^term>\length\\ @@ -8185,7 +8187,6 @@ definition maps :: \('a \ 'b list) \ 'a list \ 'b list\ where [code_abbrev]: \maps f xs = concat (map f xs)\ - text \ Operation \<^const>\maps\ avoids intermediate lists on execution -- do not use for proving. @@ -8203,7 +8204,7 @@ lemma is_empty_set [code]: "Set.is_empty (set xs) \ List.null xs" - by (simp add: null_def) + by simp lemma empty_set [code]: "{} = set []" @@ -8224,7 +8225,7 @@ lemma [code]: "x \ set xs \ List.member xs x" "x \ List.coset xs \ \ List.member xs x" - by (simp_all add: member_def) + by simp_all lemma insert_code [code]: "insert x (set xs) = set (List.insert x xs)" @@ -8238,7 +8239,7 @@ lemma filter_set [code]: "Set.filter P (set xs) = set (filter P xs)" - by auto + by simp lemma image_set [code]: "image f (set xs) = set (map f xs)" @@ -8294,7 +8295,7 @@ lemma [code]: "R `` S = List.map_project (\(x, y). if x \ S then Some y else None) R" - unfolding map_project_def by (auto split: prod.split if_split_asm) + by (auto simp add: map_project_def split: prod.split if_split_asm) lemma trancl_set_ntrancl [code]: "trancl (set xs) = ntrancl (card (set xs) - 1) (set xs)" @@ -8302,13 +8303,14 @@ lemma set_relcomp [code]: "set xys O set yzs = set ([(fst xy, snd yz). xy \ xys, yz \ yzs, snd xy = fst yz])" - by auto (auto simp add: Bex_def image_def) + by simp (auto simp add: Bex_def image_def) lemma wf_set: "wf (set xs) = acyclic (set xs)" by (simp add: wf_iff_acyclic_if_finite) -lemma wf_code_set[code]: "wf_code (set xs) = acyclic (set xs)" +lemma wf_code_set [code]: + "wf_code (set xs) = acyclic (set xs)" unfolding wf_code_def using wf_set . text \\LEAST\ and \GREATEST\ operator.\ @@ -8644,7 +8646,7 @@ lemma null_transfer [transfer_rule]: "(list_all2 A ===> (=)) List.null List.null" - unfolding rel_fun_def List.null_def by auto + unfolding rel_fun_def by auto lemma list_all_transfer [transfer_rule]: "((A ===> (=)) ===> list_all2 A ===> (=)) list_all list_all" @@ -8710,14 +8712,6 @@ "map f xs = rec_list Nil (%x _ y. Cons (f x) y) xs" by (induct xs) auto -lemma in_set_member (* FIXME delete candidate *): - "x \ set xs \ List.member xs x" - by (simp add: member_def) - -lemma eq_Nil_null: (* FIXME delete candidate *) - "xs = [] \ List.null xs" - by (simp add: null_def) - lemma concat_map_maps: (* FIXME delete candidate *) "concat (map f xs) = List.maps f xs" by (simp add: maps_def) diff -r cccbfa567117 -r b69e4da2604b src/HOL/MicroJava/DFA/LBVComplete.thy --- a/src/HOL/MicroJava/DFA/LBVComplete.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/MicroJava/DFA/LBVComplete.thy Mon Jun 09 22:14:38 2025 +0200 @@ -20,7 +20,7 @@ lemma [code]: "is_target step phi pc' = list_ex (\pc. pc' \ pc+1 \ List.member (map fst (step pc (phi!pc))) pc') [0.. (\g c. List.member s (Check_in g r c)))" -unfolding no_Check_in_def member_def by auto + by (simp add: no_Check_in_def) lemma [code_pred_def]: "feels_safe s r = (\s\<^sub>1 s\<^sub>2 s\<^sub>3 g c c'. diff -r cccbfa567117 -r b69e4da2604b src/HOL/Quotient_Examples/DList.thy --- a/src/HOL/Quotient_Examples/DList.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Quotient_Examples/DList.thy Mon Jun 09 22:14:38 2025 +0200 @@ -60,11 +60,12 @@ lemma remdups_eq_member_eq: assumes "remdups xa = remdups ya" - shows "List.member xa = List.member ya" - using assms - unfolding fun_eq_iff List.member_def - by (induct xa ya rule: list_induct2') - (metis remdups_nil_noteq_cons set_remdups)+ + shows "List.member xa = List.member ya" +proof - + from assms have \set (remdups xa) = set (remdups ya)\ + by simp + then show ?thesis by (simp add: fun_eq_iff) +qed text \Setting up the quotient type\ @@ -129,11 +130,11 @@ lemma dlist_member_insert: "member dl x \ insert x dl = dl" - by descending (simp add: List.member_def) + by descending simp lemma dlist_member_insert_eq: "member (insert y dl) x = (x = y \ member dl x)" - by descending (simp add: List.member_def) + by descending simp lemma dlist_insert_idem: "insert x (insert x dl) = insert x dl" @@ -145,23 +146,23 @@ lemma not_dlist_member_empty: "\ member empty x" - by descending (simp add: List.member_def) + by descending simp lemma not_dlist_member_remove: "\ member (remove x dl) x" - by descending (simp add: List.member_def) + by descending simp lemma dlist_in_remove: "a \ b \ member (remove b dl) a = member dl a" - by descending (simp add: List.member_def) + by descending simp lemma dlist_not_memb_remove: "\ member dl x \ remove x dl = dl" - by descending (simp add: List.member_def) + by descending simp lemma dlist_no_memb_remove_insert: "\ member dl x \ remove x (insert x dl) = dl" - by descending (simp add: List.member_def) + by descending simp lemma dlist_remove_empty: "remove x empty = empty" @@ -182,12 +183,12 @@ lemma dlist_no_memb_foldr: assumes "\ member dl x" shows "foldr f (insert x dl) e = f x (foldr f dl e)" - using assms by descending (simp add: List.member_def) + using assms by descending simp lemma dlist_foldr_insert_not_memb: assumes "\member t h" shows "foldr f (insert h t) e = f h (foldr f t e)" - using assms by descending (simp add: List.member_def) + using assms by descending simp lemma list_of_dlist_empty[simp]: "list_of_dlist empty = []" @@ -197,7 +198,7 @@ "list_of_dlist (insert x xs) = (if member xs x then (remdups (list_of_dlist xs)) else x # (remdups (list_of_dlist xs)))" - by descending (simp add: List.member_def remdups_remdups) + by descending (simp add: remdups_remdups) lemma list_of_dlist_remove[simp]: "list_of_dlist (remove x dxs) = remove1 x (list_of_dlist dxs)" @@ -280,8 +281,10 @@ lemma dlist_cases: "dl = empty \ (\h t. dl = insert h t \ \ member t h)" - by descending - (metis List.member_def dlist_eq_def hd_Cons_tl list_of_dlist_dlist remdups_hd_notin_tl remdups_list_of_dlist) + apply descending + apply auto + apply (metis neq_Nil_conv remdups_eq_nil_right_iff remdups_hd_notin_tl remdups_repeat) + done lemma dlist_exhaust: obtains "y = empty" | a dl where "y = insert a dl" diff -r cccbfa567117 -r b69e4da2604b src/HOL/Quotient_Examples/Quotient_FSet.thy --- a/src/HOL/Quotient_Examples/Quotient_FSet.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/Quotient_Examples/Quotient_FSet.thy Mon Jun 09 22:14:38 2025 +0200 @@ -54,8 +54,6 @@ lists. \ -declare List.member_def [simp] - definition sub_list :: "'a list \ 'a list \ bool" where @@ -978,7 +976,7 @@ proof (cases "xs=[]") case True then show ?thesis - using Cons.prems member_rec(2) by fastforce + using Cons.prems by auto (metis empty_iff empty_subsetI list.set(1)) next case False have "\\ List.member ys x; xs \ x # ys\ \ thesis" for x ys @@ -1091,8 +1089,8 @@ have d: "card_list l = Suc m" by fact then have "\a. List.member l a" by (auto dest: card_eq_SucD) then obtain a where e: "List.member l a" by auto - then have e': "List.member r a" using list_eq_def [simplified List.member_def [symmetric], of l r] b - by auto + then have e': "List.member r a" using list_eq_def [of l r] b + by simp have f: "card_list (removeAll a l) = m" using e d by (simp) have g: "removeAll a l \ removeAll a r" using remove_fset.rsp b by simp have "(removeAll a l) \2 (removeAll a r)" by (rule Suc.hyps[OF f g]) diff -r cccbfa567117 -r b69e4da2604b src/HOL/ex/Execute_Choice.thy --- a/src/HOL/ex/Execute_Choice.thy Fri Jun 06 18:36:29 2025 +0100 +++ b/src/HOL/ex/Execute_Choice.thy Mon Jun 09 22:14:38 2025 +0200 @@ -66,7 +66,7 @@ shows [code]: "valuesum (Mapping []) = 0" and "valuesum (Mapping (x # xs)) = (let l = (SOME l. l \ Mapping.keys (Mapping (x # xs))) in the (Mapping.lookup (Mapping (x # xs)) l) + valuesum (Mapping.delete l (Mapping (x # xs))))" - by (simp_all add: valuesum_rec finite_dom_map_of is_empty_Mapping null_def) + by (simp_all add: valuesum_rec finite_dom_map_of is_empty_Mapping) text \ As a side effect the precondition disappears (but note this has nothing to do with choice!).