author | Christian Urban <christian dot urban at kcl dot ac dot uk> |
Wed, 23 Jan 2013 15:33:26 +0100 | |
changeset 66 | 4a3cd7d70ec2 |
parent 65 | 0349fa7f5595 |
child 67 | 140489a4020e |
permissions | -rwxr-xr-x |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1 |
(* Title: Turing machine's definition and its charater |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
2 |
Author: XuJian <xujian817@hotmail.com> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
3 |
Maintainer: Xujian |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
4 |
*) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
5 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
6 |
header {* Undeciablity of the {\em Halting problem} *} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
7 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
8 |
theory uncomputable |
55
cd4ef33c8fb1
added turing_hoare
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
54
diff
changeset
|
9 |
imports Main turing_hoare |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
10 |
begin |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
11 |
|
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
12 |
declare tm_comp.simps [simp del] |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
13 |
declare adjust.simps[simp del] |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
14 |
declare shift.simps[simp del] |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
15 |
declare tm_wf.simps[simp del] |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
16 |
declare step.simps[simp del] |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
17 |
declare steps.simps[simp del] |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
18 |
|
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
19 |
|
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
20 |
lemma numeral: |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
21 |
shows "1 = Suc 0" |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
22 |
and "2 = Suc 1" |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
23 |
and "3 = Suc 2" |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
24 |
and "4 = Suc 3" |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
25 |
and "5 = Suc 4" |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
26 |
and "6 = Suc 5" by arith+ |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
27 |
|
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
28 |
|
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
29 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
30 |
text {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
31 |
The {\em Copying} TM, which duplicates its input. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
32 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
33 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
34 |
definition tcopy_init :: "instr list" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
35 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
36 |
"tcopy_init \<equiv> [(W0, 0), (R, 2), (R, 3), (R, 2), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
37 |
(W1, 3), (L, 4), (L, 4), (L, 0)]" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
38 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
39 |
fun inv_init1 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
40 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
41 |
"inv_init1 x (l, r) = (l = [] \<and> r = Oc\<up>x )" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
42 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
43 |
fun inv_init2 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
44 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
45 |
"inv_init2 x (l, r) = (\<exists> i j. i > 0 \<and> i + j = x \<and> l = Oc\<up>i \<and> r = Oc\<up>j)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
46 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
47 |
fun inv_init3 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
48 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
49 |
"inv_init3 x (l, r) = (x > 0 \<and> l = Bk # Oc\<up>x \<and> tl r = [])" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
50 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
51 |
fun inv_init4 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
52 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
53 |
"inv_init4 x (l, r) = (x > 0 \<and> ((l = Oc\<up>x \<and> r = [Bk, Oc]) \<or> (l = Oc\<up>(x - 1) \<and> r = [Oc, Bk, Oc])))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
54 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
55 |
fun inv_init0 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
56 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
57 |
"inv_init0 x (l, r) = ((x > Suc 0 \<and> l = Oc\<up>(x - 2) \<and> r = [Oc, Oc, Bk, Oc]) \<or> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
58 |
(x = 1 \<and> l = [] \<and> r = [Bk, Oc, Bk, Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
59 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
60 |
fun inv_init :: "nat \<Rightarrow> config \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
61 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
62 |
"inv_init x (s, l, r) = ( |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
63 |
if s = 0 then inv_init0 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
64 |
else if s = Suc 0 then inv_init1 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
65 |
else if s = 2 then inv_init2 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
66 |
else if s = 3 then inv_init3 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
67 |
else if s = 4 then inv_init4 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
68 |
else False)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
69 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
70 |
declare inv_init.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
71 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
72 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
73 |
lemma [elim]: "\<lbrakk>0 < i; 0 < j\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
74 |
\<exists>ia>0. ia + j - Suc 0 = i + j \<and> Oc # Oc \<up> i = Oc \<up> ia" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
75 |
apply(rule_tac x = "Suc i" in exI, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
76 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
77 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
78 |
lemma inv_init_step: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
79 |
"\<lbrakk>inv_init x cf; x > 0\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
80 |
\<Longrightarrow> inv_init x (step cf (tcopy_init, 0))" |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
81 |
unfolding tcopy_init_def |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
82 |
apply(case_tac cf) |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
83 |
apply(auto simp: inv_init.simps step.simps tcopy_init_def numeral split: if_splits) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
84 |
apply(case_tac "hd c", auto simp: inv_init.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
85 |
apply(case_tac c, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
86 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
87 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
88 |
lemma inv_init_steps: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
89 |
"\<lbrakk>inv_init x (s, l, r); x > 0\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
90 |
\<Longrightarrow> inv_init x (steps (s, l, r) (tcopy_init, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
91 |
apply(induct stp, simp add: steps.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
92 |
apply(auto simp: step_red) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
93 |
apply(rule_tac inv_init_step, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
94 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
95 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
96 |
fun init_state :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
97 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
98 |
"init_state (s, l, r) = (if s = 0 then 0 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
99 |
else 5 - s)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
100 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
101 |
fun init_step :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
102 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
103 |
"init_step (s, l, r) = (if s = 2 then length r |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
104 |
else if s = 3 then if r = [] \<or> r = [Bk] then Suc 0 else 0 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
105 |
else if s = 4 then length l |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
106 |
else 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
107 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
108 |
fun init_measure :: "config \<Rightarrow> nat \<times> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
109 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
110 |
"init_measure c = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
111 |
(init_state c, init_step c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
112 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
113 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
114 |
definition lex_pair :: "((nat \<times> nat) \<times> nat \<times> nat) set" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
115 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
116 |
"lex_pair \<equiv> less_than <*lex*> less_than" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
117 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
118 |
definition init_LE :: "(config \<times> config) set" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
119 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
120 |
"init_LE \<equiv> (inv_image lex_pair init_measure)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
121 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
122 |
lemma [simp]: "\<lbrakk>tl r = []; r \<noteq> []; r \<noteq> [Bk]\<rbrakk> \<Longrightarrow> r = [Oc]" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
123 |
apply(case_tac r, auto, case_tac a, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
124 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
125 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
126 |
lemma wf_init_le: "wf init_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
127 |
by(auto intro:wf_inv_image simp:init_LE_def lex_pair_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
128 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
129 |
lemma init_halt: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
130 |
"x > 0 \<Longrightarrow> \<exists> stp. is_final (steps (Suc 0, [], Oc\<up>x) (tcopy_init, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
131 |
proof(rule_tac LE = init_LE in halt_lemma) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
132 |
show "wf init_LE" by(simp add: wf_init_le) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
133 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
134 |
assume h: "0 < x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
135 |
show "\<forall>n. \<not> is_final (steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) n) \<longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
136 |
(steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) (Suc n), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
137 |
steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) n) \<in> init_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
138 |
proof(rule_tac allI, rule_tac impI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
139 |
fix n |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
140 |
assume a: "\<not> is_final (steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) n)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
141 |
have b: "inv_init x (steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) n)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
142 |
apply(rule_tac inv_init_steps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
143 |
apply(simp_all add: inv_init.simps h) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
144 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
145 |
obtain s l r where c: "(steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) n) = (s, l, r)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
146 |
apply(case_tac "steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) n", auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
147 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
148 |
moreover hence "inv_init x (s, l, r)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
149 |
using c b by simp |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
150 |
ultimately show "(steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) (Suc n), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
151 |
steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) n) \<in> init_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
152 |
using a |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
153 |
proof(simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
154 |
assume "inv_init x (s, l, r)" "0 < s" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
155 |
thus "(step (s, l, r) (tcopy_init, 0), s, l, r) \<in> init_LE" |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
156 |
apply(auto simp: inv_init.simps init_LE_def lex_pair_def step.simps tcopy_init_def numeral |
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
157 |
split: if_splits) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
158 |
apply(case_tac r, auto, case_tac a, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
159 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
160 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
161 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
162 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
163 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
164 |
lemma init_correct: |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
165 |
"x > 0 \<Longrightarrow> {inv_init1 x} tcopy_init {inv_init0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
166 |
proof(rule_tac HoareI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
167 |
fix l r |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
168 |
assume h: "0 < x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
169 |
"inv_init1 x (l, r)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
170 |
hence "\<exists> stp. is_final (steps (Suc 0, [], Oc\<up>x) (tcopy_init, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
171 |
by(erule_tac init_halt) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
172 |
then obtain stp where "is_final (steps (Suc 0, [], Oc\<up>x) (tcopy_init, 0) stp)" .. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
173 |
moreover have "inv_init x (steps (Suc 0, [], Oc\<up>x) (tcopy_init, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
174 |
apply(rule_tac inv_init_steps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
175 |
using h by(simp_all add: inv_init.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
176 |
ultimately show |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
177 |
"\<exists>n. is_final (steps (1, l, r) (tcopy_init, 0) n) \<and> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
178 |
inv_init0 x holds_for steps (1, l, r) (tcopy_init, 0) n" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
179 |
using h |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
180 |
apply(rule_tac x = stp in exI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
181 |
apply(case_tac "(steps (Suc 0, [], Oc \<up> x) (tcopy_init, 0) stp)", simp add: inv_init.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
182 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
183 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
184 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
185 |
definition tcopy_loop :: "instr list" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
186 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
187 |
"tcopy_loop \<equiv> [(R, 0), (R, 2), (R, 3), (W0, 2), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
188 |
(R, 3), (R, 4), (W1, 5), (R, 4), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
189 |
(L, 6), (L, 5), (L, 6), (L, 1)]" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
190 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
191 |
fun inv_loop1_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
192 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
193 |
"inv_loop1_loop x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
194 |
(\<exists> i j. i + j + 1 = x \<and> l = Oc\<up>i \<and> r = Oc # Oc # Bk\<up>j @ Oc\<up>j \<and> j > 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
195 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
196 |
fun inv_loop1_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
197 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
198 |
"inv_loop1_exit x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
199 |
(l = [] \<and> r = Bk # Oc # Bk\<up>x @ Oc\<up>x \<and> x > 0 )" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
200 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
201 |
fun inv_loop1 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
202 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
203 |
"inv_loop1 x (l, r) = (inv_loop1_loop x (l, r) \<or> inv_loop1_exit x (l, r))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
204 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
205 |
fun inv_loop2 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
206 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
207 |
"inv_loop2 x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
208 |
(\<exists> i j any. i + j = x \<and> x > 0 \<and> i > 0 \<and> j > 0 \<and> l = Oc\<up>i \<and> r = any#Bk\<up>j@Oc\<up>j)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
209 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
210 |
fun inv_loop3 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
211 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
212 |
"inv_loop3 x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
213 |
(\<exists> i j k t. i + j = x \<and> i > 0 \<and> j > 0 \<and> k + t = Suc j \<and> l = Bk\<up>k@Oc\<up>i \<and> r = Bk\<up>t@Oc\<up>j)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
214 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
215 |
fun inv_loop4 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
216 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
217 |
"inv_loop4 x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
218 |
(\<exists> i j k t. i + j = x \<and> i > 0 \<and> j > 0 \<and> k + t = j \<and> l = Oc\<up>k @ Bk\<up>(Suc j)@Oc\<up>i \<and> r = Oc\<up>t)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
219 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
220 |
fun inv_loop5_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
221 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
222 |
"inv_loop5_loop x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
223 |
(\<exists> i j k t. i + j = Suc x \<and> i > 0 \<and> j > 0 \<and> k + t = j \<and> t > 0 \<and> l = Oc\<up>k@Bk\<up>j@Oc\<up>i \<and> r = Oc\<up>t)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
224 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
225 |
fun inv_loop5_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
226 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
227 |
"inv_loop5_exit x (l, r) = (\<exists> i j. i + j = Suc x \<and> i > 0 \<and> j > 0 \<and> l = Bk\<up>(j - 1)@Oc\<up>i \<and> r = Bk # Oc\<up>j)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
228 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
229 |
fun inv_loop5 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
230 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
231 |
"inv_loop5 x (l, r) = (inv_loop5_loop x (l, r) \<or> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
232 |
inv_loop5_exit x (l, r))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
233 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
234 |
fun inv_loop6_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
235 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
236 |
"inv_loop6_loop x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
237 |
(\<exists> i j k t. i + j = Suc x \<and> i > 0 \<and> k + t + 1 = j \<and> l = Bk\<up>k @ Oc\<up>i \<and> r = Bk\<up>(Suc t) @ Oc\<up>j)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
238 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
239 |
fun inv_loop6_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
240 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
241 |
"inv_loop6_exit x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
242 |
(\<exists> i j. i + j = x \<and> j > 0 \<and> l = Oc\<up>i \<and> r = Oc # Bk\<up>j @ Oc\<up>j)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
243 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
244 |
fun inv_loop6 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
245 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
246 |
"inv_loop6 x (l, r) = (inv_loop6_loop x (l, r) \<or> inv_loop6_exit x (l, r))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
247 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
248 |
fun inv_loop0 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
249 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
250 |
"inv_loop0 x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
251 |
(l = [Bk] \<and> r = Oc # Bk\<up>x @ Oc\<up>x \<and> x > 0 )" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
252 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
253 |
fun inv_loop :: "nat \<Rightarrow> config \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
254 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
255 |
"inv_loop x (s, l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
256 |
(if s = 0 then inv_loop0 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
257 |
else if s = 1 then inv_loop1 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
258 |
else if s = 2 then inv_loop2 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
259 |
else if s = 3 then inv_loop3 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
260 |
else if s = 4 then inv_loop4 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
261 |
else if s = 5 then inv_loop5 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
262 |
else if s = 6 then inv_loop6 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
263 |
else False)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
264 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
265 |
declare inv_loop.simps[simp del] inv_loop1.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
266 |
inv_loop2.simps[simp del] inv_loop3.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
267 |
inv_loop4.simps[simp del] inv_loop5.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
268 |
inv_loop6.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
269 |
lemma [elim]: "Bk # list = Oc \<up> t \<Longrightarrow> RR" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
270 |
apply(case_tac t, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
271 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
272 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
273 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
274 |
lemma [simp]: "inv_loop1 x (b, []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
275 |
by(simp add: inv_loop1.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
276 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
277 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop2 x (b, [])\<rbrakk> \<Longrightarrow> inv_loop3 x (Bk # b, [])" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
278 |
apply(auto simp: inv_loop2.simps inv_loop3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
279 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
280 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
281 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop3 x (b, [])\<rbrakk> \<Longrightarrow> inv_loop3 x (Bk # b, [])" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
282 |
apply(auto simp: inv_loop3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
283 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
284 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
285 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop4 x (b, [])\<rbrakk> \<Longrightarrow> inv_loop5 x (b, [Oc])" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
286 |
apply(auto simp: inv_loop4.simps inv_loop5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
287 |
apply(rule_tac [!] x = i in exI, |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
288 |
rule_tac [!] x = "Suc j" in exI, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
289 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
290 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
291 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop5 x ([], [])\<rbrakk> \<Longrightarrow> RR" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
292 |
apply(auto simp: inv_loop4.simps inv_loop5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
293 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
294 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
295 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop5 x (b, []); b \<noteq> []\<rbrakk> \<Longrightarrow> RR" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
296 |
apply(auto simp: inv_loop4.simps inv_loop5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
297 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
298 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
299 |
lemma [elim]: "inv_loop6 x ([], []) \<Longrightarrow> RR" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
300 |
apply(auto simp: inv_loop6.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
301 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
302 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
303 |
thm inv_loop6_exit.simps |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
304 |
lemma [elim]: "inv_loop6 x (b, []) \<Longrightarrow> RR" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
305 |
apply(auto simp: inv_loop6.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
306 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
307 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
308 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop1 x (b, Bk # list)\<rbrakk> \<Longrightarrow> b = []" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
309 |
apply(auto simp: inv_loop1.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
310 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
311 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
312 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop1 x (b, Bk # list)\<rbrakk> \<Longrightarrow> list = Oc # Bk \<up> x @ Oc \<up> x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
313 |
apply(auto simp: inv_loop1.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
314 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
315 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
316 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop2 x (b, Bk # list)\<rbrakk> \<Longrightarrow> inv_loop3 x (Bk # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
317 |
apply(auto simp: inv_loop2.simps inv_loop3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
318 |
apply(rule_tac [!] x = i in exI, rule_tac [!] x = j in exI, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
319 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
320 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
321 |
lemma [elim]: "Bk # list = Oc \<up> j \<Longrightarrow> RR" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
322 |
apply(case_tac j, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
323 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
324 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
325 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop3 x (b, Bk # list)\<rbrakk> \<Longrightarrow> inv_loop3 x (Bk # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
326 |
apply(auto simp: inv_loop3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
327 |
apply(rule_tac [!] x = i in exI, |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
328 |
rule_tac [!] x = j in exI, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
329 |
apply(case_tac [!] t, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
330 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
331 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
332 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop4 x (b, Bk # list)\<rbrakk> \<Longrightarrow> inv_loop5 x (b, Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
333 |
apply(auto simp: inv_loop4.simps inv_loop5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
334 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
335 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
336 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop5 x ([], Bk # list)\<rbrakk> \<Longrightarrow> inv_loop6 x ([], Bk # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
337 |
apply(auto simp: inv_loop6.simps inv_loop5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
338 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
339 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
340 |
lemma [simp]: "inv_loop5_loop x (b, Bk # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
341 |
apply(auto simp: inv_loop5_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
342 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
343 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
344 |
lemma [simp]: "inv_loop6_exit x (b, Bk # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
345 |
apply(auto simp: inv_loop6.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
346 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
347 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
348 |
declare inv_loop5_loop.simps[simp del] inv_loop5_exit.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
349 |
inv_loop6_loop.simps[simp del] inv_loop6_exit.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
350 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
351 |
lemma [elim]:"\<lbrakk>0 < x; inv_loop5_exit x (b, Bk # list); b \<noteq> []; hd b = Bk\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
352 |
\<Longrightarrow> inv_loop6_loop x (tl b, Bk # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
353 |
apply(simp only: inv_loop5_exit.simps inv_loop6_loop.simps ) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
354 |
apply(erule_tac exE)+ |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
355 |
apply(rule_tac x = i in exI, |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
356 |
rule_tac x = j in exI, |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
357 |
rule_tac x = "j - Suc (Suc 0)" in exI, |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
358 |
rule_tac x = "Suc 0" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
359 |
apply(case_tac [!] j, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
360 |
apply(case_tac [!] nat, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
361 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
362 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
363 |
lemma [simp]: "inv_loop6_loop x (b, Oc # Bk # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
364 |
apply(auto simp: inv_loop6_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
365 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
366 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
367 |
lemma [elim]: "\<lbrakk>x > 0; inv_loop5_exit x (b, Bk # list); b \<noteq> []; hd b = Oc\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
368 |
inv_loop6_exit x (tl b, Oc # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
369 |
apply(simp only: inv_loop5_exit.simps inv_loop6_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
370 |
apply(erule_tac exE)+ |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
371 |
apply(rule_tac x = "x - 1" in exI, rule_tac x = 1 in exI, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
372 |
apply(case_tac j, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
373 |
apply(case_tac [!] nat, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
374 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
375 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
376 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop5 x (b, Bk # list); b \<noteq> []\<rbrakk> \<Longrightarrow> inv_loop6 x (tl b, hd b # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
377 |
apply(simp add: inv_loop5.simps inv_loop6.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
378 |
apply(case_tac "hd b", simp_all, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
379 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
380 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
381 |
lemma [simp]: "inv_loop6 x ([], Bk # xs) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
382 |
apply(simp add: inv_loop6.simps inv_loop6_loop.simps |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
383 |
inv_loop6_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
384 |
apply(auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
385 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
386 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
387 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop6 x ([], Bk # list)\<rbrakk> \<Longrightarrow> inv_loop6 x ([], Bk # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
388 |
apply(simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
389 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
390 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
391 |
lemma [simp]: "inv_loop6_exit x (b, Bk # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
392 |
apply(simp add: inv_loop6_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
393 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
394 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
395 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop6_loop x (b, Bk # list); b \<noteq> []; hd b = Bk\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
396 |
\<Longrightarrow> inv_loop6_loop x (tl b, Bk # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
397 |
apply(simp only: inv_loop6_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
398 |
apply(erule_tac exE)+ |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
399 |
apply(rule_tac x = i in exI, rule_tac x = j in exI, |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
400 |
rule_tac x = "k - 1" in exI, rule_tac x = "Suc t" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
401 |
apply(case_tac [!] k, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
402 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
403 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
404 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop6_loop x (b, Bk # list); b \<noteq> []; hd b = Oc\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
405 |
\<Longrightarrow> inv_loop6_exit x (tl b, Oc # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
406 |
apply(simp only: inv_loop6_loop.simps inv_loop6_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
407 |
apply(erule_tac exE)+ |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
408 |
apply(rule_tac x = "i - 1" in exI, rule_tac x = j in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
409 |
apply(case_tac [!] k, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
410 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
411 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
412 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop6 x (b, Bk # list); b \<noteq> []\<rbrakk> \<Longrightarrow> inv_loop6 x (tl b, hd b # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
413 |
apply(simp add: inv_loop6.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
414 |
apply(case_tac "hd b", simp_all, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
415 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
416 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
417 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop1 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_loop2 x (Oc # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
418 |
apply(auto simp: inv_loop1.simps inv_loop2.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
419 |
apply(rule_tac x = "Suc i" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
420 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
421 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
422 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop2 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_loop2 x (b, Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
423 |
apply(auto simp: inv_loop2.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
424 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
425 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
426 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop3 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_loop4 x (Oc # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
427 |
apply(auto simp: inv_loop3.simps inv_loop4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
428 |
apply(rule_tac [!] x = i in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
429 |
apply(rule_tac [!] x = "Suc 0" in exI, rule_tac [!] x = "j - 1" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
430 |
apply(case_tac [!] t, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
431 |
apply(case_tac [!] j, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
432 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
433 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
434 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop4 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_loop4 x (Oc # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
435 |
apply(auto simp: inv_loop4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
436 |
apply(rule_tac [!] x = "i" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
437 |
apply(rule_tac [!] x = "Suc k" in exI, rule_tac [!] x = "t - 1" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
438 |
apply(case_tac [!] t, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
439 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
440 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
441 |
lemma [simp]: "inv_loop5 x ([], list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
442 |
apply(auto simp: inv_loop5.simps inv_loop5_exit.simps inv_loop5_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
443 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
444 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
445 |
lemma [simp]: "inv_loop5_exit x (b, Oc # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
446 |
apply(auto simp: inv_loop5_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
447 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
448 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
449 |
lemma [elim]: " \<lbrakk>inv_loop5_loop x (b, Oc # list); b \<noteq> []; hd b = Bk\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
450 |
\<Longrightarrow> inv_loop5_exit x (tl b, Bk # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
451 |
apply(simp only: inv_loop5_loop.simps inv_loop5_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
452 |
apply(erule_tac exE)+ |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
453 |
apply(rule_tac x = i in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
454 |
apply(case_tac [!] k, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
455 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
456 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
457 |
lemma [elim]: "\<lbrakk>inv_loop5_loop x (b, Oc # list); b \<noteq> []; hd b = Oc\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
458 |
\<Longrightarrow> inv_loop5_loop x (tl b, Oc # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
459 |
apply(simp only: inv_loop5_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
460 |
apply(erule_tac exE)+ |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
461 |
apply(rule_tac x = i in exI, rule_tac x = j in exI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
462 |
apply(rule_tac x = "k - 1" in exI, rule_tac x = "Suc t" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
463 |
apply(case_tac [!] k, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
464 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
465 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
466 |
lemma [elim]: "\<lbrakk>inv_loop5 x (b, Oc # list); b \<noteq> []\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
467 |
inv_loop5 x (tl b, hd b # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
468 |
apply(simp add: inv_loop5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
469 |
apply(case_tac "hd b", simp_all, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
470 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
471 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
472 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop6 x ([], Oc # list)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
473 |
inv_loop1 x ([], Bk # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
474 |
apply(auto simp: inv_loop6.simps inv_loop1.simps |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
475 |
inv_loop6_loop.simps inv_loop6_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
476 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
477 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
478 |
lemma [elim]: "\<lbrakk>0 < x; inv_loop6 x (b, Oc # list); b \<noteq> []\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
479 |
\<Longrightarrow> inv_loop1 x (tl b, hd b # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
480 |
apply(auto simp: inv_loop6.simps inv_loop1.simps |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
481 |
inv_loop6_loop.simps inv_loop6_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
482 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
483 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
484 |
lemma inv_loop_step: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
485 |
"\<lbrakk>inv_loop x cf; x > 0\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
486 |
\<Longrightarrow> inv_loop x (step cf (tcopy_loop, 0))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
487 |
apply(case_tac cf, case_tac c, case_tac [2] aa) |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
488 |
apply(auto simp: inv_loop.simps step.simps tcopy_loop_def numeral split: if_splits) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
489 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
490 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
491 |
lemma inv_loop_steps: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
492 |
"\<lbrakk>inv_loop x cf; x > 0\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
493 |
\<Longrightarrow> inv_loop x (steps cf (tcopy_loop, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
494 |
apply(induct stp, simp add: steps.simps, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
495 |
apply(erule_tac inv_loop_step, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
496 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
497 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
498 |
fun loop_stage :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
499 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
500 |
"loop_stage (s, l, r) = (if s = 0 then 0 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
501 |
else (Suc (length (takeWhile (\<lambda>a. a = Oc) (rev l @ r)))))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
502 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
503 |
fun loop_state :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
504 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
505 |
"loop_state (s, l, r) = (if s = 2 \<and> hd r = Oc then 0 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
506 |
else if s = 1 then 1 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
507 |
else 10 - s)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
508 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
509 |
fun loop_step :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
510 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
511 |
"loop_step (s, l, r) = (if s = 3 then length r |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
512 |
else if s = 4 then length r |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
513 |
else if s = 5 then length l |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
514 |
else if s = 6 then length l |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
515 |
else 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
516 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
517 |
definition lex_triple :: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
518 |
"((nat \<times> (nat \<times> nat)) \<times> (nat \<times> (nat \<times> nat))) set" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
519 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
520 |
"lex_triple \<equiv> less_than <*lex*> lex_pair" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
521 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
522 |
lemma wf_lex_triple: "wf lex_triple" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
523 |
by (auto intro:wf_lex_prod simp:lex_triple_def lex_pair_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
524 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
525 |
fun loop_measure :: "config \<Rightarrow> nat \<times> nat \<times> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
526 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
527 |
"loop_measure c = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
528 |
(loop_stage c, loop_state c, loop_step c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
529 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
530 |
definition loop_LE :: "(config \<times> config) set" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
531 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
532 |
"loop_LE \<equiv> (inv_image lex_triple loop_measure)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
533 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
534 |
lemma wf_loop_le: "wf loop_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
535 |
by(auto intro:wf_inv_image simp: loop_LE_def wf_lex_triple) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
536 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
537 |
lemma [simp]: "inv_loop2 x ([], b) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
538 |
apply(auto simp: inv_loop2.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
539 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
540 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
541 |
lemma [simp]: "inv_loop2 x (l', []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
542 |
apply(auto simp: inv_loop2.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
543 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
544 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
545 |
lemma [simp]: "inv_loop3 x (b, []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
546 |
apply(auto simp: inv_loop3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
547 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
548 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
549 |
lemma [simp]: "inv_loop4 x ([], b) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
550 |
apply(auto simp: inv_loop4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
551 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
552 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
553 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
554 |
"\<lbrakk>inv_loop4 x (l', []); l' \<noteq> []; x > 0; |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
555 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ [Oc])) \<noteq> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
556 |
length (takeWhile (\<lambda>a. a = Oc) (rev l'))\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
557 |
\<Longrightarrow> length (takeWhile (\<lambda>a. a = Oc) (rev l' @ [Oc])) < length (takeWhile (\<lambda>a. a = Oc) (rev l'))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
558 |
apply(auto simp: inv_loop4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
559 |
apply(case_tac [!] j, simp_all add: List.takeWhile_tail) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
560 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
561 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
562 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
563 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
564 |
"\<lbrakk>inv_loop4 x (l', Bk # list); l' \<noteq> []; 0 < x; |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
565 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Oc # list)) \<noteq> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
566 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list))\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
567 |
\<Longrightarrow> length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Oc # list)) < |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
568 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
569 |
apply(auto simp: inv_loop4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
570 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
571 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
572 |
lemma takeWhile_replicate_append: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
573 |
"P a \<Longrightarrow> takeWhile P (a\<up>x @ ys) = a\<up>x @ takeWhile P ys" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
574 |
apply(induct x, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
575 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
576 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
577 |
lemma takeWhile_replicate: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
578 |
"P a \<Longrightarrow> takeWhile P (a\<up>x) = a\<up>x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
579 |
by(induct x, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
580 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
581 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
582 |
"\<lbrakk>inv_loop5 x (l', Bk # list); l' \<noteq> []; 0 < x; |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
583 |
length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Bk # list)) \<noteq> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
584 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list))\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
585 |
\<Longrightarrow> length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Bk # list)) < |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
586 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
587 |
apply(auto simp: inv_loop5.simps inv_loop5_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
588 |
apply(case_tac [!] j, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
589 |
apply(case_tac [!] "nat", simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
590 |
apply(case_tac nata, simp_all add: List.takeWhile_tail) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
591 |
apply(simp add: takeWhile_replicate_append takeWhile_replicate) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
592 |
apply(case_tac nata, simp_all add: List.takeWhile_tail) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
593 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
594 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
595 |
lemma [elim]: "\<lbrakk>inv_loop1 x (l', Oc # list)\<rbrakk> \<Longrightarrow> hd list = Oc" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
596 |
apply(auto simp: inv_loop1.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
597 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
598 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
599 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
600 |
"\<lbrakk>inv_loop6 x (l', Bk # list); l' \<noteq> []; 0 < x; |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
601 |
length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Bk # list)) \<noteq> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
602 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list))\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
603 |
\<Longrightarrow> length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Bk # list)) < |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
604 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
605 |
apply(auto simp: inv_loop6.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
606 |
apply(case_tac l', simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
607 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
608 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
609 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
610 |
"\<lbrakk>inv_loop2 x (l', Oc # list); l' \<noteq> []; 0 < x\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
611 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list)) < |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
612 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Oc # list))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
613 |
apply(auto simp: inv_loop2.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
614 |
apply(simp_all add: takeWhile_tail takeWhile_replicate_append |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
615 |
takeWhile_replicate) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
616 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
617 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
618 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
619 |
"\<lbrakk>inv_loop5 x (l', Oc # list); l' \<noteq> []; 0 < x; |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
620 |
length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Oc # list)) \<noteq> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
621 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Oc # list))\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
622 |
\<Longrightarrow> length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Oc # list)) < |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
623 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Oc # list))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
624 |
apply(auto simp: inv_loop5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
625 |
apply(case_tac l', auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
626 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
627 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
628 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
629 |
lemma[elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
630 |
"\<lbrakk>inv_loop6 x (l', Oc # list); l' \<noteq> []; 0 < x; |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
631 |
length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Oc # list)) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
632 |
\<noteq> length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Oc # list))\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
633 |
\<Longrightarrow> length (takeWhile (\<lambda>a. a = Oc) (rev (tl l') @ hd l' # Oc # list)) < |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
634 |
length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Oc # list))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
635 |
apply(case_tac l') |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
636 |
apply(auto simp: inv_loop6.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
637 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
638 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
639 |
lemma loop_halt: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
640 |
"\<lbrakk>x > 0; inv_loop x (Suc 0, l, r)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
641 |
\<exists> stp. is_final (steps (Suc 0, l, r) (tcopy_loop, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
642 |
proof(rule_tac LE = loop_LE in halt_lemma) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
643 |
show "wf loop_LE" by(intro wf_loop_le) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
644 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
645 |
assume h: "0 < x" and g: "inv_loop x (Suc 0, l, r)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
646 |
show "\<forall>n. \<not> is_final (steps (Suc 0, l, r) (tcopy_loop, 0) n) \<longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
647 |
(steps (Suc 0, l, r) (tcopy_loop, 0) (Suc n), steps (Suc 0, l, r) (tcopy_loop, 0) n) \<in> loop_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
648 |
proof(rule_tac allI, rule_tac impI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
649 |
fix n |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
650 |
assume a: "\<not> is_final (steps (Suc 0, l, r) (tcopy_loop, 0) n)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
651 |
obtain s' l' r' where d: "(steps (Suc 0, l, r) (tcopy_loop, 0) n) = (s', l', r')" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
652 |
by(case_tac "(steps (Suc 0, l, r) (tcopy_loop, 0) n)", auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
653 |
hence "inv_loop x (s', l', r') \<and> s' \<noteq> 0" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
654 |
using h g |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
655 |
apply(drule_tac stp = n in inv_loop_steps, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
656 |
using a |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
657 |
apply(simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
658 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
659 |
hence "(step(s', l', r') (tcopy_loop, 0), s', l', r') \<in> loop_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
660 |
using h |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
661 |
apply(case_tac r', case_tac [2] a) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
662 |
apply(auto simp: inv_loop.simps step.simps tcopy_loop_def |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
663 |
numeral loop_LE_def lex_triple_def lex_pair_def split: if_splits) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
664 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
665 |
thus "(steps (Suc 0, l, r) (tcopy_loop, 0) (Suc n), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
666 |
steps (Suc 0, l, r) (tcopy_loop, 0) n) \<in> loop_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
667 |
using d |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
668 |
apply(simp add: step_red) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
669 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
670 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
671 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
672 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
673 |
lemma loop_correct: |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
674 |
"x > 0 \<Longrightarrow> {inv_loop1 x} tcopy_loop {inv_loop0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
675 |
proof(rule_tac HoareI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
676 |
fix l r |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
677 |
assume h: "0 < x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
678 |
"inv_loop1 x (l, r)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
679 |
hence "\<exists> stp. is_final (steps (Suc 0, l, r) (tcopy_loop, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
680 |
apply(rule_tac loop_halt, simp_all add: inv_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
681 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
682 |
then obtain stp where "is_final (steps (Suc 0, l, r) (tcopy_loop, 0) stp)" .. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
683 |
moreover have "inv_loop x (steps (Suc 0, l, r) (tcopy_loop, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
684 |
apply(rule_tac inv_loop_steps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
685 |
using h by(simp_all add: inv_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
686 |
ultimately show |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
687 |
"\<exists>n. is_final (steps (1, l, r) (tcopy_loop, 0) n) \<and> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
688 |
inv_loop0 x holds_for steps (1, l, r) (tcopy_loop, 0) n" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
689 |
using h |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
690 |
apply(rule_tac x = stp in exI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
691 |
apply(case_tac "(steps (Suc 0, l, r) (tcopy_loop, 0) stp)", |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
692 |
simp add: inv_init.simps inv_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
693 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
694 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
695 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
696 |
definition tcopy_end :: "instr list" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
697 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
698 |
"tcopy_end \<equiv> [(L, 0), (R, 2), (W1, 3), (L, 4), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
699 |
(R, 2), (R, 2), (L, 5), (W0, 4), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
700 |
(R, 0), (L, 5)]" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
701 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
702 |
fun inv_end1 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
703 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
704 |
"inv_end1 x (l, r) = (x > 0 \<and> l = [Bk] \<and> r = Oc # Bk\<up>x @ Oc\<up>x)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
705 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
706 |
fun inv_end2 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
707 |
where |
45
9192a969f044
updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
44
diff
changeset
|
708 |
"inv_end2 x (l, r) = (\<exists> i j. i + j = Suc x \<and> x > 0 \<and> l = Oc\<up>i @ [Bk] \<and> r = Bk\<up>j @ Oc\<up>x)" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
709 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
710 |
fun inv_end3 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
711 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
712 |
"inv_end3 x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
713 |
(\<exists> i j. x > 0 \<and> i + j = x \<and> l = Oc\<up>i @ [Bk] \<and> r = Oc # Bk\<up>j@ Oc\<up>x )" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
714 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
715 |
fun inv_end4 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
716 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
717 |
"inv_end4 x (l, r) = (\<exists> any. x > 0 \<and> l = Oc\<up>x @ [Bk] \<and> r = any#Oc\<up>x)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
718 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
719 |
fun inv_end5_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
720 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
721 |
"inv_end5_loop x (l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
722 |
(\<exists> i j. i + j = x \<and> x > 0 \<and> j > 0 \<and> l = Oc\<up>i @ [Bk] \<and> r = Oc\<up>j @ Bk # Oc\<up>x)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
723 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
724 |
fun inv_end5_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
725 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
726 |
"inv_end5_exit x (l, r) = (x > 0 \<and> l = [] \<and> r = Bk # Oc\<up>x @ Bk # Oc\<up>x)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
727 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
728 |
fun inv_end5 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
729 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
730 |
"inv_end5 x (l, r) = (inv_end5_loop x (l, r) \<or> inv_end5_exit x (l, r))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
731 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
732 |
fun inv_end0 :: "nat \<Rightarrow> tape \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
733 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
734 |
"inv_end0 x (l, r) = (x > 0 \<and> l = [Bk] \<and> r = Oc\<up>x @ Bk # Oc\<up>x)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
735 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
736 |
fun inv_end :: "nat \<Rightarrow> config \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
737 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
738 |
"inv_end x (s, l, r) = (if s = 0 then inv_end0 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
739 |
else if s = 1 then inv_end1 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
740 |
else if s = 2 then inv_end2 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
741 |
else if s = 3 then inv_end3 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
742 |
else if s = 4 then inv_end4 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
743 |
else if s = 5 then inv_end5 x (l, r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
744 |
else False)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
745 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
746 |
declare inv_end.simps[simp del] inv_end1.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
747 |
inv_end0.simps[simp del] inv_end2.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
748 |
inv_end3.simps[simp del] inv_end4.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
749 |
inv_end5.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
750 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
751 |
lemma [simp]: "inv_end1 x (b, []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
752 |
apply(auto simp: inv_end1.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
753 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
754 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
755 |
lemma [simp]: "inv_end2 x (b, []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
756 |
apply(auto simp: inv_end2.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
757 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
758 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
759 |
lemma [simp]: "inv_end3 x (b, []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
760 |
apply(auto simp: inv_end3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
761 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
762 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
763 |
thm inv_end4.simps |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
764 |
lemma [simp]: "inv_end4 x (b, []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
765 |
apply(auto simp: inv_end4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
766 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
767 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
768 |
lemma [simp]: "inv_end5 x (b, []) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
769 |
apply(auto simp: inv_end5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
770 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
771 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
772 |
lemma [simp]: "inv_end1 x ([], list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
773 |
apply(auto simp: inv_end1.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
774 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
775 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
776 |
lemma [elim]: "\<lbrakk>0 < x; inv_end1 x (b, Bk # list); b \<noteq> []\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
777 |
\<Longrightarrow> inv_end0 x (tl b, hd b # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
778 |
apply(auto simp: inv_end1.simps inv_end0.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
779 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
780 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
781 |
lemma [elim]: "\<lbrakk>0 < x; inv_end2 x (b, Bk # list)\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
782 |
\<Longrightarrow> inv_end3 x (b, Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
783 |
apply(auto simp: inv_end2.simps inv_end3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
784 |
apply(rule_tac x = "j - 1" in exI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
785 |
apply(case_tac j, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
786 |
apply(case_tac x, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
787 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
788 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
789 |
lemma [elim]: "\<lbrakk>0 < x; inv_end3 x (b, Bk # list)\<rbrakk> \<Longrightarrow> inv_end2 x (Bk # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
790 |
apply(auto simp: inv_end2.simps inv_end3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
791 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
792 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
793 |
lemma [elim]: "\<lbrakk>0 < x; inv_end4 x ([], Bk # list)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
794 |
inv_end5 x ([], Bk # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
795 |
apply(auto simp: inv_end4.simps inv_end5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
796 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
797 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
798 |
lemma [elim]: "\<lbrakk>0 < x; inv_end4 x (b, Bk # list); b \<noteq> []\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
799 |
inv_end5 x (tl b, hd b # Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
800 |
apply(auto simp: inv_end4.simps inv_end5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
801 |
apply(rule_tac x = 1 in exI, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
802 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
803 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
804 |
lemma [elim]: "\<lbrakk>0 < x; inv_end5 x (b, Bk # list)\<rbrakk> \<Longrightarrow> inv_end0 x (Bk # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
805 |
apply(auto simp: inv_end5.simps inv_end0.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
806 |
apply(case_tac [!] j, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
807 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
808 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
809 |
lemma [elim]: "\<lbrakk>0 < x; inv_end1 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_end2 x (Oc # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
810 |
apply(auto simp: inv_end1.simps inv_end2.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
811 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
812 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
813 |
lemma [elim]: "\<lbrakk>0 < x; inv_end2 x ([], Oc # list)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
814 |
inv_end4 x ([], Bk # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
815 |
apply(auto simp: inv_end2.simps inv_end4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
816 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
817 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
818 |
lemma [elim]: "\<lbrakk>0 < x; inv_end2 x (b, Oc # list); b \<noteq> []\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
819 |
inv_end4 x (tl b, hd b # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
820 |
apply(auto simp: inv_end2.simps inv_end4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
821 |
apply(case_tac [!] j, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
822 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
823 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
824 |
lemma [elim]: "\<lbrakk>0 < x; inv_end3 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_end2 x (Oc # b, list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
825 |
apply(auto simp: inv_end2.simps inv_end3.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
826 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
827 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
828 |
lemma [elim]: "\<lbrakk>0 < x; inv_end4 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_end4 x (b, Bk # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
829 |
apply(auto simp: inv_end2.simps inv_end4.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
830 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
831 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
832 |
lemma [elim]: "\<lbrakk>0 < x; inv_end5 x ([], Oc # list)\<rbrakk> \<Longrightarrow> inv_end5 x ([], Bk # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
833 |
apply(auto simp: inv_end2.simps inv_end5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
834 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
835 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
836 |
declare inv_end5_loop.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
837 |
inv_end5_exit.simps[simp del] |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
838 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
839 |
lemma [simp]: "inv_end5_exit x (b, Oc # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
840 |
apply(auto simp: inv_end5_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
841 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
842 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
843 |
lemma [simp]: "inv_end5_loop x (tl b, Bk # Oc # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
844 |
apply(auto simp: inv_end5_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
845 |
apply(case_tac [!] j, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
846 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
847 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
848 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
849 |
"\<lbrakk>0 < x; inv_end5_loop x (b, Oc # list); b \<noteq> []; hd b = Bk\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
850 |
inv_end5_exit x (tl b, Bk # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
851 |
apply(auto simp: inv_end5_loop.simps inv_end5_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
852 |
apply(case_tac [!] i, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
853 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
854 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
855 |
lemma [elim]: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
856 |
"\<lbrakk>0 < x; inv_end5_loop x (b, Oc # list); b \<noteq> []; hd b = Oc\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
857 |
inv_end5_loop x (tl b, Oc # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
858 |
apply(simp only: inv_end5_loop.simps inv_end5_exit.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
859 |
apply(erule_tac exE)+ |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
860 |
apply(rule_tac x = "i - 1" in exI, |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
861 |
rule_tac x = "Suc j" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
862 |
apply(case_tac [!] i, simp_all) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
863 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
864 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
865 |
lemma [elim]: "\<lbrakk>0 < x; inv_end5 x (b, Oc # list); b \<noteq> []\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
866 |
inv_end5 x (tl b, hd b # Oc # list)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
867 |
apply(simp add: inv_end2.simps inv_end5.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
868 |
apply(case_tac "hd b", simp_all, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
869 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
870 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
871 |
lemma inv_end_step: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
872 |
"\<lbrakk>x > 0; |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
873 |
inv_end x cf\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
874 |
\<Longrightarrow> inv_end x (step cf (tcopy_end, 0))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
875 |
apply(case_tac cf, case_tac c, case_tac [2] aa) |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
876 |
apply(auto simp: inv_end.simps step.simps tcopy_end_def numeral split: if_splits) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
877 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
878 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
879 |
lemma inv_end_steps: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
880 |
"\<lbrakk>x > 0; inv_end x cf\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
881 |
\<Longrightarrow> inv_end x (steps cf (tcopy_end, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
882 |
apply(induct stp, simp add:steps.simps, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
883 |
apply(erule_tac inv_end_step, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
884 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
885 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
886 |
fun end_state :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
887 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
888 |
"end_state (s, l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
889 |
(if s = 0 then 0 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
890 |
else if s = 1 then 5 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
891 |
else if s = 2 \<or> s = 3 then 4 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
892 |
else if s = 4 then 3 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
893 |
else if s = 5 then 2 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
894 |
else 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
895 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
896 |
fun end_stage :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
897 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
898 |
"end_stage (s, l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
899 |
(if s = 2 \<or> s = 3 then (length r) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
900 |
else 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
901 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
902 |
fun end_step :: "config \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
903 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
904 |
"end_step (s, l, r) = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
905 |
(if s = 4 then (if hd r = Oc then 1 else 0) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
906 |
else if s = 5 then length l |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
907 |
else if s = 2 then 1 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
908 |
else if s = 3 then 0 |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
909 |
else 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
910 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
911 |
fun end_measure :: "config \<Rightarrow> nat \<times> nat \<times> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
912 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
913 |
"end_measure c = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
914 |
(end_state c, end_stage c, end_step c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
915 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
916 |
definition end_LE :: "(config \<times> config) set" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
917 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
918 |
"end_LE \<equiv> (inv_image lex_triple end_measure)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
919 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
920 |
lemma wf_end_le: "wf end_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
921 |
by(auto intro:wf_inv_image simp: end_LE_def wf_lex_triple) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
922 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
923 |
lemma [simp]: "inv_end5 x ([], Oc # list) = False" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
924 |
apply(auto simp: inv_end5.simps inv_end5_loop.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
925 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
926 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
927 |
lemma end_halt: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
928 |
"\<lbrakk>x > 0; inv_end x (Suc 0, l, r)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
929 |
\<exists> stp. is_final (steps (Suc 0, l, r) (tcopy_end, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
930 |
proof(rule_tac LE = end_LE in halt_lemma) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
931 |
show "wf end_LE" by(intro wf_end_le) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
932 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
933 |
assume great: "0 < x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
934 |
and inv_start: "inv_end x (Suc 0, l, r)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
935 |
show "\<forall>n. \<not> is_final (steps (Suc 0, l, r) (tcopy_end, 0) n) \<longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
936 |
(steps (Suc 0, l, r) (tcopy_end, 0) (Suc n), steps (Suc 0, l, r) (tcopy_end, 0) n) \<in> end_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
937 |
proof(rule_tac allI, rule_tac impI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
938 |
fix n |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
939 |
assume notfinal: "\<not> is_final (steps (Suc 0, l, r) (tcopy_end, 0) n)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
940 |
obtain s' l' r' where d: "steps (Suc 0, l, r) (tcopy_end, 0) n = (s', l', r')" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
941 |
apply(case_tac "steps (Suc 0, l, r) (tcopy_end, 0) n", auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
942 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
943 |
hence "inv_end x (s', l', r') \<and> s' \<noteq> 0" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
944 |
using great inv_start notfinal |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
945 |
apply(drule_tac stp = n in inv_end_steps, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
946 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
947 |
hence "(step (s', l', r') (tcopy_end, 0), s', l', r') \<in> end_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
948 |
apply(case_tac r', case_tac [2] a) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
949 |
apply(auto simp: inv_end.simps step.simps tcopy_end_def |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
950 |
numeral end_LE_def lex_triple_def lex_pair_def split: if_splits) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
951 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
952 |
thus "(steps (Suc 0, l, r) (tcopy_end, 0) (Suc n), |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
953 |
steps (Suc 0, l, r) (tcopy_end, 0) n) \<in> end_LE" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
954 |
using d |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
955 |
by simp |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
956 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
957 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
958 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
959 |
lemma end_correct: |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
960 |
"x > 0 \<Longrightarrow> {inv_end1 x} tcopy_end {inv_end0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
961 |
proof(rule_tac HoareI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
962 |
fix l r |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
963 |
assume h: "0 < x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
964 |
"inv_end1 x (l, r)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
965 |
hence "\<exists> stp. is_final (steps (Suc 0, l, r) (tcopy_end, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
966 |
apply(rule_tac end_halt, simp_all add: inv_end.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
967 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
968 |
then obtain stp where "is_final (steps (Suc 0, l, r) (tcopy_end, 0) stp)" .. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
969 |
moreover have "inv_end x (steps (Suc 0, l, r) (tcopy_end, 0) stp)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
970 |
apply(rule_tac inv_end_steps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
971 |
using h by(simp_all add: inv_end.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
972 |
ultimately show |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
973 |
"\<exists>n. is_final (steps (1, l, r) (tcopy_end, 0) n) \<and> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
974 |
inv_end0 x holds_for steps (1, l, r) (tcopy_end, 0) n" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
975 |
using h |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
976 |
apply(rule_tac x = stp in exI) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
977 |
apply(case_tac "(steps (Suc 0, l, r) (tcopy_end, 0) stp)", |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
978 |
simp add: inv_end.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
979 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
980 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
981 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
982 |
definition tcopy :: "instr list" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
983 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
984 |
"tcopy = ((tcopy_init |+| tcopy_loop) |+| tcopy_end)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
985 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
986 |
lemma [intro]: "tm_wf (tcopy_init, 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
987 |
by(auto simp: tm_wf.simps tcopy_init_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
988 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
989 |
lemma [intro]: "tm_wf (tcopy_loop, 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
990 |
by(auto simp: tm_wf.simps tcopy_loop_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
991 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
992 |
lemma [intro]: "tm_wf (tcopy_end, 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
993 |
by(auto simp: tm_wf.simps tcopy_end_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
994 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
995 |
lemma [intro]: "\<lbrakk>tm_wf (A, 0); tm_wf (B, 0)\<rbrakk> \<Longrightarrow> tm_wf (A |+| B, 0)" |
56
0838b0ac52ab
some small changes to turing and uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
55
diff
changeset
|
996 |
apply(auto simp: tm_wf.simps shift.simps adjust.simps tm_comp_length |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
997 |
tm_comp.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
998 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
999 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1000 |
lemma tcopy_correct1: |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
1001 |
"\<lbrakk>x > 0\<rbrakk> \<Longrightarrow> {inv_init1 x} tcopy {inv_end0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1002 |
proof(simp add: tcopy_def, rule_tac Hoare_plus_halt) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1003 |
show "inv_loop0 x \<mapsto> inv_end1 x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1004 |
by(auto simp: inv_end1.simps inv_loop1.simps assert_imp_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1005 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1006 |
show "tm_wf (tcopy_init |+| tcopy_loop, 0)" by auto |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1007 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1008 |
assume "0 < x" |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
1009 |
thus "{inv_init1 x} (tcopy_init |+| tcopy_loop) {inv_loop0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1010 |
proof(rule_tac Hoare_plus_halt) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1011 |
show "inv_init0 x \<mapsto> inv_loop1 x" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1012 |
apply(auto simp: inv_init0.simps inv_loop1.simps assert_imp_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1013 |
apply(rule_tac x = "Suc 0" in exI, auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1014 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1015 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1016 |
show "tm_wf (tcopy_init, 0)" by auto |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1017 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1018 |
assume "0 < x" |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
1019 |
thus "{inv_init1 x} tcopy_init {inv_init0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1020 |
by(erule_tac init_correct) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1021 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1022 |
assume "0 < x" |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
1023 |
thus "{inv_loop1 x} tcopy_loop {inv_loop0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1024 |
by(erule_tac loop_correct) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1025 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1026 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1027 |
assume "0 < x" |
54
e7d845acb0a7
changed slightly HOARE-def
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
47
diff
changeset
|
1028 |
thus "{inv_end1 x} tcopy_end {inv_end0 x}" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1029 |
by(erule_tac end_correct) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1030 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1031 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1032 |
section {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1033 |
The {\em Dithering} Turing Machine |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1034 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1035 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1036 |
text {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1037 |
The {\em Dithering} TM, when the input is @{text "1"}, it will loop forever, otherwise, it will |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1038 |
terminate. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1039 |
*} |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1040 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1041 |
definition dither :: "instr list" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1042 |
where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1043 |
"dither \<equiv> [(W0, 1), (R, 2), (L, 1), (L, 0)] " |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1044 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1045 |
lemma dither_unhalt_state: |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1046 |
"(steps0 (1, Bk \<up> m, [Oc]) dither stp = (1, Bk \<up> m, [Oc])) \<or> |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1047 |
(steps0 (1, Bk \<up> m, [Oc]) dither stp = (2, Oc # Bk \<up> m, []))" |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1048 |
apply(induct stp) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1049 |
apply(simp add: steps.simps) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1050 |
apply(simp add: step_red) |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
1051 |
apply(auto simp: step.simps fetch.simps dither_def numeral) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1052 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1053 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1054 |
lemma dither_unhalt_rs: |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1055 |
shows "\<not> is_final (steps0 (1, Bk \<up> m, [Oc]) dither stp)" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1056 |
using dither_unhalt_state[of m stp] |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1057 |
by auto |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1058 |
|
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1059 |
lemma dither_loops: |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1060 |
shows "{(\<lambda>(l, r). (\<exists>nd. l = Bk \<up> nd) \<and> r = [Oc])} dither \<up>" |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1061 |
apply(rule Hoare_unhaltI) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1062 |
using dither_unhalt_rs |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1063 |
apply(auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1064 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1065 |
|
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1066 |
lemma dither_halt_rs: |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1067 |
"\<exists>stp. steps0 (Suc 0, Bk \<up> m, [Oc, Oc]) dither stp = (0, Bk \<up> m, [Oc, Oc])" |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1068 |
unfolding dither_def |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1069 |
apply(rule_tac x = "3" in exI) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1070 |
apply(simp add: steps.simps step.simps fetch.simps numeral) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1071 |
done |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1072 |
|
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1073 |
definition |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1074 |
"dither_halt_inv \<equiv> (\<lambda>(l, r). (\<exists>nd. l = Bk \<up> nd) \<and> r = [Oc, Oc])" |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1075 |
|
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1076 |
lemma dither_halts: |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1077 |
shows "{dither_halt_inv} dither {dither_halt_inv}" |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1078 |
unfolding dither_halt_inv_def |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1079 |
apply(rule HoareI) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1080 |
using dither_halt_rs |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1081 |
apply(auto) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1082 |
by (metis (lifting, mono_tags) holds_for.simps is_final_eq prod.cases) |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1083 |
|
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1084 |
|
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1085 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1086 |
section {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1087 |
The final diagnal arguments to show the undecidability of Halting problem. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1088 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1089 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1090 |
text {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1091 |
@{text "haltP tp x"} means TM @{text "tp"} terminates on input @{text "x"} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1092 |
and the final configuration is standard. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1093 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1094 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1095 |
definition haltP :: "tprog \<Rightarrow> nat list \<Rightarrow> bool" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1096 |
where |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1097 |
"haltP p lm = (\<exists>n a b c. steps (Suc 0, [], <lm>) p n = (0, Bk\<up>a, Oc\<up>b @ Bk\<up>c))" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1098 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1099 |
|
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1100 |
abbreviation |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1101 |
"haltP0 p lm \<equiv> haltP (p, 0) lm" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1102 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1103 |
lemma [intro, simp]: "tm_wf0 tcopy" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1104 |
by(auto simp: tcopy_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1105 |
|
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1106 |
lemma [intro, simp]: "tm_wf0 dither" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1107 |
by (auto simp: tm_wf.simps dither_def) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1108 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1109 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1110 |
text {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1111 |
The following lemma shows the meaning of @{text "tinres"} with respect to |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1112 |
one step execution. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1113 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1114 |
lemma tinres_step: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1115 |
"\<lbrakk>tinres l l'; step (ss, l, r) (t, 0) = (sa, la, ra); |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1116 |
step (ss, l', r) (t, 0) = (sb, lb, rb)\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1117 |
\<Longrightarrow> tinres la lb \<and> ra = rb \<and> sa = sb" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1118 |
apply(case_tac ss, case_tac [!]r, case_tac [!] "a::cell") |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1119 |
apply(auto simp: step.simps fetch.simps |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1120 |
split: if_splits ) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1121 |
apply(case_tac [!] "t ! (2 * nat)", |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1122 |
auto simp: tinres_def split: if_splits) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1123 |
apply(case_tac [1-8] a, auto split: if_splits) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1124 |
apply(case_tac [!] "t ! (2 * nat)", |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1125 |
auto simp: tinres_def split: if_splits) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1126 |
apply(case_tac [1-4] a, auto split: if_splits) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1127 |
apply(case_tac [!] "t ! Suc (2 * nat)", |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1128 |
auto simp: if_splits) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1129 |
apply(case_tac [!] aa, auto split: if_splits) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1130 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1131 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1132 |
text {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1133 |
The following lemma shows the meaning of @{text "tinres"} with respect to |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1134 |
many step execution. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1135 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1136 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1137 |
lemma tinres_steps: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1138 |
"\<lbrakk>tinres l l'; steps (ss, l, r) (t, 0) stp = (sa, la, ra); |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1139 |
steps (ss, l', r) (t, 0) stp = (sb, lb, rb)\<rbrakk> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1140 |
\<Longrightarrow> tinres la lb \<and> ra = rb \<and> sa = sb" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1141 |
apply(induct stp arbitrary: sa la ra sb lb rb, simp add: steps.simps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1142 |
apply(simp add: step_red) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1143 |
apply(case_tac "(steps (ss, l, r) (t, 0) stp)") |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1144 |
apply(case_tac "(steps (ss, l', r) (t, 0) stp)") |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1145 |
proof - |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1146 |
fix stp sa la ra sb lb rb a b c aa ba ca |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1147 |
assume ind: "\<And>sa la ra sb lb rb. \<lbrakk>steps (ss, l, r) (t, 0) stp = (sa, (la::cell list), ra); |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1148 |
steps (ss, l', r) (t, 0) stp = (sb, lb, rb)\<rbrakk> \<Longrightarrow> tinres la lb \<and> ra = rb \<and> sa = sb" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1149 |
and h: " tinres l l'" "step (steps (ss, l, r) (t, 0) stp) (t, 0) = (sa, la, ra)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1150 |
"step (steps (ss, l', r) (t, 0) stp) (t, 0) = (sb, lb, rb)" "steps (ss, l, r) (t, 0) stp = (a, b, c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1151 |
"steps (ss, l', r) (t, 0) stp = (aa, ba, ca)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1152 |
have "tinres b ba \<and> c = ca \<and> a = aa" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1153 |
apply(rule_tac ind, simp_all add: h) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1154 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1155 |
thus "tinres la lb \<and> ra = rb \<and> sa = sb" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1156 |
apply(rule_tac l = b and l' = ba and r = c and ss = a |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1157 |
and t = t in tinres_step) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1158 |
using h |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1159 |
apply(simp, simp, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1160 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1161 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1162 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1163 |
lemma length_eq: "xs = ys \<Longrightarrow> length xs = length ys" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1164 |
by auto |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1165 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1166 |
lemma tinres_ex1: "tinres (Bk \<up> nb) b \<Longrightarrow> \<exists>nb. b = Bk \<up> nb" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1167 |
apply(auto simp: tinres_def replicate_add[THEN sym]) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1168 |
apply(case_tac "nb \<ge> n") |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1169 |
apply(subgoal_tac "\<exists> d. nb = d + n", auto simp: replicate_add) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1170 |
apply arith |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1171 |
apply(drule_tac length_eq, simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1172 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1173 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1174 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1175 |
text {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1176 |
The following locale specifies that TM @{text "H"} can be used to solve |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1177 |
the {\em Halting Problem} and @{text "False"} is going to be derived |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1178 |
under this locale. Therefore, the undecidability of {\em Halting Problem} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1179 |
is established. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1180 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1181 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1182 |
locale uncomputable = |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1183 |
-- {* The coding function of TM, interestingly, the detailed definition of this |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1184 |
funciton @{text "code"} does not affect the final result. *} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1185 |
fixes code :: "instr list \<Rightarrow> nat" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1186 |
-- {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1187 |
The TM @{text "H"} is the one which is assummed being able to solve the Halting problem. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1188 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1189 |
and H :: "instr list" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1190 |
assumes h_wf[intro]: "tm_wf (H, 0)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1191 |
-- {* |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1192 |
The following two assumptions specifies that @{text "H"} does solve the Halting problem. |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1193 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1194 |
and h_case: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1195 |
"\<And> M n. \<lbrakk>(haltP (M, 0) lm)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1196 |
\<exists> na nb. (steps (Suc 0, [], <code M # lm>) (H, 0) na = (0, Bk\<up>nb, [Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1197 |
and nh_case: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1198 |
"\<And> M n. \<lbrakk>(\<not> haltP (M, 0) lm)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1199 |
\<exists> na nb. (steps (Suc 0, [], <code M # lm>) (H, 0) na = (0, Bk\<up>nb, [Oc, Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1200 |
begin |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1201 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1202 |
lemma h_newcase: |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1203 |
"\<And> M n. haltP (M, 0) lm \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1204 |
\<exists> na nb. (steps (Suc 0, Bk\<up>x , <code M # lm>) (H, 0) na = (0, Bk\<up>nb, [Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1205 |
proof - |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1206 |
fix M n |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1207 |
assume "haltP (M, 0) lm" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1208 |
hence "\<exists> na nb. (steps (Suc 0, [], <code M # lm>) (H, 0) na |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1209 |
= (0, Bk\<up>nb, [Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1210 |
apply(erule_tac h_case) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1211 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1212 |
from this obtain na nb where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1213 |
cond1:"(steps (Suc 0, [], <code M # lm>) (H, 0) na |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1214 |
= (0, Bk\<up>nb, [Oc]))" by blast |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1215 |
thus "\<exists> na nb. (steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na = (0, Bk\<up>nb, [Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1216 |
proof(rule_tac x = na in exI, case_tac "steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na", simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1217 |
fix a b c |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1218 |
assume cond2: "steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na = (a, b, c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1219 |
have "tinres (Bk\<up>nb) b \<and> [Oc] = c \<and> 0 = a" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1220 |
proof(rule_tac tinres_steps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1221 |
show "tinres [] (Bk\<up>x)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1222 |
apply(simp add: tinres_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1223 |
apply(auto) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1224 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1225 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1226 |
show "(steps (Suc 0, [], <code M # lm>) (H, 0) na |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1227 |
= (0, Bk\<up>nb, [Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1228 |
by(simp add: cond1) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1229 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1230 |
show "steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na = (a, b, c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1231 |
by(simp add: cond2) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1232 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1233 |
thus "a = 0 \<and> (\<exists>nb. b = (Bk\<up>nb)) \<and> c = [Oc]" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1234 |
by(auto elim: tinres_ex1) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1235 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1236 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1237 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1238 |
lemma nh_newcase: "\<And> M n. \<lbrakk>\<not> (haltP (M, 0) lm)\<rbrakk> \<Longrightarrow> |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1239 |
\<exists> na nb. (steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na = (0, Bk\<up>nb, [Oc, Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1240 |
proof - |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1241 |
fix M n |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1242 |
assume "\<not> haltP (M, 0) lm" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1243 |
hence "\<exists> na nb. (steps (Suc 0, [], <code M # lm>) (H, 0) na |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1244 |
= (0, Bk\<up>nb, [Oc, Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1245 |
apply(erule_tac nh_case) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1246 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1247 |
from this obtain na nb where |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1248 |
cond1: "(steps (Suc 0, [], <code M # lm>) (H, 0) na |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1249 |
= (0, Bk\<up>nb, [Oc, Oc]))" by blast |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1250 |
thus "\<exists> na nb. (steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na = (0, Bk\<up>nb, [Oc, Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1251 |
proof(rule_tac x = na in exI, case_tac "steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na", simp) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1252 |
fix a b c |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1253 |
assume cond2: "steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na = (a, b, c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1254 |
have "tinres (Bk\<up>nb) b \<and> [Oc, Oc] = c \<and> 0 = a" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1255 |
proof(rule_tac tinres_steps) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1256 |
show "tinres [] (Bk\<up>x)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1257 |
apply(auto simp: tinres_def) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1258 |
done |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1259 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1260 |
show "(steps (Suc 0, [], <code M # lm>) (H, 0) na |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1261 |
= (0, Bk\<up>nb, [Oc, Oc]))" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1262 |
by(simp add: cond1) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1263 |
next |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1264 |
show "steps (Suc 0, Bk\<up>x, <code M # lm>) (H, 0) na = (a, b, c)" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1265 |
by(simp add: cond2) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1266 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1267 |
thus "a = 0 \<and> (\<exists>nb. b = Bk\<up>nb) \<and> c = [Oc, Oc]" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1268 |
by(auto elim: tinres_ex1) |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1269 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1270 |
qed |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1271 |
|
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1272 |
(* TM that produces the contradiction *) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1273 |
definition tcontra :: "instr list \<Rightarrow> instr list" |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1274 |
where |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1275 |
"tcontra h \<equiv> (tcopy |+| h) |+| dither" |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1276 |
|
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1277 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1278 |
lemma uh_h: |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1279 |
assumes "\<not> haltP0 (tcontra H) [code (tcontra H)]" |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1280 |
shows "False" |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1281 |
proof - |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1282 |
(* code of tcontra *) |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1283 |
def code_tcontra \<equiv> "(code (tcontra H))" |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1284 |
have assms': "\<not> haltP0 (tcontra H) [code_tcontra]" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1285 |
using assms by (simp add: code_tcontra_def) |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1286 |
|
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1287 |
(* invariants *) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1288 |
def P1 \<equiv> "\<lambda>(l::cell list, r::cell list). (l = [] \<and> r = <[code_tcontra]>)" |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1289 |
def P2 \<equiv> "\<lambda>(l::cell list, r::cell list). (l = [Bk] \<and> r = <[code_tcontra, code_tcontra]>)" |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1290 |
def P3 \<equiv> dither_halt_inv |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1291 |
|
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1292 |
(* |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1293 |
{P1} tcopy {P2} {P2} H {P3} |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1294 |
---------------------------- |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1295 |
{P1} (tcopy |+| H) {P3} {P3} dither {P3} |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1296 |
------------------------------------------------ |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1297 |
{P1} (tcontra H) {P3} |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1298 |
*) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1299 |
|
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1300 |
have H_wf: "tm_wf0 (tcopy |+| H)" by auto |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1301 |
|
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1302 |
(* {P1} (tcopy |+| H) {P3} *) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1303 |
have first: "{P1} (tcopy |+| H) {P3}" |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1304 |
proof (induct rule: Hoare_plus_halt_simple) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1305 |
case A_halt (* of tcopy *) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1306 |
have "{inv_init1 (Suc code_tcontra)} tcopy {inv_end0 (Suc code_tcontra)}" |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1307 |
unfolding code_tcontra_def |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1308 |
by (rule tcopy_correct1) (simp) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1309 |
moreover |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1310 |
have "P1 \<mapsto> inv_init1 (Suc code_tcontra)" unfolding P1_def |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1311 |
by (simp add: assert_imp_def tape_of_nl_abv) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1312 |
moreover |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1313 |
have "inv_end0 (Suc code_tcontra) \<mapsto> P2" unfolding P2_def code_tcontra_def |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1314 |
by (simp add: assert_imp_def inv_end0.simps tape_of_nl_abv) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1315 |
ultimately |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1316 |
show "{P1} tcopy {P2}" by (rule Hoare_weak) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1317 |
next |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1318 |
case B_halt |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1319 |
obtain n i |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1320 |
where "steps0 (1, Bk \<up> 1, <[code_tcontra, code_tcontra]>) H n = (0, Bk \<up> i, [Oc, Oc])" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1321 |
using nh_newcase[of "tcontra H" "[code_tcontra]" 1, OF assms', folded code_tcontra_def] |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1322 |
by (auto) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1323 |
then show "{P2} H {P3}" |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1324 |
unfolding P2_def P3_def dither_halt_inv_def |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1325 |
unfolding Hoare_def |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1326 |
apply(auto) |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1327 |
apply(rule_tac x = n in exI) |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1328 |
apply(simp) |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1329 |
done |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1330 |
qed (simp) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1331 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1332 |
(* {P3} dither {P3} *) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1333 |
have second: "{P3} dither {P3}" unfolding P3_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1334 |
by (rule dither_halts) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1335 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1336 |
(* {P1} tcontra {P3} *) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1337 |
have "{P1} (tcontra H) {P3}" unfolding tcontra_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1338 |
by (rule Hoare_plus_halt_simple[OF first second H_wf]) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1339 |
|
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1340 |
with assms' show "False" |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1341 |
unfolding P1_def P3_def dither_halt_inv_def code_tcontra_def |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1342 |
unfolding haltP_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1343 |
unfolding Hoare_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1344 |
apply(auto) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1345 |
apply(erule_tac x = n in allE) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1346 |
apply(case_tac "steps0 (Suc 0, [], <[code (tcontra H)]>) (tcontra H) n") |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1347 |
apply(simp, auto) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1348 |
apply(erule_tac x = 2 in allE, erule_tac x = 0 in allE) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1349 |
apply(simp) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1350 |
by (smt replicate_0 replicate_Suc) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1351 |
qed |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1352 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1353 |
lemma h_uh: |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1354 |
assumes "haltP0 (tcontra H) [code (tcontra H)]" |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1355 |
shows "False" |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1356 |
proof - |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1357 |
(* code of tcontra *) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1358 |
def code_tcontra \<equiv> "(code (tcontra H))" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1359 |
have assms': "haltP0 (tcontra H) [code_tcontra]" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1360 |
using assms by (simp add: code_tcontra_def) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1361 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1362 |
(* invariants *) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1363 |
def P1 \<equiv> "\<lambda>(l::cell list, r::cell list). (l = [] \<and> r = <[code_tcontra]>)" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1364 |
def P2 \<equiv> "\<lambda>(l::cell list, r::cell list). (l = [Bk] \<and> r = <[code_tcontra, code_tcontra]>)" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1365 |
def P3 \<equiv> "\<lambda>(l::cell list, r::cell list). (\<exists>nd. l = Bk \<up> nd) \<and> r = [Oc]" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1366 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1367 |
(* |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1368 |
{P1} tcopy {P2} {P2} H {P3} |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1369 |
---------------------------- |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1370 |
{P1} (tcopy |+| H) {P3} {P3} dither loops |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1371 |
------------------------------------------------ |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1372 |
{P1} (tcontra H) loops |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1373 |
*) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1374 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1375 |
have H_wf: "tm_wf0 (tcopy |+| H)" by auto |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1376 |
|
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1377 |
(* {P1} (tcopy |+| H) {P3} *) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1378 |
have first: "{P1} (tcopy |+| H) {P3}" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1379 |
proof (induct rule: Hoare_plus_halt_simple) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1380 |
case A_halt (* of tcopy *) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1381 |
have "{inv_init1 (Suc code_tcontra)} tcopy {inv_end0 (Suc code_tcontra)}" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1382 |
unfolding code_tcontra_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1383 |
by (rule tcopy_correct1) (simp) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1384 |
moreover |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1385 |
have "P1 \<mapsto> inv_init1 (Suc code_tcontra)" unfolding P1_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1386 |
by (simp add: assert_imp_def tape_of_nl_abv) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1387 |
moreover |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1388 |
have "inv_end0 (Suc code_tcontra) \<mapsto> P2" unfolding P2_def code_tcontra_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1389 |
by (simp add: assert_imp_def inv_end0.simps tape_of_nl_abv) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1390 |
ultimately |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1391 |
show "{P1} tcopy {P2}" by (rule Hoare_weak) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1392 |
next |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1393 |
case B_halt |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1394 |
obtain n i |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1395 |
where "steps0 (1, Bk \<up> 1, <[code_tcontra, code_tcontra]>) H n = (0, Bk \<up> i, [Oc])" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1396 |
using h_newcase[of "tcontra H" "[code_tcontra]" 1, OF assms', folded code_tcontra_def] |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1397 |
by (auto) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1398 |
then show "{P2} H {P3}" |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1399 |
unfolding P2_def P3_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1400 |
unfolding Hoare_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1401 |
apply(auto) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1402 |
apply(rule_tac x = n in exI) |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1403 |
apply(simp) |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1404 |
done |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1405 |
qed (simp) |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1406 |
|
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1407 |
(* {P3} dither loops *) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1408 |
have second: "{P3} dither \<up>" unfolding P3_def |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1409 |
by (rule dither_loops) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1410 |
|
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1411 |
(* {P1} tcontra loops *) |
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1412 |
have "{P1} (tcontra H) \<up>" unfolding tcontra_def |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1413 |
by (rule Hoare_plus_unhalt_simple[OF first second H_wf]) |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1414 |
|
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1415 |
with assms show "False" |
65
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1416 |
unfolding haltP_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1417 |
unfolding P1_def code_tcontra_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1418 |
unfolding Hoare_unhalt_def |
0349fa7f5595
also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
64
diff
changeset
|
1419 |
by (auto, metis is_final_eq) |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1420 |
qed |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1421 |
|
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1422 |
|
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1423 |
|
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
1424 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1425 |
text {* |
64
5c74f6b38a63
updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
63
diff
changeset
|
1426 |
@{text "False"} can finally derived. |
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1427 |
*} |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1428 |
|
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1429 |
lemma false: "False" |
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1430 |
using uh_h h_uh by auto |
63
35fe8fe12e65
small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
61
diff
changeset
|
1431 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1432 |
end |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1433 |
|
66
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1434 |
declare replicate_Suc[simp del] |
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1435 |
|
4a3cd7d70ec2
tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
65
diff
changeset
|
1436 |
|
44
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1437 |
end |
2f765afc1f7e
added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff
changeset
|
1438 |