diff -r 01d223421ba0 -r 44c4450152e3 utm/uncomputable.thy --- a/utm/uncomputable.thy Wed Dec 12 11:45:04 2012 +0000 +++ b/utm/uncomputable.thy Fri Mar 01 17:13:32 2013 +0000 @@ -37,136 +37,110 @@ *} fun tcopy_F0 :: "nat \ tape \ bool" where - "tcopy_F0 x tp = (let (ln, rn) = tp in - list_all isBk ln & rn = replicate x Oc - @ [Bk] @ replicate x Oc)" + "tcopy_F0 x (l, r) = (\ i. l = Bk\<^bsup>i\<^esup> \ r = Oc\<^bsup>x\<^esup> @ Bk # Oc\<^bsup>x\<^esup>)" fun tcopy_F1 :: "nat \ tape \ bool" where - "tcopy_F1 x (ln, rn) = (ln = [] & rn = replicate x Oc)" + "tcopy_F1 x (l, r) = (l = [] \ r = Oc\<^bsup>x\<^esup>)" fun tcopy_F2 :: "nat \ tape \ bool" - where - "tcopy_F2 0 tp = False" | - "tcopy_F2 (Suc x) (ln, rn) = (length ln > 0 & - ln @ rn = replicate (Suc x) Oc)" + where + "tcopy_F2 x (l, r) = (\ i j. i > 0 \ i + j = x \ l = Oc\<^bsup>i\<^esup> \ r = Oc\<^bsup>j\<^esup>)" fun tcopy_F3 :: "nat \ tape \ bool" where - "tcopy_F3 0 tp = False" | - "tcopy_F3 (Suc x) (ln, rn) = - (ln = Bk # replicate (Suc x) Oc & length rn <= 1)" + "tcopy_F3 x (l, r) = (x > 0 \ l = Bk # Oc\<^bsup>x\<^esup> \ tl r = [])" fun tcopy_F4 :: "nat \ tape \ bool" where - "tcopy_F4 0 tp = False" | - "tcopy_F4 (Suc x) (ln, rn) = - ((ln = replicate x Oc & rn = [Oc, Bk, Oc]) - | (ln = replicate (Suc x) Oc & rn = [Bk, Oc])) " + "tcopy_F4 x (l, r) = (x > 0 \ ((l = Oc\<^bsup>x\<^esup> \ r = [Bk, Oc]) \ (l = Oc\<^bsup>x - 1\<^esup> \ r = [Oc, Bk, Oc])))" + +fun tcopy_F5_loop :: "nat \ tape \ bool" + where + "tcopy_F5_loop x (l, r) = + (\ i j. i + j + 1 = x \ l = Oc\<^bsup>i\<^esup> \ r = Oc # Oc # Bk\<^bsup>j\<^esup> @ Oc\<^bsup>j\<^esup> \ j > 0)" + +fun tcopy_F5_exit :: "nat \ tape \ bool" + where + "tcopy_F5_exit x (l, r) = + (l = [] \ r = Bk # Oc # Bk\<^bsup>x\<^esup> @ Oc\<^bsup>x\<^esup> \ x > 0 )" fun tcopy_F5 :: "nat \ tape \ bool" where - "tcopy_F5 0 tp = False" | - "tcopy_F5 (Suc x) (ln, rn) = - (if rn = [] then False - else if hd rn = Bk then (ln = [] & - rn = Bk # (Oc # replicate (Suc x) Bk - @ replicate (Suc x) Oc)) - else if hd rn = Oc then - (\n. ln = replicate (x - n) Oc - & rn = Oc # (Oc # replicate n Bk @ replicate n Oc) - & n > 0 & n <= x) - else False)" - + "tcopy_F5 x (l, r) = (tcopy_F5_loop x (l, r) \ tcopy_F5_exit x (l, r))" fun tcopy_F6 :: "nat \ tape \ bool" where - "tcopy_F6 0 tp = False" | - "tcopy_F6 (Suc x) (ln, rn) = - (\n. ln = replicate (Suc x -n) Oc - & tl rn = replicate n Bk @ replicate n Oc - & n > 0 & n <= x)" - + "tcopy_F6 x (l, r) = + (\ i j any. i + j = x \ x > 0 \ i > 0 \ j > 0 \ l = Oc\<^bsup>i\<^esup> \ r = any#Bk\<^bsup>j\<^esup> @ Oc\<^bsup>j\<^esup>)" + fun tcopy_F7 :: "nat \ tape \ bool" where - "tcopy_F7 0 tp = False" | - "tcopy_F7 (Suc x) (ln, rn) = - (let lrn = (rev ln) @ rn in - (\n. lrn = replicate ((Suc x) - n) Oc @ - replicate (Suc n) Bk @ replicate n Oc - & n > 0 & n <= x & - length rn >= n & length rn <= 2 * n ))" - + "tcopy_F7 x (l, r) = + (\ i j k t. i + j = x \ i > 0 \ j > 0 \ k + t = Suc j \ l = Bk\<^bsup>k\<^esup> @ Oc\<^bsup>i\<^esup> \ r = Bk\<^bsup>t\<^esup> @ Oc\<^bsup>j\<^esup>)" + fun tcopy_F8 :: "nat \ tape \ bool" where - "tcopy_F8 0 tp = False" | - "tcopy_F8 (Suc x) (ln, rn) = - (let lrn = (rev ln) @ rn in - (\n. lrn = replicate ((Suc x) - n) Oc @ - replicate (Suc n) Bk @ replicate n Oc - & n > 0 & n <= x & length rn < n)) " + "tcopy_F8 x (l, r) = + (\ i j k t. i + j = x \ i > 0 \ j > 0 \ k + t = j \ l = Oc\<^bsup>k\<^esup> @ Bk\<^bsup>Suc j\<^esup> @ Oc\<^bsup>i\<^esup> \ r = Oc\<^bsup>t\<^esup>)" + +fun tcopy_F9_loop :: "nat \ tape \ bool" +where + "tcopy_F9_loop x (l, r) = + (\ i j k t. i + j = Suc x \ i > 0 \ j > 0 \ k + t = j \ t > 0\ l = Oc\<^bsup>k\<^esup> @ Bk\<^bsup>j\<^esup> @ Oc\<^bsup>i\<^esup> \ r = Oc\<^bsup>t\<^esup>)" + +fun tcopy_F9_exit :: "nat \ tape \ bool" + where + "tcopy_F9_exit x (l, r) = (\ i j. i + j = Suc x \ i > 0 \ j > 0 \ l = Bk\<^bsup>j - 1\<^esup> @ Oc\<^bsup>i\<^esup> \ r = Bk # Oc\<^bsup>j\<^esup>)" fun tcopy_F9 :: "nat \ tape \ bool" where - "tcopy_F9 0 tp = False" | - "tcopy_F9 (Suc x) (ln, rn) = - (let lrn = (rev ln) @ rn in - (\n. lrn = replicate (Suc (Suc x) - n) Oc - @ replicate n Bk @ replicate n Oc - & n > Suc 0 & n <= Suc x & length rn > 0 - & length rn <= Suc n))" + "tcopy_F9 x (l, r) = (tcopy_F9_loop x (l, r) \ + tcopy_F9_exit x (l, r))" + +fun tcopy_F10_loop :: "nat \ tape \ bool" + where + "tcopy_F10_loop x (l, r) = + (\ i j k t. i + j = Suc x \ i > 0 \ k + t + 1 = j \ l = Bk\<^bsup>k\<^esup> @ Oc\<^bsup>i\<^esup> \ r = Bk\<^bsup>Suc t\<^esup> @ Oc\<^bsup>j\<^esup>)" + +fun tcopy_F10_exit :: "nat \ tape \ bool" + where + "tcopy_F10_exit x (l, r) = + (\ i j. i + j = x \ j > 0 \ l = Oc\<^bsup>i\<^esup> \ r = Oc # Bk\<^bsup>j\<^esup> @ Oc\<^bsup>j\<^esup>)" fun tcopy_F10 :: "nat \ tape \ bool" where - "tcopy_F10 0 tp = False" | - "tcopy_F10 (Suc x) (ln, rn) = - (let lrn = (rev ln) @ rn in - (\n. lrn = replicate (Suc (Suc x) - n) Oc - @ replicate n Bk @ replicate n Oc & n > Suc 0 - & n <= Suc x & length rn > Suc n & - length rn <= 2*n + 1 ))" + "tcopy_F10 x (l, r) = (tcopy_F10_loop x (l, r) \ tcopy_F10_exit x (l, r))" fun tcopy_F11 :: "nat \ tape \ bool" where - "tcopy_F11 0 tp = False" | - "tcopy_F11 (Suc x) (ln, rn) = - (ln = [Bk] & rn = Oc # replicate (Suc x) Bk - @ replicate (Suc x) Oc)" + "tcopy_F11 x (l, r) = (x > 0 \ l = [Bk] \ r = Oc # Bk\<^bsup>x\<^esup> @ Oc\<^bsup>x\<^esup>)" fun tcopy_F12 :: "nat \ tape \ bool" where - "tcopy_F12 0 tp = False" | - "tcopy_F12 (Suc x) (ln, rn) = - (let lrn = ((rev ln) @ rn) in - (\n. n > 0 & n <= Suc (Suc x) - & lrn = Bk # replicate n Oc @ replicate (Suc (Suc x) - n) Bk - @ replicate (Suc x) Oc - & length ln = Suc n))" + "tcopy_F12 x (l, r) = (\ i j. i + j = Suc x \ x > 0 \ l = Oc\<^bsup>i\<^esup> @ [Bk] \ r = Bk\<^bsup>j\<^esup> @ Oc\<^bsup>x\<^esup>)" fun tcopy_F13 :: "nat \ tape \ bool" where - "tcopy_F13 0 tp = False" | - "tcopy_F13 (Suc x) (ln, rn) = - (let lrn = ((rev ln) @ rn) in - (\n. n > Suc 0 & n <= Suc (Suc x) - & lrn = Bk # replicate n Oc @ replicate (Suc (Suc x) - n) Bk - @ replicate (Suc x) Oc - & length ln = n))" - + "tcopy_F13 x (l, r) = + (\ i j. x > 0 \ i + j = x \ l = Oc\<^bsup>i\<^esup> @ [Bk] \ r = Oc # Bk\<^bsup>j\<^esup> @ Oc\<^bsup>x\<^esup> )" + fun tcopy_F14 :: "nat \ tape \ bool" where - "tcopy_F14 0 tp = False" | - "tcopy_F14 (Suc x) (ln, rn) = - (ln = replicate (Suc x) Oc @ [Bk] & - tl rn = replicate (Suc x) Oc)" + "tcopy_F14 x (l, r) = (\ any. x > 0 \ l = Oc\<^bsup>x\<^esup> @ [Bk] \ r = any#Oc\<^bsup>x\<^esup>)" + +fun tcopy_F15_loop :: "nat \ tape \ bool" + where + "tcopy_F15_loop x (l, r) = + (\ i j. i + j = x \ x > 0 \ j > 0 \ l = Oc\<^bsup>i\<^esup> @ [Bk] \ r = Oc\<^bsup>j\<^esup> @ Bk # Oc\<^bsup>x\<^esup>)" + +fun tcopy_F15_exit :: "nat \ tape \ bool" + where + "tcopy_F15_exit x (l, r) = (x > 0 \ l = [] \ r = Bk # Oc\<^bsup>x\<^esup> @ Bk # Oc\<^bsup>x\<^esup>)" fun tcopy_F15 :: "nat \ tape \ bool" where - "tcopy_F15 0 tp = False" | - "tcopy_F15 (Suc x) (ln, rn) = - (let lrn = ((rev ln) @ rn) in - lrn = Bk # replicate (Suc x) Oc @ [Bk] @ - replicate (Suc x) Oc & length ln <= (Suc x))" + "tcopy_F15 x (l, r) = (tcopy_F15_loop x (l, r) \ tcopy_F15_exit x (l, r))" text {* The following @{text "inv_tcopy"} is the invariant of the {\em Copying} TM. @@ -208,17 +182,12 @@ tcopy_F14.simps [simp del] tcopy_F15.simps [simp del] -lemma list_replicate_Bk[dest]: "list_all isBk list \ - list = replicate (length list) Bk" -apply(induct list) -apply(simp+) +lemma exp_zero_simp: "(a\<^bsup>b\<^esup> = []) = (b = 0)" +apply(auto simp: exponent_def) done -lemma [simp]: "dropWhile (\ a. a = b) (replicate x b @ ys) = - dropWhile (\ a. a = b) ys" -apply(induct x) -apply(simp) -apply(simp) +lemma exp_zero_simp2: "([] = a\<^bsup>b\<^esup> ) = (b = 0)" +apply(auto simp: exponent_def) done lemma [elim]: "\tstep (0, a, b) tcopy = (s, l, r); s \ 0\ \ RR" @@ -300,6 +269,7 @@ by(simp add: tstep.simps tcopy_def fetch.simps split: block.splits list.splits) +(* lemma min_Suc4: "min (Suc (Suc x)) x = x" by auto @@ -330,22 +300,26 @@ replicate n b @ b # xs" apply(simp) done - +*) lemma [elim]: "\tstep (14, b, c) tcopy = (15, ab, ba); tcopy_F14 x (b, c)\ \ tcopy_F15 x (ab, ba)" -apply(case_tac x) apply(auto simp: tstep.simps tcopy_def tcopy_F14.simps tcopy_F15.simps fetch.simps new_tape.simps split: if_splits list.splits block.splits) +apply(erule_tac [!] x = "x - 1" in allE) +apply(case_tac [!] x, simp_all add: exp_ind_def exp_zero) +apply(erule_tac [!] x = "Suc 0" in allE, simp_all) done +(* lemma dropWhile_drophd: "\ p a \ (dropWhile p xs @ (a # as)) = (dropWhile p (xs @ [a]) @ as)" apply(induct xs) apply(auto) done - +*) +(* lemma dropWhile_append3: "\\ p a; listall ((dropWhile p xs) @ [a]) isBk\ \ listall (dropWhile p (xs @ [a])) isBk" @@ -364,495 +338,341 @@ apply(induct xs) apply(simp+) done +*) +lemma false_case1: + "\Oc\<^bsup>j\<^esup> @ Bk # Oc\<^bsup>i + j\<^esup> = Oc # list; + 0 < i; + \ia. tl (Oc\<^bsup>i\<^esup> @ [Bk]) = Oc\<^bsup>ia\<^esup> @ [Bk] \ (\ja. ia + ja = i + j + \ hd (Oc\<^bsup>i\<^esup> @ [Bk]) # Oc # list \ Oc\<^bsup>ja\<^esup> @ Bk # Oc\<^bsup>i + j\<^esup>)\ + \ RR" +apply(case_tac i, auto simp: exp_ind_def) +apply(erule_tac x = nat in allE, simp add:exp_ind_def) +apply(erule_tac x = "Suc j" in allE, simp) +done + +lemma false_case3:"\ja. ja \ i \ RR" +by auto lemma [elim]: "\tstep (15, b, c) tcopy = (15, ab, ba); - tcopy_F15 x (b, c)\ \ tcopy_F15 x (ab, ba)" -apply(case_tac x) + tcopy_F15 x (b, c)\ \ tcopy_F15 x (ab, ba)" apply(auto simp: tstep.simps tcopy_F15.simps tcopy_def fetch.simps new_tape.simps - split: if_splits list.splits block.splits) -apply(case_tac b, simp+) + split: if_splits list.splits block.splits elim: false_case1) +apply(case_tac [!] i, simp_all add: exp_zero exp_ind_def) +apply(erule_tac [!] x = nat in allE, simp_all add: exp_ind_def) +apply(auto elim: false_case3) done lemma [elim]: "\tstep (14, b, c) tcopy = (14, ab, ba); tcopy_F14 x (b, c)\ \ tcopy_F14 x (ab, ba)" -apply(case_tac x) apply(auto simp: tcopy_F14.simps tcopy_def tstep.simps tcopy_F14.simps fetch.simps new_tape.simps split: if_splits list.splits block.splits) done -lemma [intro]: "list_all isBk (replicate x Bk)" -apply(induct x, simp+) -done - -lemma [elim]: "list_all isBk (dropWhile (\a. a = Oc) b) \ - list_all isBk (dropWhile (\a. a = Oc) (tl b))" -apply(case_tac b, auto split: if_splits) -apply(drule list_replicate_Bk) -apply(case_tac "length list", auto) -done - -lemma [elim]: "list_all (\ a. a = Oc) list \ - list = replicate (length list) Oc" -apply(induct list) -apply(simp+) -done - -lemma append_length: "\as @ bs = cs @ ds; length bs = length ds\ - \ as = cs & bs = ds" -apply(auto) -done - -lemma Suc_elim: "Suc (Suc m) - n = Suc na \ Suc m - n = na" -apply(simp) -done - -lemma [elim]: "\0 < n; n \ Suc (Suc na); - rev b @ Oc # list = - Bk # replicate n Oc @ replicate (Suc (Suc na) - n) Bk @ - Oc # replicate na Oc; - length b = Suc n; b \ []\ - \ list_all isBk (dropWhile (\a. a = Oc) (tl b))" -apply(case_tac "rev b", auto) -done - -lemma b_cons_same: "b#bs = replicate x a @ as \ a \ b \ x = 0" -apply(case_tac x, simp+) -done - -lemma tcopy_tmp[elim]: - "\0 < n; n \ Suc (Suc na); - rev b @ Oc # list = - Bk # replicate n Oc @ replicate (Suc (Suc na) - n) Bk - @ Oc # replicate na Oc; length b = Suc n; b \ []\ - \ list = replicate na Oc" -apply(case_tac "rev b", simp+) -apply(auto) -apply(frule b_cons_same, auto) -done lemma [elim]: "\tstep (12, b, c) tcopy = (14, ab, ba); tcopy_F12 x (b, c)\ \ tcopy_F14 x (ab, ba)" -apply(case_tac x) apply(auto simp:tcopy_F12.simps tcopy_F14.simps tcopy_def tstep.simps fetch.simps new_tape.simps split: if_splits list.splits block.splits) -apply(frule tcopy_tmp, simp+) -apply(case_tac n, simp+) -apply(case_tac nata, simp+) -done - -lemma replicate_app_Cons: "replicate a b @ b # replicate c b - = replicate (Suc (a + c)) b" -apply(simp) -apply(simp add: replicate_app_Cons_same) -apply(simp only: replicate_add[THEN sym]) -done - -lemma replicate_same_exE_pref: "\x. bs @ (b # cs) = replicate x y - \ (\n. bs = replicate n y)" -apply(induct bs) -apply(rule_tac x = 0 in exI, simp) -apply(drule impI) -apply(erule impE) -apply(erule exE, simp+) -apply(case_tac x, auto) -apply(case_tac x, auto) -apply(rule_tac x = "Suc n" in exI, simp+) -done - -lemma replicate_same_exE_inf: "\x. bs @ (b # cs) = replicate x y \ b = y" -apply(induct bs, auto) -apply(case_tac x, auto) -apply(drule impI) -apply(erule impE) -apply(case_tac x, simp+) -done - -lemma replicate_same_exE_suf: - "\x. bs @ (b # cs) = replicate x y \ \n. cs = replicate n y" -apply(induct bs, auto) -apply(case_tac x, simp+) -apply(drule impI, erule impE) -apply(case_tac x, simp+) -done - -lemma replicate_same_exE: "\x. bs @ (b # cs) = replicate x y - \ (\n. bs = replicate n y) & (b = y) & (\m. cs = replicate m y)" -apply(rule conjI) -apply(drule replicate_same_exE_pref, simp) -apply(rule conjI) -apply(drule replicate_same_exE_inf, simp) -apply(drule replicate_same_exE_suf, simp) -done - -lemma replicate_same: "bs @ (b # cs) = replicate x y - \ (\n. bs = replicate n y) & (b = y) & (\m. cs = replicate m y)" -apply(rule_tac replicate_same_exE) -apply(rule_tac x = x in exI) -apply(assumption) -done - -lemma [elim]: "\ 0 < n; n \ Suc (Suc na); - (rev ab @ Bk # list) = Bk # replicate n Oc - @ replicate (Suc (Suc na) - n) Bk @ Oc # replicate na Oc; ab \ []\ - \ n \ Suc na" -apply(rule contrapos_pp, simp+) -apply(case_tac "rev ab", simp+) -apply(auto) -apply(simp only: replicate_app_Cons) -apply(drule replicate_same) -apply(auto) -done - - -lemma [elim]: "\0 < n; n \ Suc (Suc na); - rev ab @ Bk # list = Bk # replicate n Oc @ - replicate (Suc (Suc na) - n) Bk @ Oc # replicate na Oc; - length ab = Suc n; ab \ []\ - \ rev ab @ Oc # list = Bk # Oc # replicate n Oc @ - replicate (Suc na - n) Bk @ Oc # replicate na Oc" -apply(case_tac "rev ab", simp+) -apply(auto) -apply(simp only: replicate_Cons_simp) -apply(simp) -apply(case_tac "Suc (Suc na) - n", simp+) +apply(case_tac [!] j, simp_all add: exp_zero exp_ind_def) done lemma [elim]: "\tstep (12, b, c) tcopy = (13, ab, ba); tcopy_F12 x (b, c)\ \ tcopy_F13 x (ab, ba)" -apply(case_tac x) -apply(simp_all add:tcopy_F12.simps tcopy_F13.simps - tcopy_def tstep.simps fetch.simps new_tape.simps) -apply(simp split: if_splits list.splits block.splits) -apply(auto) +apply(auto simp:tcopy_F12.simps tcopy_F13.simps + tcopy_def tstep.simps fetch.simps new_tape.simps + split: if_splits list.splits block.splits) +apply(case_tac x, simp_all add: exp_ind_def exp_zero) +apply(rule_tac [!] x = i in exI, simp_all) +apply(rule_tac [!] x = "j - 1" in exI) +apply(case_tac [!] j, simp_all add: exp_ind_def exp_zero) +apply(case_tac x, simp_all add: exp_ind_def exp_zero) done - lemma [elim]: "\tstep (11, b, c) tcopy = (12, ab, ba); tcopy_F11 x (b, c)\ \ tcopy_F12 x (ab, ba)" -apply(case_tac x) apply(simp_all add:tcopy_F12.simps tcopy_F11.simps tcopy_def tstep.simps fetch.simps new_tape.simps) apply(auto) +apply(rule_tac x = "Suc 0" in exI, + rule_tac x = x in exI, simp add: exp_ind_def exp_zero) done -lemma equal_length: "a = b \ length a = length b" -by(simp) lemma [elim]: "\tstep (13, b, c) tcopy = (12, ab, ba); tcopy_F13 x (b, c)\ \ tcopy_F12 x (ab, ba)" -apply(case_tac x) -apply(simp_all add:tcopy_F12.simps tcopy_F13.simps - tcopy_def tstep.simps fetch.simps new_tape.simps) -apply(simp split: if_splits list.splits block.splits) -apply(auto) -apply(drule equal_length, simp) +apply(auto simp:tcopy_F12.simps tcopy_F13.simps + tcopy_def tstep.simps fetch.simps new_tape.simps + split: if_splits list.splits block.splits) +apply(rule_tac [!] x = "Suc i" in exI, simp_all add: exp_ind_def) done lemma [elim]: "\tstep (5, b, c) tcopy = (11, ab, ba); - tcopy_F5 x (b, c)\ \ tcopy_F11 x (ab, ba)" -apply(case_tac x) + tcopy_F5 x (b, c)\ \ tcopy_F11 x (ab, ba)" apply(simp_all add:tcopy_F11.simps tcopy_F5.simps tcopy_def tstep.simps fetch.simps new_tape.simps) apply(simp split: if_splits list.splits block.splits) done -lemma less_equal: "\length xs <= b; \ Suc (length xs) <= b\ \ - length xs = b" -apply(simp) +lemma F10_false: "tcopy_F10 x (b, []) = False" +apply(auto simp: tcopy_F10.simps exp_ind_def) done -lemma length_cons_same: "\xs @ b # ys = as @ bs; - length ys = length bs\ \ xs @ [b] = as & ys = bs" -apply(drule rev_equal) -apply(simp) -apply(auto) -apply(drule rev_equal, simp) +lemma F10_false2: "tcopy_F10 x ([], Bk # list) = False" +apply(auto simp:tcopy_F10.simps) +apply(case_tac i, simp_all add: exp_ind_def exp_zero) +done + +lemma [simp]: "tcopy_F10_exit x (b, Bk # list) = False" +apply(auto simp: tcopy_F10.simps) done -lemma replicate_set_equal: "\ xs @ [a] = replicate n b; a \ b\ \ RR" -apply(drule rev_equal, simp) -apply(case_tac n, simp+) +declare tcopy_F10_loop.simps[simp del] tcopy_F10_exit.simps[simp del] + +lemma [simp]: "tcopy_F10_loop x (b, [Bk]) = False" +apply(auto simp: tcopy_F10_loop.simps) +apply(simp add: exp_ind_def) done lemma [elim]: "\tstep (10, b, c) tcopy = (10, ab, ba); tcopy_F10 x (b, c)\ \ tcopy_F10 x (ab, ba)" -apply(case_tac x) -apply(auto simp:tcopy_F10.simps tcopy_def tstep.simps fetch.simps - new_tape.simps +apply(simp add: tcopy_def tstep.simps fetch.simps + new_tape.simps exp_ind_def exp_zero_simp exp_zero_simp2 F10_false F10_false2 split: if_splits list.splits block.splits) -apply(rule_tac x = n in exI, auto) -apply(case_tac b, simp+) -apply(rule contrapos_pp, simp+) -apply(frule less_equal, simp+) -apply(drule length_cons_same, auto) -apply(drule replicate_set_equal, simp+) +apply(simp add: tcopy_F10.simps del: tcopy_F10_loop.simps tcopy_F10_exit.simps) +apply(case_tac b, simp, case_tac aa) +apply(rule_tac disjI1) +apply(simp only: tcopy_F10_loop.simps) +apply(erule_tac exE)+ +apply(rule_tac x = i in exI, rule_tac x = j in exI, + rule_tac x = "k - 1" in exI, rule_tac x = "Suc t" in exI, simp) +apply(case_tac k, simp_all add: exp_ind_def exp_zero) +apply(case_tac i, simp_all add: exp_ind_def exp_zero) +apply(rule_tac disjI2) +apply(simp only: tcopy_F10_loop.simps tcopy_F10_exit.simps) +apply(erule_tac exE)+ +apply(rule_tac x = "i - 1" in exI, rule_tac x = "j" in exI) +apply(case_tac k, simp_all add: exp_ind_def exp_zero) +apply(case_tac i, simp_all add: exp_ind_def exp_zero) +apply(auto) +apply(simp add: exp_ind_def) done -lemma less_equal2: "\ (n::nat) \ m \ \x. n = x + m & x > 0" -apply(rule_tac x = "n - m" in exI) -apply(auto) +(* +lemma false_case4: "\i + (k + t) = Suc x; + 0 < i; + Bk # list = Oc\<^bsup>t\<^esup>; + \ia j. ia + j = Suc x \ ia = 0 \ (\ka. tl (Oc\<^bsup>k\<^esup>) @ Bk\<^bsup>k + t\<^esup> @ Oc\<^bsup>i\<^esup> = Bk\<^bsup>ka\<^esup> @ Oc\<^bsup>ia\<^esup> \ (\ta. Suc (ka + ta) = j \ Oc # Oc\<^bsup>t\<^esup> \ Bk\<^bsup>Suc ta\<^esup> @ Oc\<^bsup>j\<^esup>)); + 0 < k\ + \ RR" +apply(case_tac t, simp_all add: exp_ind_def exp_zero) +done + +lemma false_case5: " + \Suc (i + nata) = x; + 0 < i; + \ia j. ia + j = Suc x \ ia = 0 \ (\k. Bk\<^bsup>nata\<^esup> @ Oc\<^bsup>i\<^esup> = Bk\<^bsup>k\<^esup> @ Oc\<^bsup>ia\<^esup> \ (\t. Suc (k + t) = j \ Bk # Oc # Oc # Oc\<^bsup>nata\<^esup> \ Bk\<^bsup>t\<^esup> @ Oc\<^bsup>j\<^esup>))\ + \ False" +apply(erule_tac x = i in allE, simp) +apply(erule_tac x = "Suc (Suc nata)" in allE, simp) +apply(erule_tac x = nata in allE, simp, simp add: exp_ind_def exp_zero) +done + +lemma false_case6: "\0 < x; \i. tl (Oc\<^bsup>x\<^esup>) = Oc\<^bsup>i\<^esup> \ (\j. i + j = x \ j = 0 \ [Bk, Oc] \ Bk\<^bsup>j\<^esup> @ Oc\<^bsup>j\<^esup>)\ + \ False" +apply(erule_tac x = "x - 1" in allE) +apply(case_tac x, simp_all add: exp_ind_def exp_zero) +apply(erule_tac x = "Suc 0" in allE, simp) +done +*) + +lemma [simp]: "tcopy_F9 x ([], b) = False" +apply(auto simp: tcopy_F9.simps) +apply(case_tac [!] i, simp_all add: exp_ind_def exp_zero) done -lemma replicate_tail_length[dest]: - "\rev b @ Bk # list = xs @ replicate n Bk @ replicate n Oc\ - \ length list >= n" -apply(rule contrapos_pp, simp+) -apply(drule less_equal2, auto) -apply(drule rev_equal) -apply(simp add: replicate_add) -apply(auto) -apply(case_tac x, simp+) +lemma [simp]: "tcopy_F9 x (b, []) = False" +apply(auto simp: tcopy_F9.simps) +apply(case_tac [!] t, simp_all add: exp_ind_def exp_zero) +done + +declare tcopy_F9_loop.simps[simp del] tcopy_F9_exit.simps[simp del] +lemma [simp]: "tcopy_F9_loop x (b, Bk # list) = False" +apply(auto simp: tcopy_F9_loop.simps) +apply(case_tac [!] t, simp_all add: exp_ind_def exp_zero) done +lemma [elim]: "\tstep (9, b, c) tcopy = (10, ab, ba); + tcopy_F9 x (b, c)\ \ tcopy_F10 x (ab, ba)" +apply(auto simp:tcopy_def + tstep.simps fetch.simps new_tape.simps exp_zero_simp + exp_zero_simp2 + split: if_splits list.splits block.splits) +apply(case_tac "hd b", simp add:tcopy_F9.simps tcopy_F10.simps ) +apply(simp only: tcopy_F9_exit.simps tcopy_F10_loop.simps) +apply(erule_tac exE)+ +apply(rule_tac x = i in exI, rule_tac x = j in exI, simp) +apply(rule_tac x = "j - 2" in exI, simp add: exp_ind_def) +apply(case_tac j, simp, simp) +apply(case_tac nat, simp_all add: exp_zero exp_ind_def) +apply(case_tac x, simp_all add: exp_ind_def exp_zero) +apply(simp add: tcopy_F9.simps tcopy_F10.simps) +apply(rule_tac disjI2) +apply(simp only: tcopy_F10_exit.simps tcopy_F9_exit.simps) +apply(erule_tac exE)+ +apply(simp) +apply(case_tac j, simp_all, case_tac nat, simp_all add: exp_ind_def exp_zero) +apply(case_tac x, simp_all add: exp_ind_def exp_zero) +apply(rule_tac x = nata in exI, rule_tac x = 1 in exI, simp add: exp_ind_def exp_zero) +done -lemma [elim]: "\tstep (9, b, c) tcopy = (10, ab, ba); - tcopy_F9 x (b, c)\ \ tcopy_F10 x (ab, ba)" -apply(case_tac x) -apply(auto simp:tcopy_F10.simps tcopy_F9.simps tcopy_def - tstep.simps fetch.simps new_tape.simps - split: if_splits list.splits block.splits) -apply(rule_tac x = n in exI, auto) -apply(case_tac b, simp+) +lemma false_case7: + "\i + (n + t) = x; 0 < i; 0 < t; Oc # list = Oc\<^bsup>t\<^esup>; k = Suc n; + \j. i + j = Suc x \ (\k. Oc\<^bsup>n\<^esup> @ Bk # Bk\<^bsup>n + t\<^esup> = Oc\<^bsup>k\<^esup> @ Bk\<^bsup>j\<^esup> \ + (\ta. k + ta = j \ ta = 0 \ Oc # Oc\<^bsup>t\<^esup> \ Oc\<^bsup>ta\<^esup>))\ + \ RR" +apply(erule_tac x = "k + t" in allE, simp) +apply(erule_tac x = n in allE, simp add: exp_ind_def) +apply(erule_tac x = "Suc t" in allE, simp) +done + +lemma false_case8: + "\i + t = Suc x; + 0 < i; + 0 < t; + \ia j. tl (Bk\<^bsup>t\<^esup> @ Oc\<^bsup>i\<^esup>) = Bk\<^bsup>j - Suc 0\<^esup> @ Oc\<^bsup>ia\<^esup> \ + ia + j = Suc x \ ia = 0 \ j = 0 \ Oc\<^bsup>t\<^esup> \ Oc\<^bsup>j\<^esup>\ \ + RR" +apply(erule_tac x = i in allE, simp) +apply(erule_tac x = t in allE, simp) +apply(case_tac t, simp_all add: exp_ind_def exp_zero) done lemma [elim]: "\tstep (9, b, c) tcopy = (9, ab, ba); tcopy_F9 x (b, c)\ \ tcopy_F9 x (ab, ba)" -apply(case_tac x) -apply(simp_all add: tcopy_F9.simps tcopy_def - tstep.simps fetch.simps new_tape.simps +apply(auto simp: tcopy_F9.simps tcopy_def + tstep.simps fetch.simps new_tape.simps exp_zero_simp exp_zero_simp2 + tcopy_F9_exit.simps tcopy_F9_loop.simps split: if_splits list.splits block.splits) -apply(rule_tac x = n in exI, auto) -apply(case_tac b, simp+) -apply(rule contrapos_pp, simp+) -apply(drule less_equal, simp+) -apply(drule rev_equal, auto) -apply(case_tac "length list", simp+) +apply(case_tac [!] k, simp_all add: exp_ind_def exp_zero) +apply(erule_tac [!] x = i in allE, simp) +apply(erule_tac false_case7, simp_all)+ +apply(case_tac t, simp_all add: exp_zero exp_ind_def) +apply(erule_tac false_case7, simp_all)+ +apply(erule_tac false_case8, simp_all) +apply(erule_tac false_case7, simp_all)+ +apply(case_tac t, simp_all add: exp_ind_def exp_zero) +apply(erule_tac false_case7, simp_all) +apply(erule_tac false_case8, simp_all) +apply(erule_tac false_case7, simp_all) +done + +lemma [elim]: "\tstep (8, b, c) tcopy = (9, ab, ba); + tcopy_F8 x (b, c)\ \ tcopy_F9 x (ab, ba)" +apply(auto simp:tcopy_F8.simps tcopy_F9.simps tcopy_def + tstep.simps fetch.simps new_tape.simps tcopy_F9_loop.simps + tcopy_F9_exit.simps + split: if_splits list.splits block.splits) +apply(case_tac [!] t, simp_all add: exp_ind_def exp_zero) +apply(rule_tac x = i in exI) +apply(rule_tac x = "Suc k" in exI, simp) +apply(rule_tac x = "k" in exI, simp add: exp_ind_def exp_zero) done -lemma app_cons_app_simp: "xs @ a # bs @ ys = (xs @ [a]) @ bs @ ys" -apply(simp) -done - -lemma [elim]: "\tstep (8, b, c) tcopy = (9, ab, ba); - tcopy_F8 x (b, c)\ \ tcopy_F9 x (ab, ba)" -apply(case_tac x) -apply(auto simp:tcopy_F8.simps tcopy_F9.simps tcopy_def - tstep.simps fetch.simps new_tape.simps - split: if_splits list.splits block.splits) -apply(rule_tac x = "Suc n" in exI, auto) -apply(rule_tac x = "n" in exI, auto) -apply(simp only: app_cons_app_simp) -apply(frule replicate_tail_length, simp) -done lemma [elim]: "\tstep (8, b, c) tcopy = (8, ab, ba); tcopy_F8 x (b, c)\ \ tcopy_F8 x (ab, ba)" -apply(case_tac x) -apply(simp_all add:tcopy_F8.simps tcopy_def tstep.simps - fetch.simps new_tape.simps) -apply(simp split: if_splits list.splits block.splits) -apply(rule_tac x = "n" in exI, auto) -done - -lemma ex_less_more: "\(x::nat) >= m ; x <= n\ \ - \y. x = m + y & y <= n - m" -by(rule_tac x = "x -m" in exI, auto) - -lemma replicate_split: "x <= n \ - (\y. replicate n b = replicate (y + x) b)" -apply(rule_tac x = "n - x" in exI) -apply(simp) -done - -lemma app_app_app_app_simp: "as @ bs @ cs @ ds = - (as @ bs) @ (cs @ ds)" -by simp - -lemma lengthtailsame_append_elim: - "\as @ bs = cs @ ds; length bs = length ds\ \ bs = ds" -apply(simp) +apply(auto simp:tcopy_F8.simps tcopy_def tstep.simps + fetch.simps new_tape.simps exp_zero_simp exp_zero split: if_splits list.splits + + block.splits) +apply(rule_tac x = i in exI, rule_tac x = "k + t" in exI, simp) +apply(rule_tac x = "Suc k" in exI, simp) +apply(rule_tac x = "t - 1" in exI, simp) +apply(case_tac t, simp_all add: exp_zero exp_ind_def) done -lemma rep_suc: "replicate (Suc n) x = replicate n x @ [x]" -by(induct n, auto) - -lemma length_append_diff_cons: - "\b @ x # ba = xs @ replicate m y @ replicate n x; x \ y; - Suc (length ba) \ m + n\ - \ length ba < n" -apply(induct n arbitrary: ba, simp) -apply(drule_tac b = y in replicate_split, - simp add: replicate_add, erule exE, simp del: replicate.simps) -proof - - fix ba ya - assume h1: - "b @ x # ba = xs @ y # replicate ya y @ replicate (length ba) y" - and h2: "x \ y" - thus "False" - using append_eq_append_conv[of "b @ [x]" - "xs @ y # replicate ya y" "ba" "replicate (length ba) y"] - apply(auto) - apply(case_tac ya, simp, - simp add: rep_suc del: rep_suc_rev replicate.simps) - done -next - fix n ba - assume ind: "\ba. \b @ x # ba = xs @ replicate m y @ replicate n x; - x \ y; Suc (length ba) \ m + n\ - \ length ba < n" - and h1: "b @ x # ba = xs @ replicate m y @ replicate (Suc n) x" - and h2: "x \ y" and h3: "Suc (length ba) \ m + Suc n" - show "length ba < Suc n" - proof(cases "length ba") - case 0 thus "?thesis" by simp - next - fix nat - assume "length ba = Suc nat" - hence "\ ys a. ba = ys @ [a]" - apply(rule_tac x = "butlast ba" in exI) - apply(rule_tac x = "last ba" in exI) - using append_butlast_last_id[of ba] - apply(case_tac ba, auto) - done - from this obtain ys where "\ a. ba = ys @ [a]" .. - from this obtain a where "ba = ys @ [a]" .. - thus "?thesis" - using ind[of ys] h1 h2 h3 - apply(simp del: rep_suc_rev replicate.simps add: rep_suc) - done - qed -qed - -lemma [elim]: - "\b @ Oc # ba = xs @ Bk # replicate n Bk @ replicate n Oc; - Suc (length ba) \ 2 * n\ - \ length ba < n" - apply(rule_tac length_append_diff_cons[of b Oc ba xs "Suc n" Bk n]) - apply(simp, simp, simp) - done - -lemma [elim]: "\tstep (7, b, c) tcopy = (8, ab, ba); - tcopy_F7 x (b, c)\ \ tcopy_F8 x (ab, ba)" -apply(case_tac x) -apply(simp_all add:tcopy_F8.simps tcopy_F7.simps - tcopy_def tstep.simps fetch.simps new_tape.simps) -apply(simp split: if_splits list.splits block.splits) -apply(rule_tac x = "n" in exI, auto) -done lemma [elim]: "\tstep (7, b, c) tcopy = (7, ab, ba); tcopy_F7 x (b, c)\ \ tcopy_F7 x (ab, ba)" -apply(case_tac x) -apply(auto simp:tcopy_F7.simps tcopy_def tstep.simps - fetch.simps new_tape.simps - split: if_splits list.splits block.splits) -apply(rule_tac x = "n" in exI, auto) -apply(simp only: app_cons_app_simp) -apply(frule replicate_tail_length, simp) +apply(auto simp:tcopy_F7.simps tcopy_def tstep.simps fetch.simps + new_tape.simps exp_ind_def exp_zero_simp + split: if_splits list.splits block.splits) +apply(rule_tac x = i in exI) +apply(rule_tac x = j in exI, simp) +apply(rule_tac x = "Suc k" in exI, simp) +apply(rule_tac x = "t - 1" in exI) +apply(case_tac t, simp_all add: exp_zero exp_ind_def) +apply(case_tac j, simp_all add: exp_zero exp_ind_def) done -lemma Suc_more: "n <= m \ Suc m - n = Suc (m - n)" -by simp +lemma [elim]: "\tstep (7, b, c) tcopy = (8, ab, ba); + tcopy_F7 x (b, c)\ \ tcopy_F8 x (ab, ba)" +apply(auto simp:tcopy_F7.simps tcopy_def tstep.simps tcopy_F8.simps + fetch.simps new_tape.simps exp_zero_simp + split: if_splits list.splits block.splits) +apply(rule_tac x = i in exI, simp) +apply(rule_tac x = "Suc 0" in exI, simp add: exp_ind_def exp_zero) +apply(rule_tac x = "j - 1" in exI, simp) +apply(case_tac t, simp_all add: exp_ind_def ) +apply(case_tac j, simp_all add: exp_ind_def exp_zero) +done lemma [elim]: "\tstep (6, b, c) tcopy = (7, ab, ba); tcopy_F6 x (b, c)\ \ tcopy_F7 x (ab, ba)" apply(case_tac x) apply(auto simp:tcopy_F7.simps tcopy_F6.simps - tcopy_def tstep.simps fetch.simps new_tape.simps + tcopy_def tstep.simps fetch.simps new_tape.simps exp_zero_simp split: if_splits list.splits block.splits) +apply(case_tac i, simp_all add: exp_ind_def exp_zero) +apply(rule_tac x = i in exI, simp) +apply(rule_tac x = j in exI, simp) +apply(rule_tac x = "Suc 0" in exI, simp add: exp_ind_def exp_zero) done lemma [elim]: "\tstep (6, b, c) tcopy = (6, ab, ba); tcopy_F6 x (b, c)\ \ tcopy_F6 x (ab, ba)" -apply(case_tac x) apply(auto simp:tcopy_F6.simps tcopy_def tstep.simps new_tape.simps fetch.simps split: if_splits list.splits block.splits) done lemma [elim]: "\tstep (5, b, c) tcopy = (6, ab, ba); - tcopy_F5 x (b, c)\ \ tcopy_F6 x (ab, ba)" -apply(case_tac x) + tcopy_F5 x (b, c)\ \ tcopy_F6 x (ab, ba)" apply(auto simp:tcopy_F5.simps tcopy_F6.simps tcopy_def - tstep.simps fetch.simps new_tape.simps + tstep.simps fetch.simps new_tape.simps exp_zero_simp2 split: if_splits list.splits block.splits) -apply(rule_tac x = n in exI, simp) -apply(rule_tac x = n in exI, simp) -apply(drule Suc_more, simp) -done - -lemma ex_less_more2: "\(n::nat) < x ; x <= 2 * n\ \ - \y. (x = n + y & y <= n)" -apply(rule_tac x = "x - n" in exI) -apply(auto) -done - -lemma app_app_app_simp: "xs @ ys @ za = (xs @ ys) @ za" -apply(simp) -done - -lemma [elim]: "rev xs = replicate n b \ xs = replicate n b" -using rev_replicate[of n b] -thm rev_equal -by(drule_tac rev_equal, simp) - -lemma app_cons_tail_same[dest]: - "\rev b @ Oc # list = - replicate (Suc (Suc na) - n) Oc @ replicate n Bk @ replicate n Oc; - Suc 0 < n; n \ Suc na; n < length list; length list \ 2 * n; b \ []\ - \ list = replicate n Bk @ replicate n Oc - & b = replicate (Suc na - n) Oc" -using length_append_diff_cons[of "rev b" Oc list - "replicate (Suc (Suc na) - n) Oc" n Bk n] -apply(case_tac "length list = 2*n", simp) -using append_eq_append_conv[of "rev b @ [Oc]" "replicate - (Suc (Suc na) - n) Oc" "list" "replicate n Bk @ replicate n Oc"] -apply(case_tac n, simp, simp add: Suc_more rep_suc - del: rep_suc_rev replicate.simps, auto) -done - -lemma hd_replicate_false1: "\replicate x Oc \ []; - hd (replicate x Oc) = Bk\ \ RR" -apply(case_tac x, auto) -done - -lemma hd_replicate_false2: "\replicate x Oc \ []; - hd (replicate x Oc) \ Oc\ \ RR" -apply(case_tac x, auto) -done - -lemma Suc_more_less: "\n \ Suc m; n >= m\ \ n = m | n = Suc m" -apply(auto) -done - -lemma replicate_not_Nil: "replicate x a \ [] \ x > 0" -apply(case_tac x, simp+) +apply(rule_tac x = "Suc 0" in exI, simp add: exp_ind_def exp_zero) +apply(rule_tac x = "Suc i" in exI, simp add: exp_ind_def) done lemma [elim]: "\tstep (10, b, c) tcopy = (5, ab, ba); tcopy_F10 x (b, c)\ \ tcopy_F5 x (ab, ba)" -apply(case_tac x) apply(auto simp:tcopy_F5.simps tcopy_F10.simps tcopy_def - tstep.simps fetch.simps new_tape.simps - split: if_splits list.splits block.splits) -apply(frule app_cons_tail_same, simp+) -apply(rule_tac x = n in exI, auto) + tstep.simps fetch.simps new_tape.simps exp_zero_simp exp_zero_simp2 + exp_ind_def tcopy_F10.simps tcopy_F10_loop.simps tcopy_F10_exit.simps + split: if_splits list.splits block.splits ) +apply(erule_tac [!] x = "i - 1" in allE) +apply(erule_tac [!] x = j in allE, simp_all) +apply(case_tac [!] i, simp_all add: exp_ind_def) done lemma [elim]: "\tstep (4, b, c) tcopy = (5, ab, ba); tcopy_F4 x (b, c)\ \ tcopy_F5 x (ab, ba)" -apply(case_tac x) apply(auto simp:tcopy_F5.simps tcopy_F4.simps tcopy_def - tstep.simps fetch.simps new_tape.simps + tstep.simps fetch.simps new_tape.simps exp_zero_simp exp_zero_simp2 split: if_splits list.splits block.splits) +apply(case_tac x, simp, simp add: exp_ind_def exp_zero) +apply(erule_tac [!] x = "x - 2" in allE) +apply(erule_tac [!] x = "Suc 0" in allE) +apply(case_tac [!] x, simp_all add: exp_ind_def exp_zero) +apply(case_tac [!] nat, simp_all add: exp_ind_def exp_zero) done lemma [elim]: "\tstep (3, b, c) tcopy = (4, ab, ba); tcopy_F3 x (b, c)\ \ tcopy_F4 x (ab, ba)" -apply(case_tac x) apply(auto simp:tcopy_F3.simps tcopy_F4.simps tcopy_def tstep.simps fetch.simps new_tape.simps split: if_splits list.splits block.splits) @@ -862,86 +682,68 @@ tcopy_F4 x (b, c)\ \ tcopy_F4 x (ab, ba)" apply(case_tac x) apply(auto simp:tcopy_F3.simps tcopy_F4.simps - tcopy_def tstep.simps fetch.simps new_tape.simps + tcopy_def tstep.simps fetch.simps new_tape.simps exp_zero_simp exp_zero_simp2 exp_ind_def split: if_splits list.splits block.splits) done lemma [elim]: "\tstep (3, b, c) tcopy = (3, ab, ba); tcopy_F3 x (b, c)\ \ tcopy_F3 x (ab, ba)" -apply(case_tac x) apply(auto simp:tcopy_F3.simps tcopy_F4.simps tcopy_def tstep.simps fetch.simps new_tape.simps split: if_splits list.splits block.splits) done -lemma replicate_cons_back: "y # replicate x y = replicate (Suc x) y" -apply(simp) -done - -lemma replicate_cons_same: "bs @ (b # cs) = y # replicate x y \ - (\n. bs = replicate n y) & (b = y) & (\m. cs = replicate m y)" -apply(simp only: replicate_cons_back) -apply(drule_tac replicate_same) -apply(simp) -done - lemma [elim]: "\tstep (2, b, c) tcopy = (3, ab, ba); tcopy_F2 x (b, c)\ \ tcopy_F3 x (ab, ba)" apply(case_tac x) apply(auto simp:tcopy_F3.simps tcopy_F2.simps tcopy_def tstep.simps fetch.simps new_tape.simps + exp_zero_simp exp_zero_simp2 exp_zero split: if_splits list.splits block.splits) -apply(drule replicate_cons_same, auto)+ +apply(case_tac [!] j, simp_all add: exp_zero exp_ind_def) done lemma [elim]: "\tstep (2, b, c) tcopy = (2, ab, ba); tcopy_F2 x (b, c)\ \ tcopy_F2 x (ab, ba)" -apply(case_tac x) apply(auto simp:tcopy_F3.simps tcopy_F2.simps - tcopy_def tstep.simps fetch.simps new_tape.simps + tcopy_def tstep.simps fetch.simps new_tape.simps + exp_zero_simp exp_zero_simp2 exp_zero split: if_splits list.splits block.splits) -apply(frule replicate_cons_same, auto) -apply(simp add: replicate_app_Cons_same) +apply(rule_tac x = "Suc i" in exI, simp add: exp_ind_def exp_zero) +apply(rule_tac x = "j - 1" in exI, simp) +apply(case_tac j, simp_all add: exp_ind_def exp_zero) done lemma [elim]: "\tstep (Suc 0, b, c) tcopy = (2, ab, ba); - tcopy_F1 x (b, c)\ \ tcopy_F2 x (ab, ba)" -apply(case_tac x) -apply(simp_all add:tcopy_F2.simps tcopy_F1.simps - tcopy_def tstep.simps fetch.simps new_tape.simps) -apply(auto) + tcopy_F1 x (b, c)\ \ tcopy_F2 x (ab, ba)" +apply(auto simp:tcopy_F1.simps tcopy_F2.simps + tcopy_def tstep.simps fetch.simps new_tape.simps + exp_zero_simp exp_zero_simp2 exp_zero + split: if_splits list.splits block.splits) +apply(rule_tac x = "Suc 0" in exI, simp) +apply(rule_tac x = "x - 1" in exI, simp) +apply(case_tac x, simp_all add: exp_ind_def exp_zero) done lemma [elim]: "\tstep (Suc 0, b, c) tcopy = (0, ab, ba); tcopy_F1 x (b, c)\ \ tcopy_F0 x (ab, ba)" -apply(case_tac x) apply(simp_all add:tcopy_F0.simps tcopy_F1.simps - tcopy_def tstep.simps fetch.simps new_tape.simps) -done - -lemma ex_less: "Suc x <= y \ \z. y = x + z & z > 0" -apply(rule_tac x = "y - x" in exI, auto) -done - -lemma [elim]: "\xs @ Bk # ba = - Bk # Oc # replicate n Oc @ Bk # Oc # replicate n Oc; - length xs \ Suc n; xs \ []\ \ RR" -apply(case_tac xs, auto) -apply(case_tac list, auto) -apply(drule ex_less, auto) -apply(simp add: replicate_add) -apply(auto) -apply(case_tac z, simp+) + tcopy_def tstep.simps fetch.simps new_tape.simps + exp_zero_simp exp_zero_simp2 exp_zero + split: if_splits list.splits block.splits ) +apply(case_tac x, simp_all add: exp_ind_def exp_zero, auto) done lemma [elim]: "\tstep (15, b, c) tcopy = (0, ab, ba); tcopy_F15 x (b, c)\ \ tcopy_F0 x (ab, ba)" -apply(case_tac x) apply(auto simp: tcopy_F15.simps tcopy_F0.simps tcopy_def tstep.simps new_tape.simps fetch.simps split: if_splits list.splits block.splits) +apply(rule_tac x = "Suc 0" in exI, simp add: exp_ind_def exp_zero) +apply(case_tac [!] j, simp_all add: exp_ind_def exp_zero) done + lemma [elim]: "\tstep (0, b, c) tcopy = (0, ab, ba); tcopy_F0 x (b, c)\ \ tcopy_F0 x (ab, ba)" apply(case_tac x) @@ -968,7 +770,7 @@ Invariant under mult-step execution. *} lemma inv_tcopy_steps: - "inv_tcopy x (steps (Suc 0, [], replicate x Oc) tcopy stp) " + "inv_tcopy x (steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy stp) " apply(induct stp) apply(simp add: tstep.simps tcopy_def steps.simps tcopy_F1.simps inv_tcopy.simps) @@ -976,18 +778,6 @@ done -text {* - The followng lemmas gives the parital correctness of Copying TM. -*} -theorem inv_tcopy_rs: - "steps (Suc 0, [], replicate x Oc) tcopy stp = (0, l, r) - \ \ n. l = replicate n Bk \ - r = replicate x Oc @ Bk # replicate x Oc" -apply(insert inv_tcopy_steps[of x stp]) -apply(auto simp: inv_tcopy.simps tcopy_F0.simps isBk.simps) -done - - (*----------halt problem of tcopy----------------------------------------*) @@ -1183,7 +973,6 @@ tcopy_state.simps tcopy_step.simps) apply(simp split: if_splits list.splits block.splits taction.splits) apply(auto) -apply(case_tac x, simp+) done lemma [elim]: "tcopy_F4 x (b, c) \ @@ -1193,7 +982,7 @@ lex_square_def lex_triple_def lex_pair_def tcopy_phase.simps tcopy_stage.simps tcopy_state.simps tcopy_step.simps) apply(simp split: if_splits list.splits block.splits taction.splits) -apply(auto) +apply(auto simp: exp_ind_def) done lemma[simp]: "takeWhile (\a. a = b) (replicate x b @ ys) = @@ -1226,7 +1015,7 @@ apply(simp split: if_splits list.splits block.splits taction.splits) apply(auto) apply(simp_all add: tcopy_phase.simps tcopy_stage.simps - tcopy_state.simps tcopy_step.simps) + tcopy_state.simps tcopy_step.simps exponent_def) done lemma [elim]: "tcopy_F7 x (b, c) \ @@ -1235,7 +1024,7 @@ apply(simp add: tstep.simps tcopy_def tcopy_LE_def lex_square_def lex_triple_def lex_pair_def tcopy_phase.simps) apply(simp split: if_splits list.splits block.splits taction.splits) -apply(auto) +apply(auto simp: exp_zero_simp) apply(simp_all add: tcopy_phase.simps tcopy_stage.simps tcopy_state.simps tcopy_step.simps) done @@ -1246,12 +1035,14 @@ apply(simp add: tstep.simps tcopy_def tcopy_LE_def lex_square_def lex_triple_def lex_pair_def tcopy_phase.simps) apply(simp split: if_splits list.splits block.splits taction.splits) -apply(auto) +apply(auto simp: exp_zero_simp) apply(simp_all add: tcopy_phase.simps tcopy_stage.simps - tcopy_state.simps tcopy_step.simps) -apply(simp only: app_cons_app_simp, frule replicate_tail_length, simp) + tcopy_state.simps tcopy_step.simps exponent_def) done +lemma rev_equal_rev: "rev a = rev b \ a = b" +by simp + lemma app_app_app_equal: "xs @ ys @ zs = (xs @ ys) @ zs" by simp @@ -1266,34 +1057,40 @@ apply(simp) done +lemma[simp]: "takeWhile (\a. a = b) (replicate x b @ ys) = + replicate x b @ (takeWhile (\a. a = b) ys)" +apply(induct x) +apply(simp+) +done + lemma [elim]: "tcopy_F9 x (b, c) \ (tstep (9, b, c) tcopy, 9, b, c) \ tcopy_LE" -apply(case_tac x, simp) apply(simp add: tstep.simps tcopy_def tcopy_LE_def lex_square_def - lex_triple_def lex_pair_def tcopy_phase.simps) + lex_triple_def lex_pair_def tcopy_phase.simps tcopy_F9.simps + tcopy_F9_loop.simps tcopy_F9_exit.simps) apply(simp split: if_splits list.splits block.splits taction.splits) apply(auto) -apply(simp_all add: tcopy_phase.simps tcopy_stage.simps - tcopy_state.simps tcopy_step.simps) -apply(drule_tac bs = b and as = "Bk # list" in rev_tl_hd_merge) -apply(simp) -apply(drule_tac bs = b and as = "Oc # list" in rev_tl_hd_merge) -apply(simp) +apply(simp_all add: tcopy_phase.simps tcopy_stage.simps tcopy_F9_loop.simps + tcopy_state.simps tcopy_step.simps tstep.simps exp_zero_simp + exponent_def) +apply(case_tac [1-2] t, simp_all add: rev_tl_hd_merge) +apply(case_tac j, simp, simp) +apply(case_tac nat, simp_all) +apply(case_tac nata, simp_all) done lemma [elim]: "tcopy_F10 x (b, c) \ (tstep (10, b, c) tcopy, 10, b, c) \ tcopy_LE" -apply(case_tac x, simp) apply(simp add: tstep.simps tcopy_def tcopy_LE_def lex_square_def - lex_triple_def lex_pair_def tcopy_phase.simps) + lex_triple_def lex_pair_def tcopy_phase.simps tcopy_F10_loop.simps + tcopy_F10_exit.simps exp_zero_simp) apply(simp split: if_splits list.splits block.splits taction.splits) -apply(auto) +apply(auto simp: exp_zero_simp) apply(simp_all add: tcopy_phase.simps tcopy_stage.simps - tcopy_state.simps tcopy_step.simps) -apply(drule_tac bs = b and as = "Bk # list" in rev_tl_hd_merge) -apply(simp) -apply(drule_tac bs = b and as = "Oc # list" in rev_tl_hd_merge) -apply(simp) + tcopy_state.simps tcopy_step.simps exponent_def + rev_tl_hd_merge) +apply(case_tac k, simp_all) +apply(case_tac nat, simp_all) done lemma [elim]: "tcopy_F11 x (b, c) \ @@ -1313,6 +1110,7 @@ apply(auto) apply(simp_all add: tcopy_phase.simps tcopy_stage.simps tcopy_state.simps tcopy_step.simps) +apply(simp_all add: exp_ind_def) done lemma [elim]: "tcopy_F13 x (b, c) \ @@ -1324,7 +1122,6 @@ apply(auto) apply(simp_all add: tcopy_phase.simps tcopy_stage.simps tcopy_state.simps tcopy_step.simps) -apply(drule equal_length, simp)+ done lemma [elim]: "tcopy_F14 x (b, c) \ @@ -1349,24 +1146,37 @@ tcopy_state.simps tcopy_step.simps) done +lemma exp_length: "length (a\<^bsup>b\<^esup>) = b" +apply(induct b, simp_all add: exp_zero exp_ind_def) +done + +declare tcopy_F9.simps[simp del] tcopy_F10.simps[simp del] + +lemma length_eq: "xs = ys \ length xs = length ys" +by simp + lemma tcopy_wf_step:"\a > 0; inv_tcopy x (a, b, c)\ \ (tstep (a, b, c) tcopy, (a, b, c)) \ tcopy_LE" apply(simp add:inv_tcopy.simps split: if_splits, auto) apply(auto simp: tstep.simps tcopy_def tcopy_LE_def lex_square_def lex_triple_def lex_pair_def tcopy_phase.simps tcopy_stage.simps tcopy_state.simps tcopy_step.simps + exp_length exp_zero_simp exponent_def split: if_splits list.splits block.splits taction.splits) +apply(case_tac [!] t, simp_all) +apply(case_tac j, simp_all) +apply(drule_tac length_eq, simp) done lemma tcopy_wf: -"\n. let nc = steps (Suc 0, [], replicate x Oc) tcopy n in - let Sucnc = steps (Suc 0, [], replicate x Oc) tcopy (Suc n) in +"\n. let nc = steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy n in + let Sucnc = steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy (Suc n) in \ isS0 nc \ ((Sucnc, nc) \ tcopy_LE)" proof(rule allI, case_tac - "steps (Suc 0, [], replicate x Oc) tcopy n", auto simp: tstep_red) + "steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy n", auto simp: tstep_red) fix n a b c assume h: "\ isS0 (a, b, c)" - "steps (Suc 0, [], replicate x Oc) tcopy n = (a, b, c)" + "steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy n = (a, b, c)" hence "inv_tcopy x (a, b, c)" using inv_tcopy_steps[of x n] by(simp) thus "(tstep (a, b, c) tcopy, a, b, c) \ tcopy_LE" @@ -1378,9 +1188,9 @@ The termination of Copying TM: *} lemma tcopy_halt: - "\n. isS0 (steps (Suc 0, [], replicate x Oc) tcopy n)" + "\n. isS0 (steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy n)" apply(insert halt_lemma - [of tcopy_LE isS0 "steps (Suc 0, [], replicate x Oc) tcopy"]) + [of tcopy_LE isS0 "steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy"]) apply(insert tcopy_wf [of x]) apply(simp only: Let_def) apply(insert wf_tcopy_le) @@ -1390,20 +1200,20 @@ text {* The total correntess of Copying TM: *} -theorem tcopy_halt_rs: "\stp m. - steps (Suc 0, [], replicate x Oc) tcopy stp = - (0, replicate m Bk, replicate x Oc @ Bk # replicate x Oc)" +theorem tcopy_halt_rs: + "\stp m. + steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy stp = + (0, Bk\<^bsup>m\<^esup>, Oc\<^bsup>x\<^esup> @ Bk # Oc\<^bsup>x\<^esup>)" using tcopy_halt[of x] proof(erule_tac exE) fix n - assume h: "isS0 (steps (Suc 0, [], replicate x Oc) tcopy n)" - have "inv_tcopy x (steps (Suc 0, [], replicate x Oc) tcopy n)" + assume h: "isS0 (steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy n)" + have "inv_tcopy x (steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy n)" using inv_tcopy_steps[of x n] by simp thus "?thesis" using h - apply(cases "(steps (Suc 0, [], replicate x Oc) tcopy n)", + apply(cases "(steps (Suc 0, [], Oc\<^bsup>x\<^esup>) tcopy n)", auto simp: isS0_def inv_tcopy.simps) - apply(rule_tac x = n in exI, auto) done qed @@ -1505,10 +1315,10 @@ *} and h_case: "\ M n. \(haltP M n)\ \ - \ na nb. (steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc]))" + \ na nb. (steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc]))" and nh_case: "\ M n. \(\ haltP M n)\ \ - \ na nb. (steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc]))" + \ na nb. (steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc]))" begin term t_correct @@ -1519,6 +1329,117 @@ lemma [simp]: "a\<^bsup>0\<^esup> = []" by(simp add: exponent_def) + +lemma tinres_ex1: + "tinres (Bk\<^bsup>nb\<^esup>) b \ \nb. b = Bk\<^bsup>nb\<^esup>" +apply(auto simp: tinres_def) +proof - + fix n + assume "Bk\<^bsup>nb\<^esup> = b @ Bk\<^bsup>n\<^esup>" + thus "\nb. b = Bk\<^bsup>nb\<^esup>" + proof(induct b arbitrary: nb) + show "\nb. [] = Bk\<^bsup>nb\<^esup>" + by(rule_tac x = 0 in exI, simp add: exp_zero) + next + fix a b nb + assume ind: "\nb. Bk\<^bsup>nb\<^esup> = b @ Bk\<^bsup>n\<^esup> \ \nb. b = Bk\<^bsup>nb\<^esup>" + and h: "Bk\<^bsup>nb\<^esup> = (a # b) @ Bk\<^bsup>n\<^esup>" + from h show "\nb. a # b = Bk\<^bsup>nb\<^esup>" + proof(case_tac a, case_tac nb, simp_all add: exp_ind_def) + fix nat + assume "Bk\<^bsup>nat\<^esup> = b @ Bk\<^bsup>n\<^esup>" + thus "\nb. Bk # b = Bk\<^bsup>nb\<^esup>" + using ind[of nat] + apply(auto) + apply(rule_tac x = "Suc nb" in exI, simp add: exp_ind_def) + done + next + assume "Bk\<^bsup>nb\<^esup> = Oc # b @ Bk\<^bsup>n\<^esup>" + thus "\nb. Oc # b = Bk\<^bsup>nb\<^esup>" + apply(case_tac nb, simp_all add: exp_ind_def) + done + qed + qed +next + fix n + show "\nba. Bk\<^bsup>nb\<^esup> @ Bk\<^bsup>n\<^esup> = Bk\<^bsup>nba\<^esup>" + apply(rule_tac x = "nb + n" in exI) + apply(simp add: exponent_def replicate_add) + done +qed + +lemma h_newcase: "\ M n. \(haltP M n)\ \ + \ na nb. (steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc]))" +proof - + fix M n x + assume "haltP M n" + hence " \ na nb. (steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na + = (0, Bk\<^bsup>nb\<^esup>, [Oc]))" + apply(erule_tac h_case) + done + from this obtain na nb where + cond1:"(steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na + = (0, Bk\<^bsup>nb\<^esup>, [Oc]))" by blast + thus "\ na nb. (steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc]))" + proof(rule_tac x = na in exI, case_tac "steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na", simp) + fix a b c + assume cond2: "steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (a, b, c)" + have "tinres (Bk\<^bsup>nb\<^esup>) b \ [Oc] = c \ 0 = a" + proof(rule_tac tinres_steps) + show "tinres [] (Bk\<^bsup>x\<^esup>)" + apply(simp add: tinres_def) + apply(auto) + done + next + show "(steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na + = (0, Bk\<^bsup>nb\<^esup>, [Oc]))" + by(simp add: cond1) + next + show "steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (a, b, c)" + by(simp add: cond2) + qed + thus "a = 0 \ (\nb. b = Bk\<^bsup>nb\<^esup>) \ c = [Oc]" + apply(auto simp: tinres_ex1) + done + qed +qed + +lemma nh_newcase: "\ M n. \\ (haltP M n)\ \ + \ na nb. (steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc]))" +proof - + fix M n + assume "\ haltP M n" + hence "\ na nb. (steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na + = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc]))" + apply(erule_tac nh_case) + done + from this obtain na nb where + cond1: "(steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na + = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc]))" by blast + thus "\ na nb. (steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc]))" + proof(rule_tac x = na in exI, case_tac "steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na", simp) + fix a b c + assume cond2: "steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (a, b, c)" + have "tinres (Bk\<^bsup>nb\<^esup>) b \ [Oc, Oc] = c \ 0 = a" + proof(rule_tac tinres_steps) + show "tinres [] (Bk\<^bsup>x\<^esup>)" + apply(simp add: tinres_def) + apply(auto) + done + next + show "(steps (Suc 0, [], Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na + = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc]))" + by(simp add: cond1) + next + show "steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code M\<^esup> @ Bk # Oc\<^bsup>n\<^esup>) H na = (a, b, c)" + by(simp add: cond2) + qed + thus "a = 0 \ (\nb. b = Bk\<^bsup>nb\<^esup>) \ c = [Oc, Oc]" + apply(auto simp: tinres_ex1) + done + qed +qed + lemma haltP_weaking: "haltP (tcontra H) (code (tcontra H)) \ \stp. isS0 (steps (Suc 0, [], Oc\<^bsup>code (tcontra H)\<^esup>) @@ -1541,7 +1462,7 @@ assume h: "haltP (tcontra H) (code (tcontra H))" hence h1: "\ x. \ na nb. steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>code (tcontra H)\<^esup> @ Bk # Oc\<^bsup>code (tcontra H)\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc])" - by(drule_tac x = x in h_case, simp) + by(drule_tac x = x in h_newcase, simp) have "?P1 \-> \ tp. (\ stp tp'. steps (Suc 0, tp) (tcopy |+| H) stp = (0, tp') \ ?Q2 tp')" proof(rule_tac turing_merge.t_merge_halt[of tcopy H "?P1" "?P2" "?P3" "?P3" "?Q1" "?Q2"], auto simp: turing_merge_def) @@ -1605,7 +1526,7 @@ have h1: "\ x. \ na nb. steps (Suc 0, Bk\<^bsup>x\<^esup>, Oc\<^bsup>?cn\<^esup> @ Bk # Oc\<^bsup>?cn\<^esup>) H na = (0, Bk\<^bsup>nb\<^esup>, [Oc, Oc])" using uh - by(drule_tac x = x in nh_case, simp) + by(drule_tac x = x in nh_newcase, simp) let ?P1 = "\ tp. let (l, r) = tp in (l = [] \ (r::block list) = Oc\<^bsup>(?cn)\<^esup>)" let ?Q1 = "\ (l, r).(\ na. l = Bk\<^bsup>na\<^esup> \ r = [Oc, Oc])"