header {* \isaheader{Frequently Used Auxiliary Lemmas} *} theory AuxBox = PCCFramework: lemmas set_mem_eq = mem_iff --{* changes the preprocessor for the simplifier, such that internally generated lemmas are augmented with proof objects *} setup {* [Simplifier.change_simpset_of op setmksimps (setmp proofs 2 (mksimps mksimps_pairs))] *} lemma forall_switch2: "(\ x y. P x y) \ (\ y x. P x y)" (*<*) by simp (*>*) lemma forall_switch3: "(\ z. (\ x . (\ y. P x y z))) \ (\ x y z. P x y z)" (*<*) by simp (*>*) lemma forall_switch4: "(\z w x y. P w x y z) \ (\w x y z. P w x y z)" (*<*) by simp (*>*) lemma forall_switch5: "\ z v w x y. P v w x y z \ \ v. \ w. \ x. \ y. \ z. P v w x y z" (*<*) by simp (*>*) lemma forall_switch6: "\ y q z v w x. P v w x y z q \ \ q. \ z. \ v. \ w. \ x. \ y. P v w x y z q" (*<*) by simp (*>*) lemma forall_switch7: "\ r v w x y z q. P v w x y z q r \ \ v. \ w. \ x. \ y. \ z. \ q. \ r. P v w x y z q r" (*<*) by simp (*>*) lemma forall_switch8: "\ r v w x y z q s. P v w x y z q s r \ \ v. \ w. \ x. \ y. \ z. \ q. \ s. \ r. P v w x y z q s r" (*<*) by simp (*>*) lemma forall_switch9: "\ z r s t u v w x y . P r s t u v w x y z \ \ r. \ s. \ t. \ u. \ v. \ w. \ x. \ y. \ z. P r s t u v w x y z" (*<*) by simp (*>*) lemma forall_switch10: "\ z q r s t u v w x y . P q r s t u v w x y z \ \ q. \ r. \ s. \ t. \ u. \ v. \ w. \ x. \ y. \ z. P q r s t u v w x y z" (*<*) by simp (*>*) lemma forall_switch11: "\ z p q r s t u v w x y . P p q r s t u v w x y z \ \ p. \ q. \ r. \ s. \ t. \ u. \ v. \ w. \ x. \ y. \ z. P p q r s t u v w x y z" (*<*) by simp (*>*) lemma forall_switch12: "\ z n p q r s t u v w x y. P n p q r s t u v w x y z \ \n. \ p. \ q. \ r. \ s. \ t. \ u. \ v. \ w. \ x. \ y. \ z. P n p q r s t u v w x y z" (*<*) by simp (*>*) lemma notin_union_E: "x \ (A \ B) = ((x \ A) \ (x \ B))" (*<*) by simp (*>*) lemma notin_subset: "\ x \ A; B \ A \ \ x \ B" (*<*) by auto (*>*) lemma notin_Union_iff: "A \ (\ S) = (\ X\S. A \ X)" (*<*) by auto (*>*) lemma refl_True: "(t = t) = True" (*<*) by simp (*>*) lemma refl_Some: "(Some x = Some y) = (x = y)" (*<*) by simp (*>*) lemma elem_set_append_cases: "\ x l1 l2. x \ set (l1@l2) = (x \ set l1) \ (x \ set l2)" (*<*) by auto (*>*) lemma suc_minus_swap: "\ a <= b \ \ (Suc b) - a = Suc (b - a)" (*<*) by arith (*>*) lemma rel_pow_step: "Re O Re ^ n = Re ^ (Suc n)" (*<*) by simp (*>*) lemma min_elim: "(a::'a::order) < b \ (min a b) = a" (*<*) apply (simp add: min_def) apply (rule impI) apply (drule order_less_imp_le) apply simp done (*>*) lemma suc_eq_plus1: "Suc x = x + 1" (*<*) by simp (*>*) lemma less_diff_conv2: "((a::nat) + b < c) = (a < c - b)" (*<*) by arith (*>*) lemma conjI': "\ X; X \ Y \ \ (X \ Y)" (*<*) by blast (*>*) lemma disjE2: "a | b \ ~ a \ b" (*<*) by auto (*>*) lemma set_concat_map: "set (concat (map f xs)) = Union (set ` (f ` set xs))" (*<*) by auto (*>*) lemma doubleAllI: "(\ x. P x = Q x) \ (\ x. P x) = (\ y. Q y)" (*<*) by simp (*>*) constdefs delL::"'a \ 'a list \ 'a list" "delL a xs == [x\xs. x \ a]" lemma delL_length: "\ a. a \ set xs \ length (delL a xs) < length xs" (*<*) apply (erule rev_mp) apply (simp only: atomize_all) apply (induct xs) apply simp apply (rule allI) apply (case_tac "aa = a") apply (simp add: delL_def) apply (simp only: not_less_eq[THEN sym]) apply (simp only: linorder_not_less) apply (rule length_filter_le) apply (erule_tac x = "aa" in allE) apply (rule impI) apply (simp add: delL_def) done (*>*) lemma delL_setdiff: "set (delL x xs) = (set xs) - {x}" (*<*) apply (simp add: delL_def) apply auto done (*>*) lemma setdiff_notin: "x \ B \ (x \ (A - B)) = (x \ A)" (*<*) by auto (*>*) lemma delL_subset: "\ x. set (delL x xs) \ set xs" (*<*) apply (simp add: delL_setdiff set_diff_def) apply (rule subsetI) apply simp done (*>*) lemma eqSOME: "\ x. P x = Q x \ ((SOME x. P x) = (SOME y. Q y))" (*<*) by simp (*>*) lemma not_Some_eq_pairs: "\a b. x \ Some (a,b) \ x = None" (*<*) apply (case_tac "x=None") apply simp apply (simp only: not_None_eq) apply (erule exE) apply (erule_tac x="fst y" in allE) apply (erule_tac x="snd y" in allE) apply simp done (*>*) lemma tl_drop: "tl L = drop (Suc 0) L" (*<*) apply (induct L) apply simp apply simp done (*>*) lemma remdups'_termination: "\x xs. length [x'\xs . x' \ x] < Suc (length xs)" (*<*) apply (rule allI)+ apply (induct_tac xs) apply simp apply simp done (*>*) consts remdups'::"'a list \ 'a list" recdef remdups' "measure (\ xs. length xs)" "remdups' [] = []" "remdups' (x#xs) = x#(remdups' [x'\xs. x' \ x])" (hints simp: remdups'_termination) lemma set_remdups': "\ xs. set (remdups' xs) = set xs" (*<*) apply (subgoal_tac "\ k. k = length xs") prefer 2 apply fastsimp apply (erule exE | erule rev_mp)+ apply (simp only: atomize_all) apply (rule forall_switch2) apply (rule allI) apply (rule_tac n="k" in nat_less_induct) apply (rule allI) apply (rule impI) apply (case_tac "xs") apply simp apply simp apply (erule_tac x="length [x' \ list. x' \ a]" in allE) apply (subgoal_tac "length [x' \ list. x' \ a] \ length list") prefer 2 apply (rule length_filter_le) apply simp apply (erule_tac x="[x' \ list. x' \ a]" in allE) apply simp apply (rule set_ext) apply simp apply (case_tac "x=a") apply simp apply simp done (*>*) lemma distinct_remdups': "\ xs. distinct (remdups' xs)" (*<*) apply (subgoal_tac "\ k. k = length xs") prefer 2 apply fastsimp apply (erule exE | erule rev_mp)+ apply (simp only: atomize_all) apply (rule forall_switch2) apply (rule allI) apply (rule_tac n="k" in nat_less_induct) apply (rule allI) apply (rule impI) apply (case_tac "xs") apply simp apply simp apply (erule_tac x="length [x' \ list. x' \ a]" in allE) apply (subgoal_tac "length [x' \ list. x' \ a] \ length list") prefer 2 apply (rule length_filter_le) apply simp apply (erule_tac x="[x' \ list. x' \ a]" in allE) apply (simp add: set_remdups') done (*>*) lemma filter_eq: "\ x \ set xs. P x = Q x \ [x\ xs. P x] = [x \ xs. Q x]" (*<*) apply (induct xs) apply simp apply simp done (*>*) lemma remdups'_append: "\ as bs. remdups' (as @ bs) = remdups' as @ [b\ remdups' bs. b \ set as]" (*<*) apply (subgoal_tac "\ k. k = length as") prefer 2 apply fastsimp apply (erule exE | erule rev_mp)+ apply (simp only: atomize_all) apply (rule forall_switch3) apply (rule allI) apply (rule_tac n="k" in nat_less_induct) apply (rule allI)+ apply (rule impI) apply (case_tac "as") apply simp apply simp apply (erule_tac x="length [x' \ list. x' \ a]" in allE) apply (subgoal_tac "length [x' \ list. x' \ a] < Suc (length list)") prefer 2 apply (subgoal_tac "length [x' \ list. x' \ a] \ (length list)") prefer 2 apply simp apply (simp (no_asm_simp)) apply (drule mp, assumption) apply simp apply (erule thin_rl)+ apply (subgoal_tac "\ k. k = length bs") prefer 2 apply fastsimp apply (erule exE)+ apply (erule rev_mp) apply (simp only: atomize_all) apply (rule forall_switch6) apply (rule allI) apply (rule_tac n="k" in nat_less_induct) apply (rule allI)+ apply (rule impI) apply (case_tac "bs") apply simp apply (simp split del: split_if) apply (case_tac "aa \ a") apply simp apply (erule_tac x="length [x'\lista . x' \ aa]" in allE) apply (subgoal_tac "length [x'\lista . x' \ aa] \ length lista") prefer 2 apply simp apply simp apply (erule_tac x="[x'\lista . x' \ aa]" in allE) apply simp apply (erule_tac x="a" in allE) apply (erule_tac x="list" in allE) apply (subgoal_tac "[x\lista . x \ aa \ x \ a] = [x\lista . x \ a \ x \ aa]") prefer 2 apply (rule filter_eq) apply (rule ballI) apply (rule iffI) apply simp apply simp apply simp apply simp apply (erule_tac x="length [x'\lista . x' \ a]" in allE) apply (subgoal_tac "length [x'\lista . x' \ a] \ length lista") prefer 2 apply simp apply simp apply (erule_tac x="[x'\lista . x' \ a]" in allE) apply simp apply (erule_tac x="a" in allE) apply (erule_tac x="list" in allE) apply (subgoal_tac "[x\lista . x \ a \ x \ a] = [x\lista . x \ a]") prefer 2 apply (rule filter_eq) apply simp apply simp done (*>*) lemma remdups'_append_fst: "a \ set as \ remdups' (as@[a]@as') = remdups' as @ [a] @ ([a' \ (remdups' as'). a' \ set (as @ [a])])" (*<*) apply (simp only: remdups'_append) apply simp done (*>*) lemma in_remdups'_split: "x \ set (remdups' xs) \ \as bs. (remdups' xs) = as @ (x#bs) \ x\ set as \ x \ set bs" (*<*) apply (subgoal_tac "distinct (remdups' xs)") prefer 2 apply (rule distinct_remdups') apply (simp only: in_set_conv_decomp) apply (erule exE)+ apply (rule_tac x="ys" in exI) apply (rule_tac x="zs" in exI) apply simp apply (rule conjI) apply (rule allI)+ apply (rule classical) apply simp apply (rule allI)+ apply (rule classical) apply simp done (*>*) lemma in_set_remdups': "x \ set xs \ x \ set (remdups' xs)" (*<*) by (simp add: set_remdups') (*>*) lemma in_rd_sp: "x \ set xs \ \as bs. (remdups' xs) = as @ (x#bs) \ x\ set as \ x \ set bs" (*<*) apply (rule in_remdups'_split) apply (simp add: set_remdups') done (*>*) lemma remdups'_empty [simp]: "(remdups' l = []) = (l = [])" (*<*) apply (induct l) apply simp apply simp done (*>*) lemma length_remdups_set: "length (remdups' xs) \ Suc 0 = (\ x y. x \ set xs \ y \ set xs \ x = y)" (*<*) apply (rule iffI) apply (case_tac "remdups' xs") apply simp apply (case_tac "list") prefer 2 apply simp apply simp apply (subgoal_tac "set xs = set [a]") prefer 2 apply (subgoal_tac "set (remdups' xs) = set xs") prefer 2 apply (rule set_remdups') apply simp apply simp apply (case_tac "remdups' xs") apply simp apply (case_tac "list") apply simp apply simp apply (subgoal_tac "set xs = set (a # aa # lista)") prefer 2 apply (subgoal_tac "set (remdups' xs) = set xs") prefer 2 apply (rule set_remdups') apply simp apply simp apply (erule_tac x="a" in allE) apply (erule_tac x="aa" in allE) apply simp apply (subgoal_tac "distinct (remdups' xs)") prefer 2 apply (rule distinct_remdups') apply simp done (*>*) lemma in_set_conv_decomp_fst': "(x \ set xs) = (\ys zs. (xs = ys @ x # zs) \ x \ set ys)" (*<*) apply (induct xs) apply simp apply (rule iffI) apply simp apply (case_tac "x=a") apply simp apply (rule_tac x="[]" in exI) apply simp apply simp apply (erule exE) apply (rule_tac x="a#ys" in exI) apply simp apply simp apply (case_tac "x=a") apply simp apply simp apply (erule exE) apply (case_tac "ys") apply simp apply (rule_tac x="list" in exI) apply simp done (*>*) lemma in_set_conv_decomp_fst: "(x \ set xs) \ (\ys zs. (xs = ys @ x # zs) \ x \ set ys)" (*<*) apply (subgoal_tac "(\ys zs. (xs = ys @ x # zs) \ x \ set ys) = (x \ set xs)") prefer 2 apply (rule sym) apply (rule in_set_conv_decomp_fst') apply simp done (*>*) lemma in_set_conv_decomp_last: "(x \ set xs) \ (\ys zs. (xs = ys @ x # zs) \ x \ set zs)" (*<*) apply (induct xs) apply simp apply simp apply (erule disjE) apply (case_tac "x \ set xs") apply simp apply (erule exE)+ apply (rule_tac x="a # ys" in exI) apply (rule_tac x="zs" in exI) apply simp apply (rule_tac x="[]" in exI) apply (rule_tac x="xs" in exI) apply simp apply simp apply (erule exE)+ apply (rule_tac x="a # ys" in exI) apply (rule_tac x="zs" in exI) apply simp done (*>*) lemma map_parts: "\ ys ys'. map f xs = ys@ys' \ \ xs' xs''. xs = xs' @ xs'' \ ys = map f xs' \ ys' = map f xs''" (*<*) apply (induct xs) apply simp apply atomize apply (case_tac "ys") apply (case_tac "ys'") apply simp apply (erule_tac x="[]" in allE) apply (erule_tac x="list" in allE) apply simp apply (erule_tac x="list" in allE) apply (erule_tac x="ys'" in allE) apply simp apply (erule exE)+ apply (rule_tac x="a # xs'" in exI) apply (rule_tac x="xs''" in exI) apply simp done (*>*) lemma option_neq: "(Some x = None) = False" (*<*) by simp (*>*) lemma option_neq2:"(None = Some x) = False" (*<*) by simp (*>*) (*<*) lemmas option_simp = option_neq option_neq2 (*>*) lemma append_eq: "(xs@xs' = xs@xs'') = (xs' = xs'')" (*<*) by simp (*>*) lemma list_set_pred: "(\ xs x xs'. ys = xs @ x # xs' \ P x) = (\ x \ set ys. P x)" (*<*) apply (rule iffI) apply (erule exE)+ apply (rule_tac x="x" in bexI) apply simp apply simp apply (erule bexE) apply (simp only: in_set_conv_decomp) apply (erule exE )+ apply fastsimp done (*>*) lemma in_set_conv_decomp_2: "\ x \ set s; y \ set s; x \ y \ \ \ s' s'' s'''. s = s' @ x # s'' @ y # s''' \ s = s' @ y # s'' @ x # s'''" (*<*) apply (induct s) apply simp apply atomize apply simp apply (case_tac "x = a") apply (case_tac "y = a") apply simp apply simp apply (rule_tac x="[]" in exI) apply (simp add: in_set_conv_decomp) apply (case_tac "y = a") apply simp apply (rule_tac x="[]" in exI) apply (simp add: in_set_conv_decomp) apply (erule exE)+ apply (rule_tac x="ys" in exI) apply (rule_tac x="zs" in exI) apply simp apply simp apply (erule exE)+ apply (rule_tac x="a # s'" in exI) apply (rule_tac x="s''" in exI) apply (rule_tac x="s'''" in exI) apply simp done (*>*) lemma list_prefix_eq: "\as bs. \ as @ x # as' = bs @ x # bs'; x \ set as; x \ set bs \ \ as = bs" (*<*) apply (subgoal_tac "\k. k = length as + length bs") prefer 2 apply simp apply (erule exE) apply (erule rev_mp)+ apply (simp only: atomize_all) apply (rule forall_switch3) apply (rule allI) apply (rule_tac n="k" in nat_less_induct) apply (rule allI)+ apply (rule impI)+ apply (case_tac "as") apply (case_tac "bs") apply simp apply simp apply (case_tac "bs") apply simp apply (erule_tac x="length list + length lista" in allE) apply simp done (*>*) lemma distinct_list_match: "\ as@[x]@as' = bs@[x]@bs'; distinct (as@[x]@as'); distinct (bs@[x]@bs') \ \ as = bs \ as' = bs'" (*<*) apply (erule_tac P="distinct (as @ [x] @ as')" in rev_mp) apply (erule_tac P=" distinct (bs @ [x] @ bs')" in rev_mp) apply (simp (no_asm)) apply (rule impI)+ apply (rule classical) apply simp apply (case_tac "as = bs") apply simp apply simp apply (erule conjE)+ apply (subgoal_tac "as = bs") prefer 2 apply (rule_tac x="x" and as'="as'" and bs'="bs'" in list_prefix_eq) apply assumption+ apply simp done (*>*) lemma renSnd: "x = x' \ \em. P em x = P em x'" (*<*) by simp (*>*) lemma allE2: "\ \ x y. P x y; P x y \ R \ \ R" (*<*) by blast (*>*) lemma rev_take_nth: "\ x y. \ x < length s; y < x \ \ s ! (x - Suc y) = rev (take x s) ! y" (*<*) apply (induct s) apply simp apply (case_tac "x - Suc y") apply simp apply (case_tac "x") apply simp apply (simp add: nth_append) apply simp apply (case_tac "x") apply simp apply (simp add: nth_append) apply (rule conjI) apply (rule impI) apply atomize apply (subgoal_tac "nata - (Suc y) = nat") prefer 2 apply arith apply (erule_tac x="nata" in allE) apply (erule_tac x="y" in allE) apply simp apply arith done (*>*) lemma split_if_False: "if B then A else False \ B \ A" (*<*) by (simp split add: split_if_asm) (*>*) lemma forall_expand: "(\ x < Suc y. P x) = (P 0 \ (\ x < y. P (Suc x)))" (*<*) apply (induct y) apply simp apply (rule iffI) apply (rule conjI) apply simp apply simp apply simp apply (rule allI) apply (rule impI) apply (case_tac "x") apply simp apply simp done (*>*) lemma not_Nil_case: "x \ [] \ (case x of [] \ a | l#ls \ b l ls) = b (hd x) (tl x)" (*<*) apply (case_tac x) apply simp apply simp done (*>*) lemma hd_arb: "hd [] = arbitrary" (*<*) by (simp add: hd_list_def) (*>*) lemma prod_simp: "(a,b) = (a',b') = (a = a' \ b = b')" (*<*) by simp (*>*) lemma length_filter_less: "aa mem S \ length [a \ S. a \ aa] < length S" (*<*) apply (induct S) apply simp apply simp apply (rule impI) apply simp apply (subgoal_tac "length [a\S . a \ aa] \ length S") prefer 2 apply (simp add: length_filter_le) apply (subgoal_tac "Suc (length S) \ length S") prefer 2 apply simp apply (simp (no_asm_simp)) done (*>*) lemma insert_union_right: "insert p (A \ B) = A \ (insert p B)" (*<*) by (simp add: set_eq_subset) (*>*) lemma insert_set_filter: "(insert p {x. x \ set S \ x \ p}) = (insert p (set S))" (*<*) by (simp add: set_eq_subset subset_def) (*>*) lemma intersect_mono: "set V \ {x. x \ set S \ x \ p} \ set V \ set S" (*<*) apply (simp add: set_eq_subset subset_def) done (*>*) lemma Un_real_subset_iff: "(X \ Y) \ Z = (X \ Z \ Y \ Z \ X \ Y \ Z)" (*<*) apply (rule iffI) apply (rule conjI) apply (simp add: psubset_def) apply (case_tac "X = Z") apply simp apply (erule conjE) apply (drule Un_absorb2) apply simp apply assumption apply (simp add: psubset_def) apply (case_tac "Y = Z") apply simp apply (erule conjE) apply (drule Un_absorb1) apply simp apply assumption apply (erule conjE)+ apply (simp add: psubset_def) done (*>*) lemma map_fst_tuple : "map fst (map (\x. (x,f x)) L) = L" (*<*) apply (induct L) apply simp apply simp done (*>*) lemma image_fst_tuple: " fst ` (\p. (p, f p)) ` S = S" (*<*) apply (rule set_ext) apply (rule iffI) apply (erule imageE) apply simp apply (erule imageE) apply simp apply (rule_tac x="(\ p. (p, f p)) x" in image_eqI) apply simp apply (rule_tac x="id x" in image_eqI) apply simp apply simp done (*>*) lemma list_length_split: "\ n. n < length L \ \ ls l ls'. L = ls@l#ls' \ length ls = n" (*<*) apply (induct L) apply simp apply simp apply (case_tac "n") apply simp apply simp apply atomize apply (erule_tac x="nat" in allE) apply simp apply (erule exE | erule conjE)+ apply (rule_tac x="a#ls" in exI) apply simp done (*>*) lemma un_subset_drop: "(X \ (Y \ Z)) \ W \ (X \ Y) \ W" (*>*) by blast (*>*) lemma un_subset_drop': "(X \ (Y \ (Z \ (U \ V)))) \ W \ (X \ (Z \ U)) \ W" (*<*) by blast (*>*) lemma ListEq: "(a#al = b#bl) = (a=b \ al=bl)" (*<*) by auto (*>*) lemma seteq_simp: "(\ x. (x \ A) = (x \ B)) \ A = B" (*<*) by auto (*>*) lemma map_simp2: "(\x. x \ set l \ f x = f' x) \ map f l = map f' l" (*<*) apply (induct l) apply auto done (*>*) lemma map_simp: "\ l = l'; (\ x. x\ set l \ (f x) = (f' x)) \ \ (map f l) = (map f' l')" (*<*) apply hypsubst apply (simp only: map_simp2) done (*>*) lemma notin_simp: "\ pc'\ set l \ \ pc'\ set [x\l. x\ pc]" (*<*) by auto (*>*) lemma neg_notin_simp: "\ pc\pc'; \ pc'\ set l \ \ \ pc'\ set [x\l. x\ pc]" (*<*) by auto (*>*) lemma option_case_simp: "\ x \ None \ \ \ a. x = Some a" (*<*) by auto (*>*) lemma filter_list_simp: "\ pc\ set l \ \ [x\l. x\pc \ x\pc'] = [a\l. a\pc']" (*<*) apply (subgoal_tac "\ x\set l. x\pc") prefer 2 apply clarsimp apply (simp only: filter_filter [ THEN sym]) apply (simp only: filter_True) done (*>*) lemma list_abr_simp: "[x\S. x\pc \ x\pc'] = [x\[a\S. a \ pc]. x\pc']" (*<*) apply auto done (*>*) lemma if_then_else_False: "(if (A::bool) then (B::bool) else False) = (A \ B)" (*<*) apply (case_tac "A") apply simp apply simp done (*>*) lemma map_of_append': "\ x \ set (map fst xs) \ \ (map_of (xs @ ys)) x = (map_of ys) x" (*<*) apply (induct xs) apply simp apply simp done (*>*) lemma triple_simp: "(fst x, fst (snd x), snd (snd x)) = x" (*<*) by fastsimp (*>*) (*<*) lemma conjE1: "\ A \ B; B \ P\ \ P" by simp lemma conjE2: "\ A \ B; A \ P\ \ P" by simp (*>*) (*<*) text {* Functions that calculate the size of proof objects. *} ML {* fun prf_size () = let val proof_state = Toplevel.proof_of (Toplevel.get_state ()); val (_, (_, st)) = Proof.get_goal proof_state; val {der = (_, prf), ...} = rep_thm st in Proofterm.size_of_proof (prf) end; *} ML {* fun nprf_size () = let val proof_state = Toplevel.proof_of (Toplevel.get_state ()); val (_, (_, st)) = Proof.get_goal proof_state; val {der = (_, prf), ...} = rep_thm st in Proofterm.size_of_proof (Proofterm.rewrite_proof_notypes ([], ProofRewriteRules.rprocs false) prf) end; *} (*>*) end