thys/Uncomputable.thy
author Christian Urban <christian dot urban at kcl dot ac dot uk>
Sun, 10 Feb 2013 19:49:07 +0000
changeset 163 67063c5365e1
parent 141 thys/uncomputable.thy@4d7a568bd911
child 168 d7570dbf9f06
permissions -rwxr-xr-x
changed theory names to uppercase
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
163
67063c5365e1 changed theory names to uppercase
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 141
diff changeset
     8
theory Uncomputable
67063c5365e1 changed theory names to uppercase
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 141
diff changeset
     9
imports 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
lemma numeral:
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
    13
  shows "1 = Suc 0"
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
    14
  and "2 = Suc 1"
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
    15
  and "3 = Suc 2"
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
    16
  and "4 = Suc 3" 
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
    17
  and "5 = Suc 4" 
112
fea23f9a9d85 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 109
diff changeset
    18
  and "6 = Suc 5" 
fea23f9a9d85 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 109
diff changeset
    19
  and "7 = Suc 6"
fea23f9a9d85 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 109
diff changeset
    20
  and "8 = Suc 7" 
fea23f9a9d85 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 109
diff changeset
    21
  and "9 = Suc 8" 
fea23f9a9d85 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 109
diff changeset
    22
  and "10 = Suc 9" 
fea23f9a9d85 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 109
diff changeset
    23
  by arith+
63
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
    24
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    25
text {*
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    26
  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
    27
*}
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    28
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    29
definition 
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    30
  tcopy_begin :: "instr list"
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    31
where
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    32
  "tcopy_begin \<equiv> [(W0, 0), (R, 2), (R, 3), (R, 2),
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    33
                 (W1, 3), (L, 4), (L, 4), (L, 0)]"
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    34
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    35
definition 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    36
  tcopy_loop :: "instr list"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    37
where
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    38
  "tcopy_loop \<equiv> [(R, 0), (R, 2),  (R, 3), (W0, 2),
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    39
                 (R, 3), (R, 4), (W1, 5), (R, 4),
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    40
                 (L, 6), (L, 5), (L, 6), (L, 1)]"
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    41
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    42
definition 
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    43
  tcopy_end :: "instr list"
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    44
where
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    45
  "tcopy_end \<equiv> [(L, 0), (R, 2), (W1, 3), (L, 4),
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    46
                (R, 2), (R, 2), (L, 5), (W0, 4),
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    47
                (R, 0), (L, 5)]"
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    48
92
b9d0dd18c81e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 91
diff changeset
    49
definition 
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    50
  tcopy :: "instr list"
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    51
where
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    52
  "tcopy \<equiv> (tcopy_begin |+| tcopy_loop) |+| tcopy_end"
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    53
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
    54
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    55
(* tcopy_begin *)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    56
71
8c7f10b3da7b updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 70
diff changeset
    57
fun 
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    58
  inv_begin0 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    59
  inv_begin1 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    60
  inv_begin2 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    61
  inv_begin3 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    62
  inv_begin4 :: "nat \<Rightarrow> tape \<Rightarrow> bool"
71
8c7f10b3da7b updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 70
diff changeset
    63
where
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    64
  "inv_begin0 n (l, r) = ((n > 1 \<and> (l, r) = (Oc \<up> (n - 2), [Oc, Oc, Bk, Oc])) \<or>   
95
5317c92ff2a7 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 94
diff changeset
    65
                          (n = 1 \<and> (l, r) = ([], [Bk, Oc, Bk, Oc])))"
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    66
| "inv_begin1 n (l, r) = ((l, r) = ([], Oc \<up> n))"
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    67
| "inv_begin2 n (l, r) = (\<exists> i j. i > 0 \<and> i + j = n \<and> (l, r) = (Oc \<up> i, Oc \<up> j))"
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    68
| "inv_begin3 n (l, r) = (n > 0 \<and> (l, tl r) = (Bk # Oc \<up> n, []))"
95
5317c92ff2a7 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 94
diff changeset
    69
| "inv_begin4 n (l, r) = (n > 0 \<and> (l, r) = (Oc \<up> n, [Bk, Oc]) \<or> (l, r) = (Oc \<up> (n - 1), [Oc, Bk, Oc]))"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    70
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    71
fun inv_begin :: "nat \<Rightarrow> config \<Rightarrow> bool"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    72
  where
97
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
    73
  "inv_begin n (s, tp) = 
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
    74
        (if s = 0 then inv_begin0 n tp else
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
    75
         if s = 1 then inv_begin1 n tp else
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
    76
         if s = 2 then inv_begin2 n tp else
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
    77
         if s = 3 then inv_begin3 n tp else
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
    78
         if s = 4 then inv_begin4 n tp 
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    79
         else False)"
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    80
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    81
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
    82
  \<exists>ia>0. ia + j - Suc 0 = i + j \<and> Oc # Oc \<up> i = Oc \<up> ia"
95
5317c92ff2a7 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 94
diff changeset
    83
by (rule_tac x = "Suc i" in exI, simp)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    84
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    85
lemma inv_begin_step: 
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
    86
  assumes "inv_begin n cf"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
    87
  and "n > 0"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
    88
  shows "inv_begin n (step0 cf tcopy_begin)"
95
5317c92ff2a7 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 94
diff changeset
    89
using assms
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    90
unfolding tcopy_begin_def
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    91
apply(case_tac cf)
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
    92
apply(auto simp: numeral split: if_splits)
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
    93
apply(case_tac "hd c")
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
    94
apply(auto)
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
    95
apply(case_tac c)
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
    96
apply(simp_all)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    97
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    98
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
    99
lemma inv_begin_steps: 
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   100
  assumes "inv_begin n cf"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   101
  and "n > 0"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   102
  shows "inv_begin n (steps0 cf tcopy_begin stp)"
95
5317c92ff2a7 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 94
diff changeset
   103
apply(induct stp)
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   104
apply(simp add: assms)
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   105
apply(auto simp del: steps.simps)
95
5317c92ff2a7 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 94
diff changeset
   106
apply(rule_tac inv_begin_step)
5317c92ff2a7 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 94
diff changeset
   107
apply(simp_all add: assms)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   108
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   109
102
cdef5b1072fe updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 99
diff changeset
   110
lemma begin_partial_correctness:
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   111
  assumes "is_final (steps0 (1, [], Oc \<up> n) tcopy_begin stp)"
103
294576baaeed updated theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 102
diff changeset
   112
  shows "0 < n \<Longrightarrow> {inv_begin1 n} tcopy_begin {inv_begin0 n}"
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   113
proof(rule_tac Hoare_haltI)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   114
  fix l r
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   115
  assume h: "0 < n" "inv_begin1 n (l, r)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   116
  have "inv_begin n (steps0 (1, [], Oc \<up> n) tcopy_begin stp)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   117
    using h by (rule_tac inv_begin_steps) (simp_all add: inv_begin.simps)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   118
  then show
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   119
    "\<exists>stp. is_final (steps0 (1, l, r) tcopy_begin stp) \<and> 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   120
    inv_begin0 n holds_for steps (1, l, r) (tcopy_begin, 0) stp"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   121
    using h assms
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   122
    apply(rule_tac x = stp in exI)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   123
    apply(case_tac "(steps0 (1, [], Oc \<up> n) tcopy_begin stp)", simp add: inv_begin.simps)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   124
    done
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   125
qed
102
cdef5b1072fe updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 99
diff changeset
   126
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   127
fun measure_begin_state :: "config \<Rightarrow> nat"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   128
  where
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   129
  "measure_begin_state (s, l, r) = (if s = 0 then 0 else 5 - s)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   130
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   131
fun measure_begin_step :: "config \<Rightarrow> nat"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   132
  where
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   133
  "measure_begin_step (s, l, r) = 
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   134
        (if s = 2 then length r else
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   135
         if s = 3 then (if r = [] \<or> r = [Bk] then 1 else 0) else
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   136
         if s = 4 then length l 
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   137
         else 0)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   138
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   139
definition
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   140
  "measure_begin = measures [measure_begin_state, measure_begin_step]"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   141
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   142
lemma wf_measure_begin:
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   143
  shows "wf measure_begin" 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   144
unfolding measure_begin_def 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   145
by auto
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   146
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   147
lemma measure_begin_induct [case_names Step]: 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   148
  "\<lbrakk>\<And>n. \<not> P (f n) \<Longrightarrow> (f (Suc n), (f n)) \<in> measure_begin\<rbrakk> \<Longrightarrow> \<exists>n. P (f n)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   149
using wf_measure_begin
97
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   150
by (metis wf_iff_no_infinite_down_chain)
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   151
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   152
lemma begin_halts: 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   153
  assumes h: "x > 0"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   154
  shows "\<exists> stp. is_final (steps0 (1, [], Oc \<up> x) tcopy_begin stp)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   155
proof (induct rule: measure_begin_induct) 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   156
  case (Step n)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   157
  have "\<not> is_final (steps0 (1, [], Oc \<up> x) tcopy_begin n)" by fact
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   158
  moreover
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   159
  have "inv_begin x (steps0 (1, [], Oc \<up> x) tcopy_begin n)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   160
    by (rule_tac inv_begin_steps) (simp_all add: inv_begin.simps h)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   161
  moreover
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   162
  obtain s l r where eq: "(steps0 (1, [], Oc \<up> x) tcopy_begin n) = (s, l, r)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   163
    by (metis measure_begin_state.cases)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   164
  ultimately 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   165
  have "(step0 (s, l, r) tcopy_begin, s, l, r) \<in> measure_begin"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   166
    apply(auto simp: measure_begin_def tcopy_begin_def numeral split: if_splits)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   167
    apply(subgoal_tac "r = [Oc]")
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   168
    apply(auto)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   169
    by (metis cell.exhaust list.exhaust tl.simps(2))
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   170
  then 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   171
  show "(steps0 (1, [], Oc \<up> x) tcopy_begin (Suc n), steps0 (1, [], Oc \<up> x) tcopy_begin n) \<in> measure_begin"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   172
    using eq by (simp only: step_red)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   173
qed
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   174
94
aeaf1374dc67 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 93
diff changeset
   175
lemma begin_correct: 
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   176
  shows "0 < n \<Longrightarrow> {inv_begin1 n} tcopy_begin {inv_begin0 n}"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   177
using begin_partial_correctness begin_halts by blast
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   178
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   179
declare tm_comp.simps [simp del] 
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   180
declare adjust.simps[simp del] 
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   181
declare shift.simps[simp del]
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   182
declare tm_wf.simps[simp del]
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   183
declare step.simps[simp del]
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   184
declare steps.simps[simp del]
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   185
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
   186
(* tcopy_loop *)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   187
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   188
fun 
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   189
  inv_loop1_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   190
  inv_loop1_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   191
  inv_loop5_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   192
  inv_loop5_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   193
  inv_loop6_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   194
  inv_loop6_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool"
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   195
where
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   196
  "inv_loop1_loop n (l, r) = (\<exists> i j. i + j + 1 = n \<and> (l, r) = (Oc\<up>i, Oc#Oc#Bk\<up>j @ Oc\<up>j) \<and> j > 0)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   197
| "inv_loop1_exit n (l, r) = (0 < n \<and> (l, r) = ([], Bk#Oc#Bk\<up>n @ Oc\<up>n))"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   198
| "inv_loop5_loop x (l, r) = 
84
4c8325c64dab updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 83
diff changeset
   199
     (\<exists> i j k t. i + j = Suc x \<and> i > 0 \<and> j > 0 \<and> k + t = j \<and> t > 0 \<and> (l, r) = (Oc\<up>k@Bk\<up>j@Oc\<up>i, Oc\<up>t))"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   200
| "inv_loop5_exit x (l, r) = 
84
4c8325c64dab updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 83
diff changeset
   201
     (\<exists> i j. i + j = Suc x \<and> i > 0 \<and> j > 0 \<and> (l, r) = (Bk\<up>(j - 1)@Oc\<up>i, Bk # Oc\<up>j))"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   202
| "inv_loop6_loop x (l, r) = 
84
4c8325c64dab updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 83
diff changeset
   203
     (\<exists> i j k t. i + j = Suc x \<and> i > 0 \<and> k + t + 1 = j \<and> (l, r) = (Bk\<up>k @ Oc\<up>i, Bk\<up>(Suc t) @ Oc\<up>j))"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   204
| "inv_loop6_exit x (l, r) = 
84
4c8325c64dab updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 83
diff changeset
   205
     (\<exists> i j. i + j = x \<and> j > 0 \<and> (l, r) = (Oc\<up>i, Oc#Bk\<up>j @ Oc\<up>j))"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   206
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   207
fun 
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   208
  inv_loop0 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   209
  inv_loop1 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   210
  inv_loop2 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   211
  inv_loop3 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   212
  inv_loop4 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   213
  inv_loop5 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   214
  inv_loop6 :: "nat \<Rightarrow> tape \<Rightarrow> bool"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   215
where
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   216
  "inv_loop0 n (l, r) =  (0 < n \<and> (l, r) = ([Bk], Oc # Bk\<up>n @ Oc\<up>n))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   217
| "inv_loop1 n (l, r) = (inv_loop1_loop n (l, r) \<or> inv_loop1_exit n (l, r))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   218
| "inv_loop2 n (l, r) = (\<exists> i j any. i + j = n \<and> n > 0 \<and> i > 0 \<and> j > 0 \<and> (l, r) = (Oc\<up>i, any#Bk\<up>j@Oc\<up>j))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   219
| "inv_loop3 n (l, r) = 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   220
     (\<exists> i j k t. i + j = n \<and> i > 0 \<and> j > 0 \<and>  k + t = Suc j \<and> (l, r) = (Bk\<up>k@Oc\<up>i, Bk\<up>t@Oc\<up>j))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   221
| "inv_loop4 n (l, r) = 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   222
     (\<exists> i j k t. i + j = n \<and> i > 0 \<and> j > 0 \<and>  k + t = j \<and> (l, r) = (Oc\<up>k @ Bk\<up>(Suc j)@Oc\<up>i, Oc\<up>t))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   223
| "inv_loop5 n (l, r) = (inv_loop5_loop n (l, r) \<or> inv_loop5_exit n (l, r))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   224
| "inv_loop6 n (l, r) = (inv_loop6_loop n (l, r) \<or> inv_loop6_exit n (l, r))"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   225
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   226
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
   227
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   228
  "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
   229
         (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
   230
          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
   231
          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
   232
          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
   233
          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
   234
          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
   235
          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
   236
          else False)"
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   237
       
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   238
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
   239
        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
   240
        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
   241
        inv_loop6.simps[simp del]
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   242
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   243
lemma [elim]: "Bk # list = Oc \<up> t \<Longrightarrow> RR"
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   244
by (case_tac t, auto)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   245
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   246
lemma [simp]: "inv_loop1 x (b, []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   247
by (simp add: inv_loop1.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   248
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   249
lemma [elim]: "\<lbrakk>0 < x; inv_loop2 x (b, [])\<rbrakk> \<Longrightarrow> inv_loop3 x (Bk # b, [])"
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   250
by (auto simp: inv_loop2.simps inv_loop3.simps)
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   251
44
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
lemma [elim]: "\<lbrakk>0 < x; inv_loop3 x (b, [])\<rbrakk> \<Longrightarrow> inv_loop3 x (Bk # b, [])"
81
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   254
by (auto simp: inv_loop3.simps)
2e9881578cb2 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 80
diff changeset
   255
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   256
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   257
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
   258
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
   259
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
   260
      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
   261
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   262
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   263
lemma [elim]: "\<lbrakk>0 < x; inv_loop5 x ([], [])\<rbrakk> \<Longrightarrow> RR"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   264
by (auto simp: inv_loop4.simps inv_loop5.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   265
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   266
lemma [elim]: "\<lbrakk>0 < x; inv_loop5 x (b, []); b \<noteq> []\<rbrakk> \<Longrightarrow> RR"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   267
by (auto simp: inv_loop4.simps inv_loop5.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   268
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]: "inv_loop6 x ([], []) \<Longrightarrow> RR"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   270
by (auto simp: inv_loop6.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   271
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   272
lemma [elim]: "inv_loop6 x (b, []) \<Longrightarrow> RR" 
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   273
by (auto simp: inv_loop6.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   274
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   275
lemma [elim]: "\<lbrakk>0 < x; inv_loop1 x (b, Bk # list)\<rbrakk> \<Longrightarrow> b = []"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   276
by (auto simp: inv_loop1.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   277
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   278
lemma [elim]: "\<lbrakk>0 < x; inv_loop1 x (b, Bk # list)\<rbrakk> \<Longrightarrow> list = Oc # Bk \<up> x @ Oc \<up> x"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   279
by (auto simp: inv_loop1.simps)
44
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_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
   282
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
   283
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
   284
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   285
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   286
lemma [elim]: "Bk # list = Oc \<up> j \<Longrightarrow> RR"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   287
by (case_tac j, simp_all)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   288
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   289
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
   290
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
   291
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
   292
      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
   293
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
   294
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   295
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   296
lemma [elim]: "\<lbrakk>0 < x; inv_loop4 x (b, Bk # list)\<rbrakk> \<Longrightarrow> inv_loop5 x (b, Oc # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   297
by (auto simp: inv_loop4.simps inv_loop5.simps)
44
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]: "\<lbrakk>0 < x; inv_loop5 x ([], Bk # list)\<rbrakk> \<Longrightarrow> inv_loop6 x ([], Bk # Bk # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   300
by (auto simp: inv_loop6.simps inv_loop5.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   301
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   302
lemma [simp]: "inv_loop5_loop x (b, Bk # list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   303
by (auto simp: inv_loop5.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   304
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   305
lemma [simp]: "inv_loop6_exit x (b, Bk # list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   306
by (auto simp: inv_loop6.simps)
44
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
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
   309
       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
   310
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   311
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
   312
          \<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
   313
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
   314
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
   315
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
   316
      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
   317
      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
   318
      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
   319
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
   320
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
   321
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   322
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   323
lemma [simp]: "inv_loop6_loop x (b, Oc # Bk # list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   324
by (auto simp: inv_loop6_loop.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   325
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   326
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
   327
  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
   328
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
   329
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
   330
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
   331
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
   332
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
   333
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   334
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   335
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
   336
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
   337
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
   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_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
   341
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
   342
                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
   343
apply(auto)
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   344
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   345
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   346
lemma [elim]: "\<lbrakk>0 < x; inv_loop6 x ([], Bk # list)\<rbrakk> \<Longrightarrow> inv_loop6 x ([], Bk # Bk # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   347
by (simp)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   348
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   349
lemma [simp]: "inv_loop6_exit x (b, Bk # list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   350
by (simp add: inv_loop6_exit.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   351
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   352
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
   353
              \<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
   354
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
   355
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
   356
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
   357
      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
   358
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
   359
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   360
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   361
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
   362
        \<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
   363
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
   364
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
   365
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
   366
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
   367
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   368
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   369
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
   370
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
   371
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
   372
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   373
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   374
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
   375
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
   376
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
   377
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   378
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   379
lemma [elim]: "\<lbrakk>0 < x; inv_loop2 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_loop2 x (b, Bk # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   380
by (auto simp: inv_loop2.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   381
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   382
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
   383
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
   384
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
   385
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
   386
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
   387
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
   388
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   389
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   390
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
   391
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
   392
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
   393
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
   394
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
   395
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   396
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   397
lemma [simp]: "inv_loop5 x ([], list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   398
by (auto simp: inv_loop5.simps inv_loop5_exit.simps inv_loop5_loop.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   399
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   400
lemma [simp]: "inv_loop5_exit x (b, Oc # list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   401
by (auto simp: inv_loop5_exit.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   402
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   403
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
   404
  \<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
   405
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
   406
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
   407
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
   408
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
   409
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   410
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   411
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
   412
           \<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
   413
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
   414
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
   415
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
   416
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
   417
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
   418
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   419
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   420
lemma [elim]: "\<lbrakk>inv_loop5 x (b, Oc # list); b \<noteq> []\<rbrakk> \<Longrightarrow> inv_loop5 x (tl b, hd b # Oc # list)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   421
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
   422
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
   423
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   424
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   425
lemma [elim]: "\<lbrakk>0 < x; inv_loop6 x ([], Oc # list)\<rbrakk> \<Longrightarrow> inv_loop1 x ([], Bk # Oc # list)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   426
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
   427
  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
   428
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   429
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   430
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
   431
           \<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
   432
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
   433
  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
   434
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   435
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   436
lemma inv_loop_step: 
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   437
  "\<lbrakk>inv_loop x cf; x > 0\<rbrakk> \<Longrightarrow> inv_loop x (step cf (tcopy_loop, 0))"
44
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 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
   439
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
   440
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   441
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   442
lemma inv_loop_steps:
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   443
  "\<lbrakk>inv_loop x cf; x > 0\<rbrakk> \<Longrightarrow> inv_loop x (steps cf (tcopy_loop, 0) stp)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   444
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
   445
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
   446
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   447
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   448
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
   449
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   450
  "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
   451
                           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
   452
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   453
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
   454
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   455
  "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
   456
                           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
   457
                           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
   458
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   459
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
   460
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   461
  "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
   462
                          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
   463
                          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
   464
                          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
   465
                          else 0)"
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   466
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   467
definition measure_loop :: "(config \<times> config) set"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   468
  where
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   469
   "measure_loop = measures [loop_stage, loop_state, loop_step]"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   470
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   471
lemma wf_measure_loop: "wf measure_loop"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   472
unfolding measure_loop_def
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   473
by (auto)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   474
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   475
lemma measure_loop_induct [case_names Step]: 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   476
  "\<lbrakk>\<And>n. \<not> P (f n) \<Longrightarrow> (f (Suc n), (f n)) \<in> measure_loop\<rbrakk> \<Longrightarrow> \<exists>n. P (f n)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   477
using wf_measure_loop
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   478
by (metis wf_iff_no_infinite_down_chain)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   479
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   480
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   481
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   482
lemma [simp]: "inv_loop2 x ([], b) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   483
by (auto simp: inv_loop2.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   484
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   485
lemma  [simp]: "inv_loop2 x (l', []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   486
by (auto simp: inv_loop2.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   487
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   488
lemma [simp]: "inv_loop3 x (b, []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   489
by (auto simp: inv_loop3.simps)
44
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 [simp]: "inv_loop4 x ([], b) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   492
by (auto simp: inv_loop4.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   493
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   494
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   495
lemma [elim]: 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   496
  "\<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
   497
  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
   498
  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
   499
  \<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
   500
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
   501
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
   502
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   503
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   504
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   505
lemma [elim]: 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   506
  "\<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
   507
   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
   508
    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
   509
    \<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
   510
    length (takeWhile (\<lambda>a. a = Oc) (rev l' @ Bk # list))"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   511
by (auto simp: inv_loop4.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   512
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   513
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
   514
  "P a \<Longrightarrow> takeWhile P (a\<up>x @ ys) = a\<up>x @ takeWhile P ys"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   515
by (induct x, auto)
44
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
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
   518
  "P a \<Longrightarrow> takeWhile P (a\<up>x) = a\<up>x"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   519
by (induct x, auto)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   520
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   521
lemma [elim]: 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   522
   "\<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
   523
   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
   524
   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
   525
   \<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
   526
   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
   527
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
   528
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
   529
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
   530
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
   531
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
   532
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
   533
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   534
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   535
lemma [elim]: "\<lbrakk>inv_loop1 x (l', Oc # list)\<rbrakk> \<Longrightarrow> hd list = Oc"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   536
by (auto simp: inv_loop1.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   537
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   538
lemma [elim]: 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   539
  "\<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
   540
  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
   541
  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
   542
  \<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
   543
  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
   544
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
   545
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
   546
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   547
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   548
lemma [elim]:
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   549
  "\<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
   550
  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
   551
  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
   552
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
   553
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
   554
                takeWhile_replicate)
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   555
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   556
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   557
lemma [elim]: 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   558
  "\<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
   559
  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
   560
  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
   561
  \<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
   562
  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
   563
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
   564
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
   565
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   566
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   567
lemma[elim]: 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   568
  "\<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
   569
  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
   570
  \<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
   571
  \<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
   572
      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
   573
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
   574
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
   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
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   577
lemma loop_halts: 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   578
  assumes h: "n > 0" "inv_loop n (1, l, r)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   579
  shows "\<exists> stp. is_final (steps0 (1, l, r) tcopy_loop stp)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   580
proof (induct rule: measure_loop_induct) 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   581
  case (Step stp)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   582
  have "\<not> is_final (steps0 (1, l, r) tcopy_loop stp)" by fact
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   583
  moreover
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   584
  have "inv_loop n (steps0 (1, l, r) tcopy_loop stp)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   585
    by (rule_tac inv_loop_steps) (simp_all only: h)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   586
  moreover
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   587
  obtain s l' r' where eq: "(steps0 (1, l, r) tcopy_loop stp) = (s, l', r')"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   588
    by (metis measure_begin_state.cases)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   589
  ultimately 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   590
  have "(step0 (s, l', r') tcopy_loop, s, l', r') \<in> measure_loop"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   591
    using h(1)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   592
    apply(case_tac r')
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   593
    apply(case_tac [2] a)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   594
    apply(auto simp: inv_loop.simps step.simps tcopy_loop_def numeral measure_loop_def split: if_splits)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   595
    done
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   596
  then 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   597
  show "(steps0 (1, l, r) tcopy_loop (Suc stp), steps0 (1, l, r) tcopy_loop stp) \<in> measure_loop"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   598
    using eq by (simp only: step_red)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   599
qed
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   600
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   601
lemma loop_correct:
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   602
  shows "0 < n \<Longrightarrow> {inv_loop1 n} tcopy_loop {inv_loop0 n}"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   603
  using assms
71
8c7f10b3da7b updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 70
diff changeset
   604
proof(rule_tac Hoare_haltI)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   605
  fix l r
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   606
  assume h: "0 < n" "inv_loop1 n (l, r)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   607
  then obtain stp where k: "is_final (steps0 (1, l, r) tcopy_loop stp)" 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   608
    using loop_halts
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   609
    apply(simp add: inv_loop.simps)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   610
    apply(blast)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   611
    done
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   612
  moreover
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   613
  have "inv_loop n (steps0 (1, l, r) tcopy_loop stp)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   614
    using h 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   615
    by (rule_tac inv_loop_steps) (simp_all add: inv_loop.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   616
  ultimately show
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   617
    "\<exists>stp. is_final (steps0 (1, l, r) tcopy_loop stp) \<and> 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   618
    inv_loop0 n holds_for steps0 (1, l, r) tcopy_loop stp"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   619
    using h(1) 
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   620
    apply(rule_tac x = stp in exI)
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   621
    apply(case_tac "(steps0 (1, l, r) tcopy_loop stp)")
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   622
    apply(simp add: inv_loop.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   623
    done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   624
qed
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
   625
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
   626
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   627
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   628
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
   629
(* tcopy_end *)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   630
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   631
fun
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   632
  inv_end5_loop :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   633
  inv_end5_exit :: "nat \<Rightarrow> tape \<Rightarrow> bool" 
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   634
where  
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   635
  "inv_end5_loop x (l, r) = 
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   636
     (\<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)"
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   637
| "inv_end5_exit x (l, r) = (x > 0 \<and> l = [] \<and> r = Bk # Oc\<up>x @ Bk # 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
   638
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   639
fun 
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   640
  inv_end0 :: "nat \<Rightarrow> tape \<Rightarrow>  bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   641
  inv_end1 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   642
  inv_end2 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   643
  inv_end3 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   644
  inv_end4 :: "nat \<Rightarrow> tape \<Rightarrow> bool" and 
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   645
  inv_end5 :: "nat \<Rightarrow> tape \<Rightarrow> bool" 
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   646
where
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   647
  "inv_end0 n (l, r) = (n > 0 \<and> (l, r) = ([Bk], Oc\<up>n @ Bk # Oc\<up>n))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   648
| "inv_end1 n (l, r) = (n > 0 \<and> (l, r) = ([Bk], Oc # Bk\<up>n @ Oc\<up>n))"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   649
| "inv_end2 n (l, r) = (\<exists> i j. i + j = Suc n \<and> n > 0 \<and> l = Oc\<up>i @ [Bk] \<and> r = Bk\<up>j @ Oc\<up>n)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   650
| "inv_end3 n (l, r) =
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   651
     (\<exists> i j. n > 0 \<and> i + j = n \<and> l = Oc\<up>i @ [Bk] \<and> r = Oc # Bk\<up>j@ Oc\<up>n)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   652
| "inv_end4 n (l, r) = (\<exists> any. n > 0 \<and> l = Oc\<up>n @ [Bk] \<and> r = any#Oc\<up>n)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   653
| "inv_end5 n (l, r) = (inv_end5_loop n (l, r) \<or> inv_end5_exit n (l, r))"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   654
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   655
fun 
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   656
  inv_end :: "nat \<Rightarrow> config \<Rightarrow> bool"
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   657
where
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   658
  "inv_end n (s, l, r) = (if s = 0 then inv_end0 n (l, r)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   659
                          else if s = 1 then inv_end1 n (l, r)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   660
                          else if s = 2 then inv_end2 n (l, r)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   661
                          else if s = 3 then inv_end3 n (l, r)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   662
                          else if s = 4 then inv_end4 n (l, r)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   663
                          else if s = 5 then inv_end5 n (l, r)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   664
                          else False)"
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   665
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   666
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
   667
        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
   668
        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
   669
        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
   670
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   671
lemma [simp]:  "inv_end1 x (b, []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   672
by (auto simp: inv_end1.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   673
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   674
lemma [simp]: "inv_end2 x (b, []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   675
by (auto simp: inv_end2.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   676
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   677
lemma [simp]: "inv_end3 x (b, []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   678
by (auto simp: inv_end3.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   679
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   680
lemma [simp]: "inv_end4 x (b, []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   681
by (auto simp: inv_end4.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   682
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   683
lemma [simp]: "inv_end5 x (b, []) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   684
by (auto simp: inv_end5.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   685
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   686
lemma [simp]: "inv_end1 x ([], list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   687
by (auto simp: inv_end1.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   688
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   689
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
   690
  \<Longrightarrow> inv_end0 x (tl b, hd b # Bk # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   691
by (auto simp: inv_end1.simps inv_end0.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   692
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   693
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
   694
  \<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
   695
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
   696
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
   697
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
   698
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
   699
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   700
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   701
lemma [elim]: "\<lbrakk>0 < x; inv_end3 x (b, Bk # list)\<rbrakk> \<Longrightarrow> inv_end2 x (Bk # b, list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   702
by (auto simp: inv_end2.simps inv_end3.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   703
  
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   704
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
   705
  inv_end5 x ([], Bk # Bk # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   706
by (auto simp: inv_end4.simps inv_end5.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   707
 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   708
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
   709
  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
   710
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
   711
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
   712
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   713
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   714
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
   715
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
   716
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
   717
done
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
lemma [elim]: "\<lbrakk>0 < x; inv_end1 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_end2 x (Oc # b, list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   720
by (auto simp: inv_end1.simps inv_end2.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   721
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   722
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
   723
               inv_end4 x ([], Bk # Oc # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   724
by (auto simp: inv_end2.simps inv_end4.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   725
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   726
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
   727
  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
   728
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
   729
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
   730
done
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
lemma [elim]: "\<lbrakk>0 < x; inv_end3 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_end2 x (Oc # b, list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   733
by (auto simp: inv_end2.simps inv_end3.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   734
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   735
lemma [elim]: "\<lbrakk>0 < x; inv_end4 x (b, Oc # list)\<rbrakk> \<Longrightarrow> inv_end4 x (b, Bk # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   736
by (auto simp: inv_end2.simps inv_end4.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   737
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   738
lemma [elim]: "\<lbrakk>0 < x; inv_end5 x ([], Oc # list)\<rbrakk> \<Longrightarrow> inv_end5 x ([], Bk # Oc # list)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   739
by (auto simp: inv_end2.simps inv_end5.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   740
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   741
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
   742
        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
   743
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   744
lemma [simp]: "inv_end5_exit x (b, Oc # list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   745
by (auto simp: inv_end5_exit.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   746
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   747
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
   748
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
   749
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
   750
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   751
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   752
lemma [elim]:
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   753
  "\<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
   754
  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
   755
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
   756
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
   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 [elim]: 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   760
  "\<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
   761
  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
   762
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
   763
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
   764
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
   765
      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
   766
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
   767
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   768
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   769
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
   770
  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
   771
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
   772
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
   773
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   774
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   775
lemma inv_end_step:
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   776
  "\<lbrakk>x > 0; inv_end x cf\<rbrakk> \<Longrightarrow> inv_end x (step cf (tcopy_end, 0))"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   777
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
   778
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
   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 inv_end_steps:
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   782
  "\<lbrakk>x > 0; inv_end x cf\<rbrakk> \<Longrightarrow> inv_end x (steps cf (tcopy_end, 0) stp)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   783
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
   784
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
   785
done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   786
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   787
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
   788
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   789
  "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
   790
       (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
   791
        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
   792
        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
   793
        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
   794
        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
   795
        else 0)"
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   796
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   797
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
   798
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   799
  "end_stage (s, l, r) = 
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   800
          (if s = 2 \<or> s = 3 then (length r) else 0)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   801
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   802
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
   803
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   804
  "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
   805
         (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
   806
          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
   807
          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
   808
          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
   809
          else 0)"
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   810
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   811
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
   812
  where
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   813
   "end_LE = measures [end_state, end_stage, end_step]"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   814
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   815
lemma wf_end_le: "wf end_LE"
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   816
unfolding end_LE_def
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   817
by (auto)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   818
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   819
lemma [simp]: "inv_end5 x ([], Oc # list) = False"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   820
by (auto simp: inv_end5.simps inv_end5_loop.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   821
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   822
lemma halt_lemma: 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   823
  "\<lbrakk>wf LE; \<forall>n. (\<not> P (f n) \<longrightarrow> (f (Suc n), (f n)) \<in> LE)\<rbrakk> \<Longrightarrow> \<exists>n. P (f n)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   824
by (metis wf_iff_no_infinite_down_chain)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   825
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   826
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
   827
  "\<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
   828
      \<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
   829
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
   830
  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
   831
next
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   832
  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
   833
    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
   834
  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
   835
    (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
   836
  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
   837
    fix n
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   838
    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
   839
    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
   840
      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
   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
    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
   843
      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
   844
      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
   845
      done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   846
    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
   847
      apply(case_tac r', case_tac [2] a)
96
bd320b5365e2 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 95
diff changeset
   848
      apply(auto simp: inv_end.simps step.simps tcopy_end_def numeral end_LE_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
   849
      done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   850
    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
   851
      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
   852
      using d
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   853
      by simp
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   854
  qed
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   855
qed
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   856
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   857
lemma end_correct:
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   858
  "n > 0 \<Longrightarrow> {inv_end1 n} tcopy_end {inv_end0 n}"
71
8c7f10b3da7b updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 70
diff changeset
   859
proof(rule_tac Hoare_haltI)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   860
  fix l r
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   861
  assume h: "0 < n"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   862
    "inv_end1 n (l, r)"
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   863
  then have "\<exists> stp. is_final (steps0 (1, l, r) tcopy_end stp)"
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   864
    by (simp add: end_halt inv_end.simps)
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   865
  then obtain stp where "is_final (steps0 (1, l, r) tcopy_end stp)" ..
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   866
  moreover have "inv_end n (steps0 (1, l, r) tcopy_end stp)"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   867
    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
   868
    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
   869
  ultimately show
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   870
    "\<exists>stp. is_final (steps (1, l, r) (tcopy_end, 0) stp) \<and> 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   871
    inv_end0 n holds_for steps (1, l, r) (tcopy_end, 0) stp"        
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   872
    using h
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   873
    apply(rule_tac x = stp in exI)
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   874
    apply(case_tac "(steps0 (1, l, r) tcopy_end stp)") 
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   875
    apply(simp add: inv_end.simps)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   876
    done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   877
qed
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   878
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
   879
(* tcopy *)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   880
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
   881
lemma [intro]: "tm_wf (tcopy_begin, 0)"
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
   882
by (auto simp: tm_wf.simps tcopy_begin_def)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   883
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   884
lemma [intro]: "tm_wf (tcopy_loop, 0)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   885
by (auto simp: tm_wf.simps tcopy_loop_def)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   886
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   887
lemma [intro]: "tm_wf (tcopy_end, 0)"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
   888
by (auto simp: tm_wf.simps tcopy_end_def)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   889
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   890
lemma tcopy_correct1: 
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   891
  assumes "0 < x"
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   892
  shows "{inv_begin1 x} tcopy {inv_end0 x}"
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   893
proof -
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   894
  have "{inv_begin1 x} tcopy_begin {inv_begin0 x}"
94
aeaf1374dc67 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 93
diff changeset
   895
    by (metis assms begin_correct) 
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   896
  moreover 
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   897
  have "inv_begin0 x \<mapsto> inv_loop1 x"
97
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   898
    unfolding assert_imp_def
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   899
    unfolding inv_begin0.simps inv_loop1.simps
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   900
    unfolding inv_loop1_loop.simps inv_loop1_exit.simps
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   901
    apply(auto simp add: numeral Cons_eq_append_conv)
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   902
    by (rule_tac x = "Suc 0" in exI, auto)
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   903
  ultimately have "{inv_begin1 x} tcopy_begin {inv_loop1 x}"
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   904
    by (rule_tac Hoare_consequence) (auto)
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   905
  moreover
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   906
  have "{inv_loop1 x} tcopy_loop {inv_loop0 x}"
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   907
    by (metis assms loop_correct) 
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   908
  ultimately 
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   909
  have "{inv_begin1 x} (tcopy_begin |+| tcopy_loop) {inv_loop0 x}"
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   910
    by (rule_tac Hoare_plus_halt) (auto)
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   911
  moreover 
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   912
  have "{inv_end1 x} tcopy_end {inv_end0 x}"
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   913
    by (metis assms end_correct) 
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   914
  moreover 
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   915
  have "inv_loop0 x = inv_end1 x"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   916
    by(auto simp: inv_end1.simps inv_loop1.simps assert_imp_def)
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   917
  ultimately 
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   918
  show "{inv_begin1 x} tcopy {inv_end0 x}"
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   919
    unfolding tcopy_def
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   920
    by (rule_tac Hoare_plus_halt) (auto)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   921
qed
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   922
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   923
abbreviation (input)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   924
  "pre_tcopy n \<equiv> \<lambda>tp. tp = ([]::cell list, <(n::nat)>)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   925
abbreviation (input)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   926
  "post_tcopy n \<equiv> \<lambda>tp. tp= ([Bk], <(n, n::nat)>)"
69
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   927
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   928
lemma tcopy_correct:
69
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   929
  shows "{pre_tcopy n} tcopy {post_tcopy n}"
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   930
proof -
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
   931
  have "{inv_begin1 (Suc n)} tcopy {inv_end0 (Suc n)}"
69
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   932
    by (rule tcopy_correct1) (simp)
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   933
  moreover
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   934
  have "pre_tcopy n = inv_begin1 (Suc n)" 
97
d6f04e3e9894 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 96
diff changeset
   935
    by (auto simp add: tape_of_nl_abv tape_of_nat_abv)
69
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   936
  moreover
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   937
  have "inv_end0 (Suc n) = post_tcopy n" 
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
   938
    by (auto simp add: inv_end0.simps tape_of_nat_abv tape_of_nat_pair)
69
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   939
  ultimately
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   940
  show "{pre_tcopy n} tcopy {post_tcopy n}" 
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
   941
    by simp
69
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   942
qed
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   943
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   944
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
   945
section {* The {\em Dithering} Turing Machine *}
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   946
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   947
text {*
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   948
  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
   949
  terminate.
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   950
*}
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   951
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   952
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
   953
  where
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   954
  "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
   955
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
   956
(* invariants of dither *)
94
aeaf1374dc67 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 93
diff changeset
   957
abbreviation (input)
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   958
  "dither_halt_inv \<equiv> \<lambda>tp. \<exists>k. tp = (Bk \<up> k, <1::nat>)"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
   959
94
aeaf1374dc67 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 93
diff changeset
   960
abbreviation (input)
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
   961
  "dither_unhalt_inv \<equiv> \<lambda>tp. \<exists>k. tp = (Bk \<up> k, <0::nat>)"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
   962
80
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   963
lemma dither_loops_aux: 
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   964
  "(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
   965
   (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
   966
  apply(induct stp)
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
   967
  apply(auto simp: steps.simps step.simps dither_def numeral tape_of_nat_abv)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   968
  done
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   969
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   970
lemma dither_loops:
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
   971
  shows "{dither_unhalt_inv} dither \<up>" 
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   972
apply(rule Hoare_unhaltI)
80
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   973
using dither_loops_aux
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
   974
apply(auto simp add: numeral tape_of_nat_abv)
80
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   975
by (metis Suc_neq_Zero is_final_eq)
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   976
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   977
lemma dither_halts_aux: 
91
2068654bdf54 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 89
diff changeset
   978
  shows "steps0 (1, Bk \<up> m, [Oc, Oc]) dither 2 = (0, Bk \<up> m, [Oc, Oc])"
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   979
unfolding dither_def
80
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   980
by (simp add: steps.simps step.simps numeral)
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   981
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   982
lemma dither_halts:
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   983
  shows "{dither_halt_inv} dither {dither_halt_inv}" 
71
8c7f10b3da7b updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 70
diff changeset
   984
apply(rule Hoare_haltI)
80
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   985
using dither_halts_aux
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
   986
apply(auto simp add: tape_of_nat_abv)
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   987
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
   988
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
   989
80
eb589fa73fc1 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
   990
section {* The diagnal argument below shows the undecidability of Halting problem *}
44
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
text {*
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   993
  @{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
   994
  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
   995
*}
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   996
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
   997
definition haltP :: "tprog0 \<Rightarrow> nat list \<Rightarrow> bool"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   998
  where
141
4d7a568bd911 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
   999
  "haltP p ns \<equiv> {(\<lambda>tp. tp = ([], <ns>))} p {(\<lambda>tp. (\<exists>k n l. tp = (Bk \<up> k,  <n::nat> @ Bk \<up> l)))}"
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1000
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1001
lemma [intro, simp]: "tm_wf0 tcopy"
82
c470f1705baa simplified uncomputable-locale
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 81
diff changeset
  1002
by (auto simp: tcopy_def)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1003
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1004
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
  1005
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
  1006
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1007
text {*
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1008
  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
  1009
  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
  1010
  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
  1011
  is established. 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1012
*}
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1013
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1014
locale uncomputable = 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1015
  -- {* 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
  1016
  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
  1017
  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
  1018
  -- {* 
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1019
  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
  1020
  *}
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1021
  and H :: "instr list"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1022
  assumes h_wf[intro]: "tm_wf0 H"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1023
  -- {*
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1024
  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
  1025
  *}
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1026
  and h_case: 
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1027
  "\<And> M ns. haltP M ns \<Longrightarrow> {(\<lambda>tp. tp = ([Bk], <(code M, ns)>))} H {(\<lambda>tp. \<exists>k. tp = (Bk \<up> k, <0::nat>))}"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1028
  and nh_case: 
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1029
  "\<And> M ns. \<not> haltP M ns \<Longrightarrow> {(\<lambda>tp. tp = ([Bk], <(code M, ns)>))} H {(\<lambda>tp. \<exists>k. tp = (Bk \<up> k, <1::nat>))}"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1030
begin
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1031
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1032
(* invariants for H *)
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1033
abbreviation (input)
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1034
  "pre_H_inv M ns \<equiv> \<lambda>tp. tp = ([Bk], <(code M, ns::nat list)>)"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1035
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1036
abbreviation (input)
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1037
  "post_H_halt_inv \<equiv> \<lambda>tp. \<exists>k. tp = (Bk \<up> k, <1::nat>)"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1038
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1039
abbreviation (input)
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1040
  "post_H_unhalt_inv \<equiv> \<lambda>tp. \<exists>k. tp = (Bk \<up> k, <0::nat>)"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1041
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1042
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1043
lemma H_halt_inv:
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1044
  assumes "\<not> haltP M ns" 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1045
  shows "{pre_H_inv M ns} H {post_H_halt_inv}"
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
  1046
using assms nh_case by auto
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1047
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1048
lemma H_unhalt_inv:
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1049
  assumes "haltP M ns" 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1050
  shows "{pre_H_inv M ns} H {post_H_unhalt_inv}"
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
  1051
using assms h_case by auto
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1052
   
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1053
(* TM that produces the contradiction and its code *)
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1054
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1055
definition
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1056
  "tcontra \<equiv> (tcopy |+| H) |+| dither"
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1057
abbreviation
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1058
  "code_tcontra \<equiv> code tcontra"
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1059
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1060
(* assume tcontra does not halt on its code *)
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1061
lemma tcontra_unhalt: 
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
  1062
  assumes "\<not> haltP tcontra [code tcontra]"
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
  1063
  shows "False"
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1064
proof -
64
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1065
  (* invariants *)
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1066
  def P1 \<equiv> "\<lambda>tp. tp = ([]::cell list, <code_tcontra>)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1067
  def P2 \<equiv> "\<lambda>tp. tp = ([Bk], <(code_tcontra, code_tcontra)>)"
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1068
  def P3 \<equiv> "\<lambda>tp. \<exists>k. tp = (Bk \<up> k, <1::nat>)"
64
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1069
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1070
  (*
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1071
  {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
  1072
  ----------------------------
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1073
     {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
  1074
  ------------------------------------------------
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
  1075
                 {P1} tcontra {P3}
64
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1076
  *)
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1077
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1078
  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
  1079
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1080
  (* {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
  1081
  have first: "{P1} (tcopy |+| H) {P3}" 
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1082
  proof (cases rule: Hoare_plus_halt)
64
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1083
    case A_halt (* of tcopy *)
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1084
    show "{P1} tcopy {P2}" unfolding P1_def P2_def 
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1085
      by (rule tcopy_correct)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1086
  next
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1087
    case B_halt (* of H *)
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1088
    show "{P2} H {P3}"
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1089
      unfolding P2_def P3_def 
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1090
      using H_halt_inv[OF assms]
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1091
      by (simp add: tape_of_nat_pair tape_of_nl_abv)
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1092
  qed (simp)
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1093
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1094
  (* {P3} dither {P3} *)
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1095
  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
  1096
    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
  1097
  
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1098
  (* {P1} tcontra {P3} *)
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1099
  have "{P1} tcontra {P3}" 
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1100
    unfolding tcontra_def
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1101
    by (rule Hoare_plus_halt[OF first second H_wf])
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1102
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1103
  with assms show "False"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1104
    unfolding P1_def P3_def
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1105
    unfolding haltP_def
71
8c7f10b3da7b updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 70
diff changeset
  1106
    unfolding Hoare_halt_def 
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1107
    apply(auto)    
84
4c8325c64dab updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 83
diff changeset
  1108
    apply(drule_tac x = n in spec)
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1109
    apply(case_tac "steps0 (Suc 0, [], <code tcontra>) tcontra n")
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1110
    apply(auto simp add: tape_of_nl_abv)
141
4d7a568bd911 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1111
    by (metis append_Nil2 replicate_0)
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1112
qed
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1113
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1114
(* asumme tcontra halts on its code *)
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1115
lemma tcontra_halt: 
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
  1116
  assumes "haltP tcontra [code tcontra]"
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
  1117
  shows "False"
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1118
proof - 
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1119
  (* invariants *)
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1120
  def P1 \<equiv> "\<lambda>tp. tp = ([]::cell list, <code_tcontra>)"
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1121
  def P2 \<equiv> "\<lambda>tp. tp = ([Bk], <(code_tcontra, code_tcontra)>)"
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1122
  def Q3 \<equiv> "\<lambda>tp. \<exists>k. tp = (Bk \<up> k, <0::nat>)"
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1123
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1124
  (*
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1125
  {P1} tcopy {P2}  {P2} H {Q3} 
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1126
  ----------------------------
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1127
     {P1} (tcopy |+| H) {Q3}     {Q3} dither loops
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1128
  ------------------------------------------------
68
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 67
diff changeset
  1129
               {P1} tcontra loops
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1130
  *)
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1131
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1132
  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
  1133
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1134
  (* {P1} (tcopy |+| H) {Q3} *)
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1135
  have first: "{P1} (tcopy |+| H) {Q3}" 
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1136
  proof (cases rule: Hoare_plus_halt)
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1137
    case A_halt (* of tcopy *)
69
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 68
diff changeset
  1138
    show "{P1} tcopy {P2}" unfolding P1_def P2_def
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1139
      by (rule tcopy_correct)
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1140
  next
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1141
    case B_halt (* of H *)
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1142
    then show "{P2} H {Q3}"
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1143
      unfolding P2_def Q3_def using H_unhalt_inv[OF assms]
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1144
      by(simp add: tape_of_nat_pair tape_of_nl_abv)
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1145
  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
  1146
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1147
  (* {P3} dither loops *)
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1148
  have second: "{Q3} dither \<up>" unfolding Q3_def 
64
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1149
    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
  1150
  
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1151
  (* {P1} tcontra loops *)
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1152
  have "{P1} tcontra \<up>" 
93
f2bda6ba4952 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 92
diff changeset
  1153
    unfolding tcontra_def
99
fe7a257bdff4 updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 97
diff changeset
  1154
    by (rule Hoare_plus_unhalt[OF first second H_wf])
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1155
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
  1156
  with assms show "False"
70
2363eb91d9fd updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 69
diff changeset
  1157
    unfolding P1_def
65
0349fa7f5595 also polished uh_h proof
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 64
diff changeset
  1158
    unfolding haltP_def
89
c67e8ed4c865 updated uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 84
diff changeset
  1159
    unfolding Hoare_halt_def Hoare_unhalt_def
105
2cae8a39803e updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 103
diff changeset
  1160
    by (auto simp add: tape_of_nl_abv)
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1161
qed
109
4635641e77cb updated paper
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 105
diff changeset
  1162
63
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
  1163
      
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1164
text {*
64
5c74f6b38a63 updated h_uh proof in uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1165
  @{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
  1166
*}
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1167
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1168
lemma false: "False"
67
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1169
using tcontra_halt tcontra_unhalt 
140489a4020e using some abbreviations
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 66
diff changeset
  1170
by auto
63
35fe8fe12e65 small updates
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 61
diff changeset
  1171
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1172
end
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1173
66
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
  1174
declare replicate_Suc[simp del]
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
  1175
4a3cd7d70ec2 tuned more
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 65
diff changeset
  1176
44
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1177
end
2f765afc1f7e added Jian's new version of uncomputable
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1178