# HG changeset patch # User Sebastiaan Joosten # Date 1545234430 -3600 # Node ID 4e50ff17734836e7b67578ebb1aef26060267bed # Parent a9003e6d046325e4eb27c9360e7a9af9975aa1e6 Cleanup in UF diff -r a9003e6d0463 -r 4e50ff177348 thys/UF.thy --- a/thys/UF.thy Wed Dec 19 16:10:58 2018 +0100 +++ b/thys/UF.thy Wed Dec 19 16:47:10 2018 +0100 @@ -20,28 +20,28 @@ subsection {* The construction of component functions *} text {* - The recursive function used to do arithmatic addition. + The recursive function used to do arithmetic addition. *} definition rec_add :: "recf" where "rec_add \ Pr 1 (id 1 0) (Cn 3 s [id 3 2])" text {* - The recursive function used to do arithmatic multiplication. + The recursive function used to do arithmetic multiplication. *} definition rec_mult :: "recf" where "rec_mult = Pr 1 z (Cn 3 rec_add [id 3 0, id 3 2])" text {* - The recursive function used to do arithmatic precede. + The recursive function used to do arithmetic precede. *} definition rec_pred :: "recf" where "rec_pred = Cn 1 (Pr 1 z (id 3 1)) [id 1 0, id 1 0]" text {* - The recursive function used to do arithmatic subtraction. + The recursive function used to do arithmetic subtraction. *} definition rec_minus :: "recf" where @@ -289,29 +289,12 @@ arity.simps[simp del] Sigma.simps[simp del] rec_sigma.simps[simp del] -lemma rec_pr_0_simp_rewrite: " - rec_exec (Pr n f g) (xs @ [0]) = rec_exec f xs" -by(simp add: rec_exec.simps) - -lemma rec_pr_0_simp_rewrite_single_param: " - rec_exec (Pr n f g) [0] = rec_exec f []" -by(simp add: rec_exec.simps) - lemma rec_pr_Suc_simp_rewrite: "rec_exec (Pr n f g) (xs @ [Suc x]) = rec_exec g (xs @ [x] @ [rec_exec (Pr n f g) (xs @ [x])])" by(simp add: rec_exec.simps) -lemma rec_pr_Suc_simp_rewrite_single_param: - "rec_exec (Pr n f g) ([Suc x]) = - rec_exec g ([x] @ [rec_exec (Pr n f g) ([x])])" -by(simp add: rec_exec.simps) - -lemma Sigma_0_simp_rewrite_single_param: - "Sigma f [0] = f [0]" -by(simp add: Sigma.simps) - lemma Sigma_0_simp_rewrite: "Sigma f (xs @ [0]) = f (xs @ [0])" by(simp add: Sigma.simps) @@ -320,11 +303,7 @@ "Sigma f (xs @ [Suc x]) = Sigma f (xs @ [x]) + f (xs @ [Suc x])" by(simp add: Sigma.simps) -lemma Sigma_Suc_simp_rewrite_single: - "Sigma f ([Suc x]) = Sigma f ([x]) + f ([Suc x])" -by(simp add: Sigma.simps) - -lemma [simp]: "(xs @ ys) ! (Suc (length xs)) = ys ! 1" +lemma append_access_1[simp]: "(xs @ ys) ! (Suc (length xs)) = ys ! 1" by(simp add: nth_append) lemma get_fstn_args_take: "\length xs = m; n \ m\ \ @@ -602,9 +581,6 @@ apply(erule_tac x = n in allE, simp add: nth_append primerec_accum) done -lemma min_Suc_Suc[simp]: "min (Suc (Suc x)) x = x" - by auto - declare numeral_3_eq_3[simp] lemma primerec_rec_pred_1[intro]: "primerec rec_pred (Suc 0)" @@ -660,10 +636,6 @@ apply(auto, simp add: nth_append, auto) done -lemma min_P0[simp]: "Rr (xs @ [0]) \ - Min {x. x = (0::nat) \ Rr (xs @ [x])} = 0" -by(rule_tac Min_eqI, simp, simp, simp) - lemma primerec_rec_not_1[intro]: "primerec rec_not (Suc 0)" apply(simp add: rec_not_def) apply(rule prime_cn, auto) @@ -815,8 +787,6 @@ declare rec_maxr.simps[simp del] Maxr.simps[simp del] declare le_lemma[simp] -lemma min_with_suc3[simp]: "(min (Suc (Suc (Suc (x)))) (x)) = x" -by simp declare numeral_2_eq_2[simp] @@ -846,24 +816,6 @@ apply(case_tac i, auto) done -lemma take_butlast_list_plus_two[simp]: - "length ys = Suc n \ (take n ys @ [ys ! n, ys ! n]) = - ys @ [ys ! n]" -apply(simp) -apply(subgoal_tac "\ xs y. ys = xs @ [y]", auto) -apply(rule_tac x = "butlast ys" in exI, rule_tac x = "last ys" in exI) -apply(case_tac "ys = []", simp_all) -done - -lemma Maxr_Suc_simp: - "Maxr Rr xs (Suc w) =(if Rr (xs @ [Suc w]) then Suc w - else Maxr Rr xs w)" -apply(auto simp: Maxr.simps expand_conj_in_set) -apply(rule_tac Max_eqI, auto) -done - -lemma min_Suc_1[simp]: "min (Suc n) n = n" by simp - lemma Sigma_0: "\ i \ n. (f (xs @ [i]) = 0) \ Sigma f (xs @ [n]) = 0" apply(induct n, simp add: Sigma.simps) @@ -1583,17 +1535,6 @@ "fac 0 = 1" | "fac (Suc x) = (Suc x) * fac x" -lemma rec_exec_rec_dummyfac_0: "rec_exec rec_dummyfac [0, 0] = Suc 0" -by(simp add: rec_dummyfac_def rec_exec.simps) - -lemma rec_cn_simp: "rec_exec (Cn n f gs) xs = - (let rgs = map (\ g. rec_exec g xs) gs in - rec_exec f rgs)" -by(simp add: rec_exec.simps) - -lemma rec_id_simp: "rec_exec (id m n) xs = xs ! n" - by(simp add: rec_exec.simps) - lemma fac_dummy: "rec_exec rec_dummyfac [x, y] = y !" apply(induct y) apply(auto simp: rec_dummyfac_def rec_exec.simps) @@ -1804,7 +1745,7 @@ text {* @{text "Lo"} specifies the @{text "lo"} function given on page 79 of - Boolos's book. It is one of the two notions of integeral logarithmatic + Boolos's book. It is one of the two notions of integeral logarithmetic operation on that page. The other is @{text "lg"}. *} fun lo :: " nat \ nat \ nat" @@ -1814,10 +1755,6 @@ declare lo.simps[simp del] -lemma primerec_then_ge_0[elim]: "primerec rf n \ n > 0" -apply(induct rule: primerec.induct, auto) -done - lemma primerec_sigma[intro!]: "\n > Suc 0; primerec rf n\ \ primerec (rec_sigma rf) n" @@ -1885,27 +1822,13 @@ done qed -lemma MaxloR0[simp]: "Max {ya. ya = 0 \ loR [0, y, ya]} = 0" -apply(rule_tac Max_eqI, auto simp: loR.simps) -done - -lemma two_less_square[simp]: "Suc 0 < y \ Suc (Suc 0) < y * y" - by(induct y, auto) - -lemma less_mult: "\x > 0; y > Suc 0\ \ x < y * x" -apply(case_tac y, simp, simp) -done - lemma x_less_exp: "\y > Suc 0\ \ x < y^x" apply(induct x, simp, simp) apply(case_tac x, simp, auto) apply(rule_tac y = "y* y^nat" in le_less_trans, simp) -apply(rule_tac less_mult, auto) +apply(rule_tac n_less_m_mult_n, auto) done -lemma le_mult: "y \ (0::nat) \ x \ x * y" - by(induct y, simp, simp) - lemma uplimit_loR: assumes "Suc 0 < x" "Suc 0 < y" "loR [x, y, xa]" shows "xa \ x" @@ -1955,7 +1878,7 @@ text {* @{text "lg"} specifies the @{text "lg"} function given on page 79 of - Boolos's book. It is one of the two notions of integeral logarithmatic + Boolos's book. It is one of the two notions of integeral logarithmetic operation on that page. The other is @{text "lo"}. *} fun lg :: "nat \ nat \ nat" @@ -2838,20 +2761,6 @@ declare nonstop.simps[simp del] -lemma primerec_not0: "primerec f n \ n > 0" -by(induct f n rule: primerec.induct, auto) - -lemma primerec_not0E[elim]: "primerec f 0 \ RR" -apply(drule_tac primerec_not0, simp) -done - -lemma length_butlast[simp]: "length xs = Suc n \ length (butlast xs) = n" -apply(subgoal_tac "\ y ys. xs = ys @ [y]",force) -apply(rule_tac x = "last xs" in exI) -apply(rule_tac x = "butlast xs" in exI) -apply(case_tac "xs = []", auto) -done - text {* The lemma relates the interpreter of primitive functions with the calculation relation of general recursive functions. @@ -2890,50 +2799,20 @@ ;(simp add:primerec_rec_pi_helpers primrec_dummyfac)?)+ by fastforce+ -lemma primerec_rec_trpl[intro]: "primerec rec_trpl (Suc (Suc (Suc 0)))" -apply(simp add: rec_trpl_def) -apply(tactic {* resolve_tac @{context} [@{thm prime_cn}, - @{thm prime_id}, @{thm prime_pr}] 1*}, auto+)+ -done - -lemma primerec_rec_listsum2[intro!]: "\0 < vl; n \ vl\ \ primerec (rec_listsum2 vl n) vl" -apply(induct n) -apply(simp_all add: rec_strt'.simps Let_def rec_listsum2.simps) -apply(tactic {* resolve_tac @{context} [@{thm prime_cn}, - @{thm prime_id}, @{thm prime_pr}] 1*}, auto+)+ -done - -lemma primerec_rec_strt': "\0 < vl; n \ vl\ \ primerec (rec_strt' vl n) vl" -apply(induct n) -apply(simp_all add: rec_strt'.simps Let_def) -apply(tactic {* resolve_tac @{context} [@{thm prime_cn}, - @{thm prime_id}, @{thm prime_pr}] 1*}, auto+) -done - -lemma primerec_rec_strt: "vl > 0 \ primerec (rec_strt vl) vl" -apply(simp add: rec_strt.simps rec_strt'.simps) -by(tactic {* resolve_tac @{context} [@{thm prime_cn}, - @{thm prime_id}, @{thm prime_pr}] 1*}; force elim:primerec_rec_strt') - -lemma primerec_map_vl: - "i < vl \ primerec ((map (\i. recf.id (Suc vl) (i)) - [Suc 0.. primerec (rec_inpt (Suc vl)) (Suc vl)" -apply(simp add: rec_inpt_def) -apply(tactic {* resolve_tac @{context} [@{thm prime_cn}, - @{thm prime_id}, @{thm prime_pr}] 1*}; fastforce elim:primerec_rec_strt primerec_map_vl) -done - lemma primerec_rec_conf[intro]: "primerec rec_conf (Suc (Suc (Suc 0)))" apply(simp add: rec_conf_def) by(tactic {* resolve_tac @{context} [@{thm prime_cn}, @@ -3061,20 +2934,6 @@ "rec_F = Cn (Suc (Suc 0)) rec_valu [Cn (Suc (Suc 0)) rec_right [Cn (Suc (Suc 0)) rec_conf ([id (Suc (Suc 0)) 0, id (Suc (Suc 0)) (Suc 0), rec_halt])]]" -lemma get_fstn_args_nth[simp]: - "k < n \ (get_fstn_args m n ! k) = id m (k)" -apply(induct n, simp) -apply(case_tac "k = n", simp_all add: get_fstn_args.simps - nth_append) -done - -lemma get_fstn_args_is_id[simp]: - "\ys \ []; - k < length ys\ \ - (get_fstn_args (length ys) (length ys) ! k) = - id (length ys) (k)" -by(erule_tac get_fstn_args_nth) - lemma terminate_halt_lemma: "\rec_exec rec_nonstop ([m, r] @ [t]) = 0; \i \ terminate rec_halt [m, r]" @@ -3610,13 +3469,7 @@ next show "l \ ?setx" by simp qed -qed - -lemma conf_decode2: - "\m \ n; m \ k; n \ k; - \ Suc 0 < Pi m ^ l * Pi n ^ st * Pi k ^ r\ \ l = 0" -apply(case_tac "Pi m ^ l * Pi n ^ st * Pi k ^ r", auto) -done +qed lemma left_trpl_fst[simp]: "left (trpl l st r) = l" apply(simp add: left.simps trpl.simps lo.simps loR.simps mod_dvd_simp) @@ -3808,8 +3661,6 @@ lemma fetch_zero_zero[simp]: "fetch tp 0 b = (nact, ns) \ ns = 0" by(simp add: fetch.simps) -lemma Five_Suc: "5 = Suc 4" by simp - lemma modify_tprog_fetch_state: "\st \ length tp div 2; st > 0; b = 1 \ b = 0\ \ modify_tprog tp ! Suc (4 * (st - Suc 0) + 2 * b) = @@ -3900,9 +3751,6 @@ "\a = a'; b = b'; c = c'\ \ trpl a b c = trpl a' b' c'" by simp -lemma bl2wc_Bk[simp]: "bl2wc [Bk] = 0" -by(simp add: bl2wc.simps bl2nat.simps) - lemma bl2nat_double: "bl2nat xs (Suc n) = 2 * bl2nat xs n" proof(induct xs arbitrary: n) case Nil thus "?case" @@ -4021,84 +3869,6 @@ done qed -lemma bl2nat_exp: "n \ 0 \ bl2nat bl n = 2^n * bl2nat bl 0" -apply(induct bl) -apply(auto simp: bl2nat.simps) -apply(case_tac a, auto simp: bl2nat.simps bl2nat_double) -done - -lemma nat_minus_eq: "\a = b; c = d\ \ a - c = b - d" -by auto - -lemma tape_of_nat_list_butlast_last: - "ys \ [] \ = @ Bk # Oc\Suc y" -apply(induct ys, simp, simp) -apply(case_tac "ys = []", simp add: tape_of_list_def tape_of_nat_def) -apply(simp add: tape_of_nl_cons tape_of_nat_def) -done - -lemma listsum2_append: - "\n \ length xs\ \ listsum2 (xs @ ys) n = listsum2 xs n" -apply(induct n) -apply(auto simp: listsum2.simps nth_append) -done - -lemma strt'_append: - "\n \ length xs\ \ strt' xs n = strt' (xs @ ys) n" -proof(induct n arbitrary: xs ys) - fix xs ys - show "strt' xs 0 = strt' (xs @ ys) 0" by(simp add: strt'.simps) -next - fix n xs ys - assume ind: - "\ xs ys. n \ length xs \ strt' xs n = strt' (xs @ ys) n" - and h: "Suc n \ length (xs::nat list)" - show "strt' xs (Suc n) = strt' (xs @ ys) (Suc n)" - using ind[of xs ys] h - apply(simp add: strt'.simps nth_append listsum2_append) - done -qed - -lemma length_listsum2_eq: - "\length (ys::nat list) = k\ - \ length () = listsum2 (map Suc ys) k + k - 1" -apply(induct k arbitrary: ys, simp_all add: listsum2.simps) -apply(subgoal_tac "\ xs x. ys = xs @ [x]", auto) -proof - - fix xs x - assume ind: "\ys. length ys = length xs \ length () - = listsum2 (map Suc ys) (length xs) + - length (xs::nat list) - Suc 0" - have "length () - = listsum2 (map Suc xs) (length xs) + length xs - Suc 0" - apply(rule_tac ind, simp) - done - thus "length () = - Suc (listsum2 (map Suc xs @ [Suc x]) (length xs) + x + length xs)" - apply(case_tac "xs = []") - apply(simp add: tape_of_list_def listsum2.simps - tape_of_nat_list.simps tape_of_nat_def) - apply(simp add: tape_of_nat_list_butlast_last) - using listsum2_append[of "length xs" "map Suc xs" "[Suc x]"] - apply(simp) - done -next - fix k ys - assume "length ys = Suc k" - thus "\xs x. ys = xs @ [x]" - apply(rule_tac x = "butlast ys" in exI, - rule_tac x = "last ys" in exI) - apply(case_tac ys, auto) - done -qed - -lemma tape_of_nat_list_length: - "length (<(ys::nat list)>) = - listsum2 (map Suc ys) (length ys) + length ys - 1" - using length_listsum2_eq[of ys "length ys"] - apply(simp) - done - lemma trpl_code_simp[simp]: "trpl_code (steps0 (Suc 0, Bk\l, ) tp 0) = rec_exec rec_conf [code tp, bl2wc (), 0]" @@ -4451,7 +4221,6 @@ "\steps0 (Suc 0, Bk\l, ) tp stp = (0, Bk\m, Oc\rs@Bk\n); tm_wf (tp,0); 0 \ rec_exec rec_F [code tp, (bl2wc ())] = (rs - Suc 0)" -thm halt_least_step nonstop_t_eq nonstop_lemma rec_t_eq_steps conf_lemma apply(frule_tac halt_least_step, auto) apply(frule_tac nonstop_t_eq, auto simp: nonstop_lemma) using rec_t_eq_steps[of tp l lm stp] @@ -4485,4 +4254,6 @@ qed qed +unused_thms + end \ No newline at end of file