thys/Abacus.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 115 thys/abacus.thy@653426ed4b38
child 165 582916f289ea
permissions -rwxr-xr-x
changed theory names to uppercase
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     1
header {* 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     2
 {\em abacus} a kind of register machine
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     3
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     4
163
67063c5365e1 changed theory names to uppercase
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 115
diff changeset
     5
theory Abacus
67063c5365e1 changed theory names to uppercase
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 115
diff changeset
     6
imports Uncomputable
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     7
begin
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
     8
115
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
     9
(*
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
    10
declare tm_comp.simps [simp add] 
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
    11
declare adjust.simps[simp add] 
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
    12
declare shift.simps[simp add]
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
    13
declare tm_wf.simps[simp add]
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
    14
declare step.simps[simp add]
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
    15
declare steps.simps[simp add]
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
    16
*)
111
dfc629cd11de made uncomputable compatible with abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 101
diff changeset
    17
declare replicate_Suc[simp add]
dfc629cd11de made uncomputable compatible with abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 101
diff changeset
    18
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    19
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    20
  {\em Abacus} instructions:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    21
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    22
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    23
datatype abc_inst =
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    24
  -- {* @{text "Inc n"} increments the memory cell (or register) with address @{text "n"} by one.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    25
     *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    26
     Inc nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    27
  -- {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    28
     @{text "Dec n label"} decrements the memory cell with address @{text "n"} by one. 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    29
      If cell @{text "n"} is already zero, no decrements happens and the executio jumps to
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    30
      the instruction labeled by @{text "label"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    31
     *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    32
   | Dec nat nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    33
  -- {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    34
  @{text "Goto label"} unconditionally jumps to the instruction labeled by @{text "label"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    35
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    36
   | Goto nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    37
  
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    38
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    39
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    40
  Abacus programs are defined as lists of Abacus instructions.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    41
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    42
type_synonym abc_prog = "abc_inst list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    43
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    44
section {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    45
  Sample Abacus programs
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    46
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    48
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    49
  Abacus for addition and clearance.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    50
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    51
fun plus_clear :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> abc_prog"  
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    52
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    53
  "plus_clear m n e = [Dec m e, Inc n, Goto 0]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    54
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    55
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    56
  Abacus for clearing memory untis.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    57
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    58
fun clear :: "nat \<Rightarrow> nat \<Rightarrow> abc_prog"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    59
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    60
  "clear n e = [Dec n e, Goto 0]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    61
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    62
fun plus:: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> abc_prog"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    63
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    64
  "plus m n p e = [Dec m 4, Inc n, Inc p,
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    65
                   Goto 0, Dec p e, Inc m, Goto 4]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    66
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    67
fun mult :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> abc_prog"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    68
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    69
  "mult m1 m2 n p e = [Dec m1 e]@ plus m1 m2 p 1"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    70
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    71
fun expo :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> abc_prog"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    72
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    73
  "expo n m1 m2 p e = [Inc n, Dec m1 e] @ mult m2 n n p 2"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    74
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    75
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    76
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    77
  The state of Abacus machine.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    78
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    79
type_synonym abc_state = nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    80
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    81
(* text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    82
  The memory of Abacus machine is defined as a function from address to contents.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    83
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    84
type_synonym abc_mem = "nat \<Rightarrow> nat" *)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    85
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    86
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    87
  The memory of Abacus machine is defined as a list of contents, with 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    88
  every units addressed by index into the list.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    89
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    90
type_synonym abc_lm = "nat list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    91
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    92
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    93
  Fetching contents out of memory. Units not represented by list elements are considered
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    94
  as having content @{text "0"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    95
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    96
fun abc_lm_v :: "abc_lm \<Rightarrow> nat \<Rightarrow> nat"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    97
  where 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    98
    "abc_lm_v lm n = (if (n < length lm) then (lm!n) else 0)"         
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    99
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   100
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   101
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   102
  Set the content of memory unit @{text "n"} to value @{text "v"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   103
  @{text "am"} is the Abacus memory before setting.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   104
  If address @{text "n"} is outside to scope of @{text "am"}, @{text "am"} 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   105
  is extended so that @{text "n"} becomes in scope.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   106
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   107
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   108
fun abc_lm_s :: "abc_lm \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> abc_lm"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   109
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   110
    "abc_lm_s am n v = (if (n < length am) then (am[n:=v]) else 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   111
                           am@ (replicate (n - length am) 0) @ [v])"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   112
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   113
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   114
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   115
  The configuration of Abaucs machines consists of its current state and its
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   116
  current memory:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   117
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   118
type_synonym abc_conf = "abc_state \<times> abc_lm"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   119
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   120
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   121
  Fetch instruction out of Abacus program:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   122
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   123
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   124
fun abc_fetch :: "nat \<Rightarrow> abc_prog \<Rightarrow> abc_inst option" 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   125
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   126
  "abc_fetch s p = (if (s < length p) then Some (p ! s)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   127
                    else None)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   128
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   129
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   130
  Single step execution of Abacus machine. If no instruction is feteched, 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   131
  configuration does not change.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   132
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   133
fun abc_step_l :: "abc_conf \<Rightarrow> abc_inst option \<Rightarrow> abc_conf"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   134
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   135
  "abc_step_l (s, lm) a = (case a of 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   136
               None \<Rightarrow> (s, lm) |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   137
               Some (Inc n)  \<Rightarrow> (let nv = abc_lm_v lm n in
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   138
                       (s + 1, abc_lm_s lm n (nv + 1))) |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   139
               Some (Dec n e) \<Rightarrow> (let nv = abc_lm_v lm n in
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   140
                       if (nv = 0) then (e, abc_lm_s lm n 0) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   141
                       else (s + 1,  abc_lm_s lm n (nv - 1))) |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   142
               Some (Goto n) \<Rightarrow> (n, lm) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   143
               )"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   144
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   145
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   146
  Multi-step execution of Abacus machine.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   147
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   148
fun abc_steps_l :: "abc_conf \<Rightarrow> abc_prog \<Rightarrow> nat \<Rightarrow> abc_conf"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   149
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   150
  "abc_steps_l (s, lm) p 0 = (s, lm)" |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   151
  "abc_steps_l (s, lm) p (Suc n) = 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   152
      abc_steps_l (abc_step_l (s, lm) (abc_fetch s p)) p n"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   153
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   154
section {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   155
  Compiling Abacus machines into Truing machines
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   156
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   157
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   158
subsection {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   159
  Compiling functions
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   160
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   161
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   162
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   163
  @{text "findnth n"} returns the TM which locates the represention of
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   164
  memory cell @{text "n"} on the tape and changes representation of zero
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   165
  on the way.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   166
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   167
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   168
fun findnth :: "nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   169
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   170
  "findnth 0 = []" |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   171
  "findnth (Suc n) = (findnth n @ [(W1, 2 * n + 1), 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   172
           (R, 2 * n + 2), (R, 2 * n + 3), (R, 2 * n + 2)])"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   173
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   174
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   175
  @{text "tinc_b"} returns the TM which increments the representation 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   176
  of the memory cell under rw-head by one and move the representation 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   177
  of cells afterwards to the right accordingly.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   178
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   179
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   180
definition tinc_b :: "instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   181
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   182
  "tinc_b \<equiv> [(W1, 1), (R, 2), (W1, 3), (R, 2), (W1, 3), (R, 4), 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   183
             (L, 7), (W0, 5), (R, 6), (W0, 5), (W1, 3), (R, 6),
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   184
             (L, 8), (L, 7), (R, 9), (L, 7), (R, 10), (W0, 9)]" 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   185
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   186
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   187
  @{text "tinc ss n"} returns the TM which simulates the execution of 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   188
  Abacus instruction @{text "Inc n"}, assuming that TM is located at
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   189
  location @{text "ss"} in the final TM complied from the whole
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   190
  Abacus program.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   191
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   192
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   193
fun tinc :: "nat \<Rightarrow> nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   194
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   195
  "tinc ss n = shift (findnth n @ shift tinc_b (2 * n)) (ss - 1)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   196
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   197
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   198
  @{text "tinc_b"} returns the TM which decrements the representation 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   199
  of the memory cell under rw-head by one and move the representation 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   200
  of cells afterwards to the left accordingly.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   201
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   202
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   203
definition tdec_b :: "instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   204
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   205
  "tdec_b \<equiv>  [(W1, 1), (R, 2), (L, 14), (R, 3), (L, 4), (R, 3),
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   206
              (R, 5), (W0, 4), (R, 6), (W0, 5), (L, 7), (L, 8),
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   207
              (L, 11), (W0, 7), (W1, 8), (R, 9), (L, 10), (R, 9),
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   208
              (R, 5), (W0, 10), (L, 12), (L, 11), (R, 13), (L, 11),
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   209
              (R, 17), (W0, 13), (L, 15), (L, 14), (R, 16), (L, 14),
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   210
              (R, 0), (W0, 16)]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   211
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   212
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   213
  @{text "sete tp e"} attaches the termination edges (edges leading to state @{text "0"}) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   214
  of TM @{text "tp"} to the intruction labelled by @{text "e"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   215
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   216
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   217
fun sete :: "instr list \<Rightarrow> nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   218
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   219
  "sete tp e = map (\<lambda> (action, state). (action, if state = 0 then e else state)) tp"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   220
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   221
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   222
  @{text "tdec ss n label"} returns the TM which simulates the execution of 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   223
  Abacus instruction @{text "Dec n label"}, assuming that TM is located at
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   224
  location @{text "ss"} in the final TM complied from the whole
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   225
  Abacus program.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   226
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   227
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   228
fun tdec :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   229
  where
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   230
  "tdec ss n e = shift (findnth n) (ss - 1) @ sete (shift (shift tdec_b (2 * n)) (ss - 1)) e"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   231
 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   232
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   233
  @{text "tgoto f(label)"} returns the TM simulating the execution of Abacus instruction
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   234
  @{text "Goto label"}, where @{text "f(label)"} is the corresponding location of
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   235
  @{text "label"} in the final TM compiled from the overall Abacus program.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   236
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   237
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   238
fun tgoto :: "nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   239
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   240
  "tgoto n = [(Nop, n), (Nop, n)]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   241
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   242
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   243
  The layout of the final TM compiled from an Abacus program is represented
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   244
  as a list of natural numbers, where the list element at index @{text "n"} represents the 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   245
  starting state of the TM simulating the execution of @{text "n"}-th instruction
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   246
  in the Abacus program.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   247
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   248
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   249
type_synonym layout = "nat list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   250
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   251
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   252
  @{text "length_of i"} is the length of the 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   253
  TM simulating the Abacus instruction @{text "i"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   254
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   255
fun length_of :: "abc_inst \<Rightarrow> nat"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   256
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   257
  "length_of i = (case i of 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   258
                    Inc n   \<Rightarrow> 2 * n + 9 |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   259
                    Dec n e \<Rightarrow> 2 * n + 16 |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   260
                    Goto n  \<Rightarrow> 1)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   261
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   262
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   263
  @{text "layout_of ap"} returns the layout of Abacus program @{text "ap"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   264
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   265
fun layout_of :: "abc_prog \<Rightarrow> layout"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   266
  where "layout_of ap = map length_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   267
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   268
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   269
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   270
  @{text "start_of layout n"} looks out the starting state of @{text "n"}-th
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   271
  TM in the finall TM.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   272
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   273
thm listsum_def
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   274
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   275
fun start_of :: "nat list \<Rightarrow> nat \<Rightarrow> nat"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   276
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   277
  "start_of ly x = (Suc (listsum (take x ly))) "
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   278
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   279
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   280
  @{text "ci lo ss i"} complies Abacus instruction @{text "i"}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   281
  assuming the TM of @{text "i"} starts from state @{text "ss"} 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   282
  within the overal layout @{text "lo"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   283
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   284
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   285
fun ci :: "layout \<Rightarrow> nat \<Rightarrow> abc_inst \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   286
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   287
  "ci ly ss (Inc n) = tinc ss n"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   288
| "ci ly ss (Dec n e) = tdec ss n (start_of ly e)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   289
| "ci ly ss (Goto n) = tgoto (start_of ly n)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   290
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   291
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   292
  @{text "tpairs_of ap"} transfroms Abacus program @{text "ap"} pairing
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   293
  every instruction with its starting state.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   294
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   295
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   296
fun tpairs_of :: "abc_prog \<Rightarrow> (nat \<times> abc_inst) list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   297
  where "tpairs_of ap = (zip (map (start_of (layout_of ap)) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   298
                         [0..<(length ap)]) ap)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   299
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   300
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   301
  @{text "tms_of ap"} returns the list of TMs, where every one of them simulates
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   302
  the corresponding Abacus intruction in @{text "ap"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   303
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   304
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   305
fun tms_of :: "abc_prog \<Rightarrow> (instr list) list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   306
  where "tms_of ap = map (\<lambda> (n, tm). ci (layout_of ap) n tm) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   307
                         (tpairs_of ap)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   308
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   309
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   310
  @{text "tm_of ap"} returns the final TM machine compiled from Abacus program @{text "ap"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   311
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   312
fun tm_of :: "abc_prog \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   313
  where "tm_of ap = concat (tms_of ap)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   314
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   315
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   316
  The following two functions specify the well-formedness of complied TM.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   317
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   318
(*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   319
fun t_ncorrect :: "tprog \<Rightarrow> bool"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   320
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   321
  "t_ncorrect tp = (length tp mod 2 = 0)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   322
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   323
fun abc2t_correct :: "abc_prog \<Rightarrow> bool"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   324
  where 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   325
  "abc2t_correct ap = list_all (\<lambda> (n, tm). 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   326
             t_ncorrect (ci (layout_of ap) n tm)) (tpairs_of ap)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   327
*)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   328
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   329
lemma length_findnth: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   330
  "length (findnth n) = 4 * n"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   331
apply(induct n, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   332
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   333
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   334
lemma ci_length : "length (ci ns n ai) div 2 = length_of ai"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   335
apply(auto simp: ci.simps tinc_b_def tdec_b_def length_findnth
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   336
                 split: abc_inst.splits)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   337
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   338
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   339
subsection {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   340
  Representation of Abacus memory by TM tape
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   341
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   342
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   343
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   344
  @{text "crsp acf tcf"} meams the abacus configuration @{text "acf"}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   345
  is corretly represented by the TM configuration @{text "tcf"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   346
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   347
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   348
fun crsp :: "layout \<Rightarrow> abc_conf \<Rightarrow> config \<Rightarrow> cell list \<Rightarrow> bool"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   349
  where 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   350
  "crsp ly (as, lm) (s, l, r) inres = 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   351
           (s = start_of ly as \<and> (\<exists> x. r = <lm> @ Bk\<up>x) \<and> 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   352
            l = Bk # Bk # inres)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   353
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   354
declare crsp.simps[simp del]
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   355
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   356
subsection {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   357
  A more general definition of TM execution. 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   358
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   359
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   360
(*
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   361
fun nnth_of :: "(taction \<times> nat) list \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> (taction \<times> nat)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   362
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   363
  "nnth_of p s b = (if 2*s < length p 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   364
                    then (p ! (2*s + b)) else (Nop, 0))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   365
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   366
thm nth_of.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   367
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   368
fun nfetch :: "tprog \<Rightarrow> nat \<Rightarrow> block \<Rightarrow> taction \<times> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   369
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   370
  "nfetch p 0 b = (Nop, 0)" |
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   371
  "nfetch p (Suc s) b = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   372
             (case b of 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   373
                Bk \<Rightarrow> nnth_of p s 0 |
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   374
                Oc \<Rightarrow> nnth_of p s 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   375
*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   376
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   377
                    
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   378
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   379
  The type of invarints expressing correspondence between 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   380
  Abacus configuration and TM configuration.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   381
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   382
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   383
type_synonym inc_inv_t = "abc_conf \<Rightarrow> config \<Rightarrow> cell list \<Rightarrow> bool"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   384
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   385
declare tms_of.simps[simp del] tm_of.simps[simp del]
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   386
        layout_of.simps[simp del] abc_fetch.simps [simp del]  
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   387
        tpairs_of.simps[simp del] start_of.simps[simp del]
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   388
        ci.simps [simp del] length_of.simps[simp del] 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   389
        layout_of.simps[simp del]
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   390
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   391
(*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   392
subsection {* The compilation of @{text "Inc n"} *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   393
*)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   394
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   395
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   396
  The lemmas in this section lead to the correctness of 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   397
  the compilation of @{text "Inc n"} instruction.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   398
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   399
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   400
declare abc_step_l.simps[simp del] abc_steps_l.simps[simp del]
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   401
lemma [simp]: "start_of ly as > 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   402
apply(simp add: start_of.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   403
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   404
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   405
lemma abc_steps_l_0: "abc_steps_l ac ap 0 = ac"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   406
by(case_tac ac, simp add: abc_steps_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   407
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   408
lemma abc_step_red: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   409
 "abc_steps_l (as, am) ap stp = (bs, bm) \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   410
  abc_steps_l (as, am) ap (Suc stp) = abc_step_l (bs, bm) (abc_fetch bs ap) "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   411
proof(induct stp arbitrary: as am bs bm)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   412
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   413
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   414
    by(simp add: abc_steps_l.simps abc_steps_l_0)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   415
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   416
  case (Suc stp as am bs bm)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   417
  have ind: "\<And>as am bs bm. abc_steps_l (as, am) ap stp = (bs, bm) \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   418
    abc_steps_l (as, am) ap (Suc stp) = abc_step_l (bs, bm) (abc_fetch bs ap)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   419
    by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   420
  have h:" abc_steps_l (as, am) ap (Suc stp) = (bs, bm)" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   421
  obtain as' am' where g: "abc_step_l (as, am) (abc_fetch as ap) = (as', am')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   422
    by(case_tac "abc_step_l (as, am) (abc_fetch as ap)", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   423
  then have "abc_steps_l (as', am') ap (Suc stp) = abc_step_l (bs, bm) (abc_fetch bs ap)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   424
    using h
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   425
    by(rule_tac ind, simp add: abc_steps_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   426
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   427
    using g
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   428
    by(simp add: abc_steps_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   429
qed
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   430
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   431
lemma tm_shift_fetch: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   432
  "\<lbrakk>fetch A s b = (ac, ns); ns \<noteq> 0 \<rbrakk>
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   433
  \<Longrightarrow> fetch (shift A off) s b = (ac, ns + off)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   434
apply(case_tac b)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   435
apply(case_tac [!] s, auto simp: fetch.simps shift.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   436
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   437
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   438
lemma tm_shift_eq_step:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   439
  assumes exec: "step (s, l, r) (A, 0) = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   440
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   441
  shows "step (s + off, l, r) (shift A off, off) = (s' + off, l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   442
using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   443
apply(simp add: step.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   444
apply(case_tac "fetch A s (read r)", auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   445
apply(drule_tac [!] off = off in tm_shift_fetch, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   446
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   447
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   448
declare step.simps[simp del] steps.simps[simp del] shift.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   449
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   450
lemma tm_shift_eq_steps: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   451
  assumes exec: "steps (s, l, r) (A, 0) stp = (s', l', r')"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   452
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   453
  shows "steps (s + off, l, r) (shift A off, off) stp = (s' + off, l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   454
  using exec notfinal
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   455
proof(induct stp arbitrary: s' l' r', simp add: steps.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   456
  fix stp s' l' r'
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   457
  assume ind: "\<And>s' l' r'. \<lbrakk>steps (s, l, r) (A, 0) stp = (s', l', r'); s' \<noteq> 0\<rbrakk> 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   458
     \<Longrightarrow> steps (s + off, l, r) (shift A off, off) stp = (s' + off, l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   459
  and h: " steps (s, l, r) (A, 0) (Suc stp) = (s', l', r')" "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   460
  obtain s1 l1 r1 where g: "steps (s, l, r) (A, 0) stp = (s1, l1, r1)" 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   461
    apply(case_tac "steps (s, l, r) (A, 0) stp") by blast
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   462
  moreover then have "s1 \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   463
    using h
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   464
    apply(simp add: step_red)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   465
    apply(case_tac "0 < s1", auto)
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   466
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   467
  ultimately have "steps (s + off, l, r) (shift A off, off) stp =
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   468
                   (s1 + off, l1, r1)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   469
    apply(rule_tac ind, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   470
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   471
  thus "steps (s + off, l, r) (shift A off, off) (Suc stp) = (s' + off, l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   472
    using h g assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   473
    apply(simp add: step_red)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   474
    apply(rule_tac tm_shift_eq_step, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   475
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   476
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   477
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   478
lemma startof_not0[simp]: "0 < start_of ly as"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   479
apply(simp add: start_of.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   480
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   481
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   482
lemma startof_ge1[simp]: "Suc 0 \<le> start_of ly as"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   483
apply(simp add: start_of.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   484
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   485
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   486
lemma start_of_Suc1: "\<lbrakk>ly = layout_of ap; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   487
       abc_fetch as ap = Some (Inc n)\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   488
       \<Longrightarrow> start_of ly (Suc as) = start_of ly as + 2 * n + 9"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   489
apply(auto simp: start_of.simps layout_of.simps  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   490
                 length_of.simps abc_fetch.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   491
                 take_Suc_conv_app_nth split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   492
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   493
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   494
lemma start_of_Suc2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   495
  "\<lbrakk>ly = layout_of ap;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   496
  abc_fetch as ap = Some (Dec n e)\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   497
        start_of ly (Suc as) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   498
            start_of ly as + 2 * n + 16"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   499
apply(auto simp: start_of.simps layout_of.simps  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   500
                 length_of.simps abc_fetch.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   501
                 take_Suc_conv_app_nth split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   502
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   503
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   504
lemma start_of_Suc3:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   505
  "\<lbrakk>ly = layout_of ap;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   506
  abc_fetch as ap = Some (Goto n)\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   507
  start_of ly (Suc as) = start_of ly as + 1"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   508
apply(auto simp: start_of.simps layout_of.simps  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   509
                 length_of.simps abc_fetch.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   510
                 take_Suc_conv_app_nth split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   511
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   512
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   513
lemma length_ci_inc: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   514
  "length (ci ly ss (Inc n)) = 4*n + 18"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   515
apply(auto simp: ci.simps length_findnth tinc_b_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   516
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   517
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   518
lemma length_ci_dec: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   519
  "length (ci ly ss (Dec n e)) = 4*n + 32"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   520
apply(auto simp: ci.simps length_findnth tdec_b_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   521
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   522
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   523
lemma length_ci_goto: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   524
  "length (ci ly ss (Goto n )) = 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   525
apply(auto simp: ci.simps length_findnth tdec_b_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   526
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   527
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   528
lemma take_Suc_last[elim]: "Suc as \<le> length xs \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   529
            take (Suc as) xs = take as xs @ [xs ! as]"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   530
apply(induct xs arbitrary: as, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   531
apply(case_tac as, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   532
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   533
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   534
lemma concat_suc: "Suc as \<le> length xs \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   535
       concat (take (Suc as) xs) = concat (take as xs) @ xs! as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   536
apply(subgoal_tac "take (Suc as) xs = take as xs @ [xs ! as]", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   537
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   538
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   539
lemma concat_take_suc_iff: "Suc n \<le> length tps \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   540
       concat (take n tps) @ (tps ! n) = concat (take (Suc n) tps)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   541
apply(drule_tac concat_suc, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   542
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   543
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   544
lemma concat_drop_suc_iff: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   545
   "Suc n < length tps \<Longrightarrow> concat (drop (Suc n) tps) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   546
           tps ! Suc n @ concat (drop (Suc (Suc n)) tps)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   547
apply(induct tps arbitrary: n, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   548
apply(case_tac tps, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   549
apply(case_tac n, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   550
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   551
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   552
declare append_assoc[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   553
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   554
lemma  tm_append:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   555
  "\<lbrakk>n < length tps; tp = tps ! n\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   556
  \<exists> tp1 tp2. concat tps = tp1 @ tp @ tp2 \<and> tp1 = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   557
  concat (take n tps) \<and> tp2 = concat (drop (Suc n) tps)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   558
apply(rule_tac x = "concat (take n tps)" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   559
apply(rule_tac x = "concat (drop (Suc n) tps)" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   560
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   561
apply(induct n, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   562
apply(case_tac tps, simp, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   563
apply(subgoal_tac "concat (take n tps) @ (tps ! n) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   564
               concat (take (Suc n) tps)")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   565
apply(simp only: append_assoc[THEN sym], simp only: append_assoc)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   566
apply(subgoal_tac " concat (drop (Suc n) tps) = tps ! Suc n @ 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   567
                  concat (drop (Suc (Suc n)) tps)", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   568
apply(rule_tac concat_drop_suc_iff, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   569
apply(rule_tac concat_take_suc_iff, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   570
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   571
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   572
declare append_assoc[simp]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   573
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   574
lemma map_of:  "n < length xs \<Longrightarrow> (map f xs) ! n = f (xs ! n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   575
by(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   576
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   577
lemma [simp]: "length (tms_of aprog) = length aprog"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   578
apply(auto simp: tms_of.simps tpairs_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   579
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   580
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   581
lemma ci_nth: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   582
  "\<lbrakk>ly = layout_of aprog; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   583
  abc_fetch as aprog = Some ins\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   584
  \<Longrightarrow> ci ly (start_of ly as) ins = tms_of aprog ! as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   585
apply(simp add: tms_of.simps tpairs_of.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   586
      abc_fetch.simps  map_of del: map_append split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   587
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   588
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   589
lemma t_split:"\<lbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   590
        ly = layout_of aprog;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   591
        abc_fetch as aprog = Some ins\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   592
      \<Longrightarrow> \<exists> tp1 tp2. concat (tms_of aprog) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   593
            tp1 @ (ci ly (start_of ly as) ins) @ tp2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   594
            \<and> tp1 = concat (take as (tms_of aprog)) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   595
              tp2 = concat (drop (Suc as) (tms_of aprog))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   596
apply(insert tm_append[of "as" "tms_of aprog" 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   597
                             "ci ly (start_of ly as) ins"], simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   598
apply(subgoal_tac "ci ly (start_of ly as) ins = (tms_of aprog) ! as")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   599
apply(subgoal_tac "length (tms_of aprog) = length aprog")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   600
apply(simp add: abc_fetch.simps split: if_splits, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   601
apply(rule_tac ci_nth, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   602
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   603
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   604
lemma math_sub: "\<lbrakk>x >= Suc 0; x - 1 = z\<rbrakk> \<Longrightarrow> x + y - Suc 0 = z + y"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   605
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   606
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   607
lemma start_more_one: "as \<noteq> 0 \<Longrightarrow> start_of ly as >= Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   608
apply(induct as, simp add: start_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   609
apply(case_tac as, auto simp: start_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   610
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   611
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   612
lemma div_apart: "\<lbrakk>x mod (2::nat) = 0; y mod 2 = 0\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   613
          \<Longrightarrow> (x + y) div 2 = x div 2 + y div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   614
apply(drule mod_eqD)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   615
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   616
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   617
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   618
lemma div_apart_iff: "\<lbrakk>x mod (2::nat) = 0; y mod 2 = 0\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   619
           (x + y) mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   620
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   621
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   622
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   623
lemma [simp]: "length (layout_of aprog) = length aprog"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   624
apply(auto simp: layout_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   625
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   626
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   627
lemma start_of_ind: "\<lbrakk>as < length aprog; ly = layout_of aprog\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   628
       start_of ly (Suc as) = start_of ly as + 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   629
                          length ((tms_of aprog) ! as) div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   630
apply(simp only: start_of.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   631
apply(auto simp: start_of.simps tms_of.simps layout_of.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   632
                 tpairs_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   633
apply(simp add: ci_length take_Suc take_Suc_conv_app_nth)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   634
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   635
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   636
lemma concat_take_suc: "Suc n \<le> length xs \<Longrightarrow>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   637
  concat (take (Suc n) xs) = concat (take n xs) @ (xs ! n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   638
apply(subgoal_tac "take (Suc n) xs =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   639
                   take n xs @ [xs ! n]")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   640
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   641
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   642
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   643
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   644
  "\<lbrakk>as < length aprog; (abc_fetch as aprog) = Some ins\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   645
  \<Longrightarrow> ci (layout_of aprog) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   646
  (start_of (layout_of aprog) as) (ins) \<in> set (tms_of aprog)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   647
apply(insert ci_nth[of "layout_of aprog" aprog as], simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   648
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   649
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   650
lemma [simp]: "length (tms_of ap) = length ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   651
by(auto simp: tms_of.simps tpairs_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   652
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   653
lemma [intro]:  "n < length ap \<Longrightarrow> length (tms_of ap ! n) mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   654
apply(auto simp: tms_of.simps tpairs_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   655
apply(case_tac "ap ! n", auto simp: ci.simps length_findnth tinc_b_def tdec_b_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   656
apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   657
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   658
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   659
lemma compile_mod2: "length (concat (take n (tms_of ap))) mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   660
apply(induct n, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   661
apply(case_tac "n < length (tms_of ap)", simp add: take_Suc_conv_app_nth, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   662
apply(subgoal_tac "length (tms_of ap ! n) mod 2 = 0")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   663
apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   664
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   665
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   666
lemma tpa_states:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   667
  "\<lbrakk>tp = concat (take as (tms_of ap));
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   668
  as \<le> length ap\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   669
  start_of (layout_of ap) as = Suc (length tp div 2)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   670
proof(induct as arbitrary: tp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   671
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   672
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   673
    by(simp add: start_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   674
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   675
  case (Suc as tp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   676
  have ind: "\<And>tp. \<lbrakk>tp = concat (take as (tms_of ap)); as \<le> length ap\<rbrakk> \<Longrightarrow>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   677
    start_of (layout_of ap) as = Suc (length tp div 2)" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   678
  have tp: "tp = concat (take (Suc as) (tms_of ap))" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   679
  have le: "Suc as \<le> length ap" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   680
  have a: "start_of (layout_of ap) as = Suc (length (concat (take as (tms_of ap))) div 2)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   681
    using le
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   682
    by(rule_tac ind, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   683
  from a tp le show "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   684
    apply(simp add: start_of.simps take_Suc_conv_app_nth)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   685
    apply(subgoal_tac "length (concat (take as (tms_of ap))) mod 2= 0")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   686
    apply(subgoal_tac " length (tms_of ap ! as) mod 2 = 0")
163
67063c5365e1 changed theory names to uppercase
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 115
diff changeset
   687
    apply(simp add: Abacus.div_apart) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   688
    apply(simp add: layout_of.simps ci_length  tms_of.simps tpairs_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   689
    apply(auto  intro: compile_mod2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   690
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   691
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   692
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   693
lemma append_append_fetch: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   694
    "\<lbrakk>length tp1 mod 2 = 0; length tp mod 2 = 0;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   695
      length tp1 div 2 < a \<and> a \<le> length tp1 div 2 + length tp div 2\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   696
    \<Longrightarrow>fetch (tp1 @ tp @ tp2) a b = fetch tp (a - length tp1 div 2) b "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   697
apply(subgoal_tac "\<exists> x. a = length tp1 div 2 + x", erule exE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   698
apply(case_tac x, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   699
apply(subgoal_tac "length tp1 div 2 + Suc nat = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   700
             Suc (length tp1 div 2 + nat)")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   701
apply(simp only: fetch.simps nth_of.simps, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   702
apply(case_tac b, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   703
apply(subgoal_tac "2 * (length tp1 div 2) = length tp1", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   704
apply(subgoal_tac "2 * nat < length tp", simp add: nth_append, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   705
apply(subgoal_tac "2 * (length tp1 div 2) = length tp1", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   706
apply(subgoal_tac "2 * nat < length tp", simp add: nth_append, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   707
apply(auto simp: nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   708
apply(rule_tac x = "a - length tp1 div 2" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   709
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   710
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   711
lemma step_eq_fetch':
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   712
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   713
  and compile: "tp = tm_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   714
  and fetch: "abc_fetch as ap = Some ins"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   715
  and range1: "s \<ge> start_of ly as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   716
  and range2: "s < start_of ly (Suc as)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   717
  shows "fetch tp s b = fetch (ci ly (start_of ly as) ins)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   718
       (Suc s - start_of ly as) b "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   719
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   720
  have "\<exists>tp1 tp2. concat (tms_of ap) = tp1 @ ci ly (start_of ly as) ins @ tp2 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   721
    tp1 = concat (take as (tms_of ap)) \<and> tp2 = concat (drop (Suc as) (tms_of ap))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   722
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   723
    by(rule_tac t_split, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   724
  then obtain tp1 tp2 where a: "concat (tms_of ap) = tp1 @ ci ly (start_of ly as) ins @ tp2 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   725
    tp1 = concat (take as (tms_of ap)) \<and> tp2 = concat (drop (Suc as) (tms_of ap))" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   726
  then have b: "start_of (layout_of ap) as = Suc (length tp1 div 2)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   727
    using fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   728
    apply(rule_tac tpa_states, simp, simp add: abc_fetch.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   729
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   730
  have "fetch (tp1 @ (ci ly (start_of ly as) ins) @ tp2)  s b = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   731
        fetch (ci ly (start_of ly as) ins) (s - length tp1 div 2) b"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   732
  proof(rule_tac append_append_fetch)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   733
    show "length tp1 mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   734
      using a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   735
      by(auto, rule_tac compile_mod2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   736
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   737
    show "length (ci ly (start_of ly as) ins) mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   738
      apply(case_tac ins, auto simp: ci.simps length_findnth tinc_b_def tdec_b_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   739
      by(arith, arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   740
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   741
    show "length tp1 div 2 < s \<and> s \<le> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   742
      length tp1 div 2 + length (ci ly (start_of ly as) ins) div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   743
    proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   744
      have "length (ci ly (start_of ly as) ins) div 2 = length_of ins"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   745
        using ci_length by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   746
      moreover have "start_of ly (Suc as) = start_of ly as + length_of ins"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   747
        using fetch layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   748
        apply(simp add: start_of.simps abc_fetch.simps List.take_Suc_conv_app_nth 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   749
          split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   750
        apply(simp add: layout_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   751
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   752
      ultimately show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   753
        using b layout range1 range2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   754
        apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   755
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   756
    qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   757
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   758
  thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   759
    using b layout a compile  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   760
    apply(simp add: tm_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   761
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   762
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   763
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   764
lemma step_eq_fetch: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   765
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   766
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   767
  and abc_fetch: "abc_fetch as ap = Some ins" 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   768
  and fetch: "fetch (ci ly (start_of ly as) ins)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   769
       (Suc s - start_of ly as) b = (ac, ns)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   770
  and notfinal: "ns \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   771
  shows "fetch tp s b = (ac, ns)"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   772
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   773
  have "s \<ge> start_of ly as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   774
  proof(cases "s \<ge> start_of ly as")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   775
    case True thus "?thesis" by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   776
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   777
    case False 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   778
    have "\<not> start_of ly as \<le> s" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   779
    then have "Suc s - start_of ly as = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   780
      by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   781
    then have "fetch (ci ly (start_of ly as) ins)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   782
       (Suc s - start_of ly as) b = (Nop, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   783
      by(simp add: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   784
    with notfinal fetch show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   785
      by(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   786
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   787
  moreover have "s < start_of ly (Suc as)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   788
  proof(cases "s < start_of ly (Suc as)")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   789
    case True thus "?thesis" by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   790
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   791
    case False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   792
    have h: "\<not> s < start_of ly (Suc as)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   793
      by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   794
    then have "s > start_of ly as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   795
      using abc_fetch layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   796
      apply(simp add: start_of.simps abc_fetch.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   797
      apply(simp add: List.take_Suc_conv_app_nth, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   798
      apply(subgoal_tac "layout_of ap ! as > 0") 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   799
      apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   800
      apply(simp add: layout_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   801
      apply(case_tac "ap!as", auto simp: length_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   802
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   803
    from this and h have "fetch (ci ly (start_of ly as) ins) (Suc s - start_of ly as) b = (Nop, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   804
      using abc_fetch layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   805
      apply(case_tac b, simp_all add: Suc_diff_le)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   806
      apply(case_tac [!] ins, simp_all add: start_of_Suc2 start_of_Suc1 start_of_Suc3)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   807
      apply(simp_all only: length_ci_inc length_ci_dec length_ci_goto, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   808
      using layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   809
      apply(subgoal_tac [!] "start_of ly (Suc as) = start_of ly as + 2*nat1 + 16", simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   810
      apply(rule_tac [!] start_of_Suc2, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   811
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   812
    from fetch and notfinal this show "?thesis"by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   813
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   814
  ultimately show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   815
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   816
    apply(drule_tac b= b and ins = ins in step_eq_fetch', auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   817
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   818
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   819
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   820
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   821
lemma step_eq_in:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   822
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   823
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   824
  and fetch: "abc_fetch as ap = Some ins"    
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   825
  and exec: "step (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   826
  = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   827
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   828
  shows "step (s, l, r) (tp, 0) = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   829
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   830
  apply(simp add: step.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   831
  apply(case_tac "fetch (ci (layout_of ap) (start_of (layout_of ap) as) ins)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   832
    (Suc s - start_of (layout_of ap) as) (read r)", simp)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   833
  using layout
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   834
  apply(drule_tac s = s and b = "read r" and ac = a in step_eq_fetch, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   835
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   836
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   837
lemma steps_eq_in:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   838
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   839
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   840
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   841
  and fetch: "abc_fetch as ap = Some ins"    
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   842
  and exec: "steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   843
  = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   844
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   845
  shows "steps (s, l, r) (tp, 0) stp = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   846
  using exec notfinal
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   847
proof(induct stp arbitrary: s' l' r', simp add: steps.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   848
  fix stp s' l' r'
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   849
  assume ind: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   850
    "\<And>s' l' r'. \<lbrakk>steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp = (s', l', r'); s' \<noteq> 0\<rbrakk>
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   851
              \<Longrightarrow> steps (s, l, r) (tp, 0) stp = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   852
  and h: "steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) (Suc stp) = (s', l', r')" "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   853
  obtain s1 l1 r1 where g: "steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp = 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   854
                        (s1, l1, r1)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   855
    apply(case_tac "steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp") by blast
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   856
  moreover hence "s1 \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   857
    using h
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   858
    apply(simp add: step_red)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   859
    apply(case_tac "0 < s1", simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   860
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   861
  ultimately have "steps (s, l, r) (tp, 0) stp = (s1, l1, r1)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   862
    apply(rule_tac ind, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   863
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   864
  thus "steps (s, l, r) (tp, 0) (Suc stp) = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   865
    using h g assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   866
    apply(simp add: step_red)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   867
    apply(rule_tac step_eq_in, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   868
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   869
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   870
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   871
lemma tm_append_fetch_first: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   872
  "\<lbrakk>fetch A s b = (ac, ns); ns \<noteq> 0\<rbrakk> \<Longrightarrow> 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   873
    fetch (A @ B) s b = (ac, ns)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   874
apply(case_tac b)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   875
apply(case_tac [!] s, auto simp: fetch.simps nth_append split: if_splits)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   876
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   877
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   878
lemma tm_append_first_step_eq: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   879
  assumes "step (s, l, r) (A, off) = (s', l', r')"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   880
  and "s' \<noteq> 0"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   881
  shows "step (s, l, r) (A @ B, off) = (s', l', r')"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   882
using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   883
apply(simp add: step.simps)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   884
apply(case_tac "fetch A (s - off) (read r)")
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   885
apply(frule_tac  B = B and b = "read r" in tm_append_fetch_first, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   886
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   887
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   888
lemma tm_append_first_steps_eq: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   889
  assumes "steps (s, l, r) (A, off) stp = (s', l', r')"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   890
  and "s' \<noteq> 0"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   891
  shows "steps (s, l, r) (A @ B, off) stp = (s', l', r')"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   892
using assms
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   893
proof(induct stp arbitrary: s' l' r', simp add: steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   894
  fix stp s' l' r'
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   895
  assume ind: "\<And>s' l' r'. \<lbrakk>steps (s, l, r) (A, off) stp = (s', l', r'); s' \<noteq> 0\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   896
    \<Longrightarrow> steps (s, l, r) (A @ B, off) stp = (s', l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   897
    and h: "steps (s, l, r) (A, off) (Suc stp) = (s', l', r')" "s' \<noteq> 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   898
  obtain sa la ra where a: "steps (s, l, r) (A, off) stp = (sa, la, ra)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   899
    apply(case_tac "steps (s, l, r) (A, off) stp") by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   900
  hence "steps (s, l, r) (A @ B, off) stp = (sa, la, ra) \<and> sa \<noteq> 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   901
    using h ind[of sa la ra]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   902
    apply(case_tac sa, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   903
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   904
  thus "steps (s, l, r) (A @ B, off) (Suc stp) = (s', l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   905
    using h a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   906
    apply(simp add: step_red)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   907
    apply(rule_tac tm_append_first_step_eq, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   908
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   909
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   910
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   911
lemma tm_append_second_fetch_eq:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   912
  assumes
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   913
  even: "length A mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   914
  and off: "off = length A div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   915
  and fetch: "fetch B s b = (ac, ns)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   916
  and notfinal: "ns \<noteq> 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   917
  shows "fetch (A @ shift B off) (s + off) b = (ac, ns + off)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   918
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   919
apply(case_tac b)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   920
apply(case_tac [!] s, auto simp: fetch.simps nth_append shift.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   921
  split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   922
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   923
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   924
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   925
lemma tm_append_second_step_eq: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   926
  assumes 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   927
  exec: "step0 (s, l, r) B = (s', l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   928
  and notfinal: "s' \<noteq> 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   929
  and off: "off = length A div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   930
  and even: "length A mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   931
  shows "step0 (s + off, l, r) (A @ shift B off) = (s' + off, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   932
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   933
apply(simp add: step.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   934
apply(case_tac "fetch B s (read r)")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   935
apply(frule_tac tm_append_second_fetch_eq, simp_all, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   936
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   937
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   938
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   939
lemma tm_append_second_steps_eq: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   940
  assumes 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   941
  exec: "steps (s, l, r) (B, 0) stp = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   942
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   943
  and off: "off = length A div 2"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   944
  and even: "length A mod 2 = 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   945
  shows "steps (s + off, l, r) (A @ shift B off, 0) stp = (s' + off, l', r')"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   946
using exec notfinal
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   947
proof(induct stp arbitrary: s' l' r')
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   948
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   949
  thus "steps0 (s + off, l, r) (A @ shift B off) 0 = (s' + off, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   950
    by(simp add: steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   951
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   952
  case (Suc stp s' l' r')
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   953
  have ind: "\<And>s' l' r'. \<lbrakk>steps0 (s, l, r) B stp = (s', l', r'); s' \<noteq> 0\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   954
    steps0 (s + off, l, r) (A @ shift B off) stp = (s' + off, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   955
    by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   956
  have h: "steps0 (s, l, r) B (Suc stp) = (s', l', r')" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   957
  have k: "s' \<noteq> 0" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   958
  obtain s'' l'' r'' where a: "steps0 (s, l, r) B stp = (s'', l'', r'')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   959
    by (metis prod_cases3)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   960
  then have b: "s'' \<noteq> 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   961
    using h k
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   962
    by(rule_tac notI, auto simp: step_red)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   963
  from a b have c: "steps0 (s + off, l, r) (A @ shift B off) stp = (s'' + off, l'', r'')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   964
    by(erule_tac ind, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   965
  from c b h a k assms show "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   966
    thm tm_append_second_step_eq
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   967
    apply(simp add: step_red) by(rule tm_append_second_step_eq, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   968
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   969
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   970
lemma tm_append_second_fetch0_eq:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   971
  assumes
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   972
  even: "length A mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   973
  and off: "off = length A div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   974
  and fetch: "fetch B s b = (ac, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   975
  and notfinal: "s \<noteq> 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   976
  shows "fetch (A @ shift B off) (s + off) b = (ac, 0)"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   977
using assms
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   978
apply(case_tac b)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   979
apply(case_tac [!] s, auto simp: fetch.simps nth_append shift.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   980
  split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   981
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   982
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   983
lemma tm_append_second_halt_eq:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   984
  assumes 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   985
  exec: "steps (Suc 0, l, r) (B, 0) stp = (0, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   986
  and wf_B: "tm_wf (B, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   987
  and off: "off = length A div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   988
  and even: "length A mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   989
  shows "steps (Suc off, l, r) (A @ shift B off, 0) stp = (0, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   990
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   991
  thm before_final
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   992
  have "\<exists>n. \<not> is_final (steps0 (1, l, r) B n) \<and> steps0 (1, l, r) B (Suc n) = (0, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   993
    using exec by(rule_tac before_final, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   994
 then obtain n where a: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   995
   "\<not> is_final (steps0 (1, l, r) B n) \<and> steps0 (1, l, r) B (Suc n) = (0, l', r')" ..
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   996
 obtain s'' l'' r'' where b: "steps0 (1, l, r) B n = (s'', l'', r'') \<and> s'' >0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   997
   using a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   998
   by(case_tac "steps0 (1, l, r) B n", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   999
 have c: "steps (Suc 0 + off, l, r) (A @ shift B off, 0) n = (s'' + off, l'', r'')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1000
   using a b assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1001
   by(rule_tac tm_append_second_steps_eq, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1002
 obtain ac where d: "fetch B s'' (read r'') = (ac, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1003
   using  b a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1004
   by(case_tac "fetch B s'' (read r'')", auto simp: step_red step.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1005
 then have "fetch (A @ shift B off) (s'' + off) (read r'') = (ac, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1006
   using assms b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1007
   by(rule_tac tm_append_second_fetch0_eq, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1008
 then have e: "steps (Suc 0 + off, l, r) (A @ shift B off, 0) (Suc n) = (0, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1009
   using a b assms c d
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1010
   by(simp add: step_red step.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1011
 from a have "n < stp"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1012
   using exec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1013
 proof(cases "n < stp")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1014
   case  True thus "?thesis" by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1015
 next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1016
   case False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1017
   have "\<not> n < stp" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1018
   then obtain d where  "n = stp + d"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1019
     by (metis add.comm_neutral less_imp_add_positive nat_neq_iff)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1020
   thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1021
     using a e exec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1022
     by(simp add: steps_add)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1023
 qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1024
 then obtain d where "stp = Suc n + d"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1025
   by(metis add_Suc less_iff_Suc_add)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1026
 thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1027
   using e
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1028
   by(simp only: steps_add, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1029
qed
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1030
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1031
lemma tm_append_steps: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1032
  assumes 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1033
  aexec: "steps (s, l, r) (A, 0) stpa = (Suc (length A div 2), la, ra)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1034
  and bexec: "steps (Suc 0, la, ra) (B, 0) stpb =  (sb, lb, rb)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1035
  and notfinal: "sb \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1036
  and off: "off = length A div 2"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1037
  and even: "length A mod 2 = 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1038
  shows "steps (s, l, r) (A @ shift B off, 0) (stpa + stpb) = (sb + off, lb, rb)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1039
proof -
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1040
  have "steps (s, l, r) (A@shift B off, 0) stpa = (Suc (length A div 2), la, ra)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1041
    apply(rule_tac tm_append_first_steps_eq)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1042
    apply(auto simp: assms)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1043
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1044
  moreover have "steps (1 + off, la, ra) (A @ shift B off, 0) stpb = (sb + off, lb, rb)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1045
    apply(rule_tac tm_append_second_steps_eq)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1046
    apply(auto simp: assms bexec)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1047
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1048
  ultimately show "steps (s, l, r) (A @ shift B off, 0) (stpa + stpb) = (sb + off, lb, rb)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1049
    apply(simp add: steps_add off)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1050
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1051
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1052
       
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1053
subsection {* Crsp of Inc*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1054
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1055
fun at_begin_fst_bwtn :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1056
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1057
  "at_begin_fst_bwtn (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1058
      (\<exists> lm1 tn rn. lm1 = (lm @ 0\<up>tn) \<and> length lm1 = s \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1059
          (if lm1 = [] then l = Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1060
           else l = [Bk]@<rev lm1>@Bk#Bk#ires) \<and> r = Bk\<up>rn)" 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1061
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1062
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1063
fun at_begin_fst_awtn :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1064
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1065
  "at_begin_fst_awtn (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1066
      (\<exists> lm1 tn rn. lm1 = (lm @ 0\<up>tn) \<and> length lm1 = s \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1067
         (if lm1 = []  then l = Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1068
          else l = [Bk]@<rev lm1>@Bk#Bk#ires) \<and> r = [Oc]@Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1069
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1070
fun at_begin_norm :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1071
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1072
  "at_begin_norm (as, lm) (s, l, r) ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1073
      (\<exists> lm1 lm2 rn. lm = lm1 @ lm2 \<and> length lm1 = s \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1074
        (if lm1 = [] then l = Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1075
         else l = Bk # <rev lm1> @ Bk # Bk # ires ) \<and> r = <lm2>@Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1076
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1077
fun in_middle :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1078
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1079
  "in_middle (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1080
      (\<exists> lm1 lm2 tn m ml mr rn. lm @ 0\<up>tn = lm1 @ [m] @ lm2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1081
       \<and> length lm1 = s \<and> m + 1 = ml + mr \<and>  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1082
         ml \<noteq> 0 \<and> tn = s + 1 - length lm \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1083
       (if lm1 = [] then l = Oc\<up>ml @ Bk # Bk # ires 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1084
        else l = Oc\<up>ml@[Bk]@<rev lm1>@
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1085
                 Bk # Bk # ires) \<and> (r = Oc\<up>mr @ [Bk] @ <lm2>@ Bk\<up>rn \<or> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1086
      (lm2 = [] \<and> r = Oc\<up>mr))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1087
      )"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1088
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1089
fun inv_locate_a :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1090
  where "inv_locate_a (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1091
     (at_begin_norm (as, lm) (s, l, r) ires \<or>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1092
      at_begin_fst_bwtn (as, lm) (s, l, r) ires \<or>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1093
      at_begin_fst_awtn (as, lm) (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1094
      )"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1095
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1096
fun inv_locate_b :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1097
  where "inv_locate_b (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1098
        (in_middle (as, lm) (s, l, r)) ires "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1099
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1100
fun inv_after_write :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1101
  where "inv_after_write (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1102
           (\<exists> rn m lm1 lm2. lm = lm1 @ m # lm2 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1103
             (if lm1 = [] then l = Oc\<up>m @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1104
              else Oc # l = Oc\<up>Suc m@ Bk # <rev lm1> @ 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1105
                      Bk # Bk # ires) \<and> r = [Oc] @ <lm2> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1106
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1107
fun inv_after_move :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1108
  where "inv_after_move (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1109
      (\<exists> rn m lm1 lm2. lm = lm1 @ m # lm2 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1110
        (if lm1 = [] then l = Oc\<up>Suc m @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1111
         else l = Oc\<up>Suc m@ Bk # <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1112
        r = <lm2> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1113
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1114
fun inv_after_clear :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1115
  where "inv_after_clear (as, lm) (s, l, r) ires =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1116
       (\<exists> rn m lm1 lm2 r'. lm = lm1 @ m # lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1117
        (if lm1 = [] then l = Oc\<up>Suc m @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1118
         else l = Oc\<up>Suc m @ Bk # <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1119
          r = Bk # r' \<and> Oc # r' = <lm2> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1120
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1121
fun inv_on_right_moving :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1122
  where "inv_on_right_moving (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1123
       (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1124
            ml + mr = m \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1125
          (if lm1 = [] then l = Oc\<up>ml @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1126
          else l = Oc\<up>ml  @ [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1127
         ((r = Oc\<up>mr @ [Bk] @ <lm2> @ Bk\<up>rn) \<or> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1128
          (r = Oc\<up>mr \<and> lm2 = [])))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1129
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1130
fun inv_on_left_moving_norm :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1131
  where "inv_on_left_moving_norm (as, lm) (s, l, r) ires =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1132
      (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 \<and>  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1133
             ml + mr = Suc m \<and> mr > 0 \<and> (if lm1 = [] then l = Oc\<up>ml @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1134
                                         else l =  Oc\<up>ml @ Bk # <rev lm1> @ Bk # Bk # ires)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1135
        \<and> (r = Oc\<up>mr @ Bk # <lm2> @ Bk\<up>rn \<or> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1136
           (lm2 = [] \<and> r = Oc\<up>mr)))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1137
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1138
fun inv_on_left_moving_in_middle_B:: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1139
  where "inv_on_left_moving_in_middle_B (as, lm) (s, l, r) ires =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1140
                (\<exists> lm1 lm2 rn. lm = lm1 @ lm2 \<and>  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1141
                     (if lm1 = [] then l = Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1142
                      else l = <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1143
                      r = Bk # <lm2> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1144
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1145
fun inv_on_left_moving :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1146
  where "inv_on_left_moving (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1147
       (inv_on_left_moving_norm  (as, lm) (s, l, r) ires \<or>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1148
        inv_on_left_moving_in_middle_B (as, lm) (s, l, r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1149
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1150
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1151
fun inv_check_left_moving_on_leftmost :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1152
  where "inv_check_left_moving_on_leftmost (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1153
                (\<exists> rn. l = ires \<and> r = [Bk, Bk] @ <lm> @  Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1154
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1155
fun inv_check_left_moving_in_middle :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1156
  where "inv_check_left_moving_in_middle (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1157
              (\<exists> lm1 lm2 r' rn. lm = lm1 @ lm2 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1158
                 (Oc # l = <rev lm1> @ Bk # Bk # ires) \<and> r = Oc # Bk # r' \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1159
                           r' = <lm2> @  Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1160
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1161
fun inv_check_left_moving :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1162
  where "inv_check_left_moving (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1163
             (inv_check_left_moving_on_leftmost (as, lm) (s, l, r) ires \<or>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1164
             inv_check_left_moving_in_middle (as, lm) (s, l, r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1165
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1166
fun inv_after_left_moving :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1167
  where "inv_after_left_moving (as, lm) (s, l, r) ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1168
              (\<exists> rn. l = Bk # ires \<and> r = Bk # <lm> @  Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1169
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1170
fun inv_stop :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1171
  where "inv_stop (as, lm) (s, l, r) ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1172
              (\<exists> rn. l = Bk # Bk # ires \<and> r = <lm> @  Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1173
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1174
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1175
lemma halt_lemma2': 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1176
  "\<lbrakk>wf LE;  \<forall> n. ((\<not> P (f n) \<and> Q (f n)) \<longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1177
    (Q (f (Suc n)) \<and> (f (Suc n), (f n)) \<in> LE)); Q (f 0)\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1178
      \<Longrightarrow> \<exists> n. P (f n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1179
apply(intro exCI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1180
apply(subgoal_tac "\<forall> n. Q (f n)", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1181
apply(drule_tac f = f in wf_inv_image)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1182
apply(simp add: inv_image_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1183
apply(erule wf_induct, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1184
apply(erule_tac x = x in allE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1185
apply(erule_tac x = n in allE, erule_tac x = n in allE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1186
apply(erule_tac x = "Suc x" in allE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1187
apply(rule_tac allI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1188
apply(induct_tac n, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1189
apply(erule_tac x = na in allE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1190
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1191
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1192
lemma halt_lemma2'': 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1193
  "\<lbrakk>P (f n); \<not> P (f (0::nat))\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1194
         \<exists> n. (P (f n) \<and> (\<forall> i < n. \<not> P (f i)))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1195
apply(induct n rule: nat_less_induct, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1196
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1197
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1198
lemma halt_lemma2''':
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1199
 "\<lbrakk>\<forall>n. \<not> P (f n) \<and> Q (f n) \<longrightarrow> Q (f (Suc n)) \<and> (f (Suc n), f n) \<in> LE;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1200
                 Q (f 0);  \<forall>i<na. \<not> P (f i)\<rbrakk> \<Longrightarrow> Q (f na)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1201
apply(induct na, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1202
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1203
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1204
lemma halt_lemma2: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1205
  "\<lbrakk>wf LE;  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1206
    Q (f 0); \<not> P (f 0);
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1207
    \<forall> n. ((\<not> P (f n) \<and> Q (f n)) \<longrightarrow> (Q (f (Suc n)) \<and> (f (Suc n), (f n)) \<in> LE))\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1208
  \<Longrightarrow> \<exists> n. P (f n) \<and> Q (f n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1209
apply(insert halt_lemma2' [of LE P f Q], simp, erule_tac exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1210
apply(subgoal_tac "\<exists> n. (P (f n) \<and> (\<forall> i < n. \<not> P (f i)))")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1211
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1212
apply(rule_tac x = na in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1213
apply(rule halt_lemma2''', simp, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1214
apply(erule_tac halt_lemma2'', simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1215
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1216
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1217
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1218
fun findnth_inv :: "layout \<Rightarrow> nat \<Rightarrow> inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1219
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1220
  "findnth_inv ly n (as, lm) (s, l, r) ires =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1221
              (if s = 0 then False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1222
               else if s \<le> Suc (2*n) then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1223
                  if s mod 2 = 1 then inv_locate_a (as, lm) ((s - 1) div 2, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1224
                  else inv_locate_b (as, lm) ((s - 1) div 2, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1225
               else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1226
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1227
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1228
fun findnth_state :: "config \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1229
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1230
  "findnth_state (s, l, r) n = (Suc (2*n) - s)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1231
  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1232
fun findnth_step :: "config \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1233
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1234
  "findnth_step (s, l, r) n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1235
           (if s mod 2 = 1 then
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1236
                   (if (r \<noteq> [] \<and> hd r = Oc) then 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1237
                    else 1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1238
            else length r)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1239
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1240
fun findnth_measure :: "config \<times> nat \<Rightarrow> nat \<times> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1241
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1242
  "findnth_measure (c, n) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1243
     (findnth_state c n, findnth_step c n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1244
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1245
definition lex_pair :: "((nat \<times> nat) \<times> nat \<times> nat) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1246
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1247
  "lex_pair \<equiv> less_than <*lex*> less_than"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1248
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1249
definition findnth_LE :: "((config \<times> nat) \<times> (config \<times> nat)) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1250
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1251
   "findnth_LE \<equiv> (inv_image lex_pair findnth_measure)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1252
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1253
lemma wf_findnth_LE: "wf findnth_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1254
by(auto intro:wf_inv_image simp: findnth_LE_def lex_pair_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1255
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1256
declare findnth_inv.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1257
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1258
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1259
  "\<lbrakk>x < Suc (Suc (2 * n)); Suc x mod 2 = Suc 0; \<not> x < 2 * n\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1260
 \<Longrightarrow> x = 2*n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1261
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1262
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1263
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1264
  "\<lbrakk>0 < a; a < Suc (2 * n); a mod 2 = Suc 0\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1265
      \<Longrightarrow> fetch (findnth n) a Bk = (W1, a)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1266
apply(case_tac a, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1267
apply(induct n, auto simp: findnth.simps length_findnth nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1268
apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1269
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1270
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1271
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1272
  "\<lbrakk>0 < a; a < Suc (2 * n); a mod 2 = Suc 0\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1273
      \<Longrightarrow> fetch (findnth n) a Oc = (R, Suc a)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1274
apply(case_tac a, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1275
apply(induct n, auto simp: findnth.simps length_findnth nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1276
apply(subgoal_tac "nat = 2 * n", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1277
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1278
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1279
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1280
  "\<lbrakk>0 < a; a < Suc (2*n); a mod 2 \<noteq> Suc 0\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1281
     \<Longrightarrow> fetch (findnth n) a Oc = (R, a)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1282
apply(case_tac a, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1283
apply(induct n, auto simp: findnth.simps length_findnth nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1284
apply(subgoal_tac "nat = Suc (2 * n)", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1285
apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1286
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1287
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1288
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1289
  "\<lbrakk>0 < a; a < Suc (2*n); a mod 2 \<noteq> Suc 0\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1290
     \<Longrightarrow> fetch (findnth n) a Bk = (R, Suc a)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1291
apply(case_tac a, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1292
apply(induct n, auto simp: findnth.simps length_findnth nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1293
apply(subgoal_tac "nat = Suc (2 * n)", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1294
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1295
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1296
declare at_begin_norm.simps[simp del] at_begin_fst_bwtn.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1297
   at_begin_fst_awtn.simps[simp del] in_middle.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1298
   abc_lm_s.simps[simp del] abc_lm_v.simps[simp del]  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1299
   ci.simps[simp del] inv_after_move.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1300
   inv_on_left_moving_norm.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1301
   inv_on_left_moving_in_middle_B.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1302
   inv_after_clear.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1303
   inv_after_write.simps[simp del] inv_on_left_moving.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1304
   inv_on_right_moving.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1305
   inv_check_left_moving.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1306
   inv_check_left_moving_in_middle.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1307
   inv_check_left_moving_on_leftmost.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1308
   inv_after_left_moving.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1309
   inv_stop.simps[simp del] inv_locate_a.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1310
   inv_locate_b.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1311
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1312
lemma [intro]: "\<exists>rn. [Bk] = Bk \<up> rn"
111
dfc629cd11de made uncomputable compatible with abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 101
diff changeset
  1313
by (metis replicate_0 replicate_Suc)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1314
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1315
lemma [intro]:  "at_begin_norm (as, am) (q, aaa, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1316
             \<Longrightarrow> at_begin_norm (as, am) (q, aaa, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1317
apply(simp add: at_begin_norm.simps, erule_tac exE, erule_tac exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1318
apply(rule_tac x = lm1 in exI, simp, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1319
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1320
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1321
lemma [intro]: "at_begin_fst_bwtn (as, am) (q, aaa, []) ires 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1322
            \<Longrightarrow> at_begin_fst_bwtn (as, am) (q, aaa, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1323
apply(simp only: at_begin_fst_bwtn.simps, erule_tac exE, erule_tac exE, erule_tac exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1324
apply(rule_tac x = "am @ 0\<up>tn" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1325
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1326
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1327
lemma [intro]: "at_begin_fst_awtn (as, am) (q, aaa, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1328
           \<Longrightarrow> at_begin_fst_awtn (as, am) (q, aaa, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1329
apply(auto simp: at_begin_fst_awtn.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1330
done 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1331
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1332
lemma [intro]: "inv_locate_a (as, am) (q, aaa, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1333
            \<Longrightarrow> inv_locate_a (as, am) (q, aaa, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1334
apply(simp only: inv_locate_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1335
apply(erule disj_forward)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1336
defer
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1337
apply(erule disj_forward, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1338
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1339
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1340
lemma tape_of_nl_cons: "<m # lm> = (if lm = [] then Oc\<up>(Suc m)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1341
                    else Oc\<up>(Suc m) @ Bk # <lm>)"
101
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1342
apply(case_tac lm, simp_all add: tape_of_nl_abv  tape_of_nat_abv split: if_splits)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1343
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1344
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1345
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1346
lemma locate_a_2_locate_a[simp]: "inv_locate_a (as, am) (q, aaa, Bk # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1347
       \<Longrightarrow> inv_locate_a (as, am) (q, aaa, Oc # xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1348
apply(simp only: inv_locate_a.simps at_begin_norm.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1349
                 at_begin_fst_bwtn.simps at_begin_fst_awtn.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1350
apply(erule_tac disjE, erule exE, erule exE, erule exE, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1351
      rule disjI2, rule disjI2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1352
defer
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1353
apply(erule_tac disjE, erule exE, erule exE, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1354
      erule exE, rule disjI2, rule disjI2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1355
prefer 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1356
apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1357
proof-
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1358
  fix lm1 tn rn
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1359
  assume k: "lm1 = am @ 0\<up>tn \<and> length lm1 = q \<and> (if lm1 = [] then aaa = Bk # Bk # 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1360
    ires else aaa = [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> Bk # xs = Bk\<up>rn"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1361
  thus "\<exists>lm1 tn rn. lm1 = am @ 0 \<up> tn \<and> length lm1 = q \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1362
    (if lm1 = [] then aaa = Bk # Bk # ires else aaa = [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> Oc # xs = [Oc] @ Bk \<up> rn"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1363
    (is "\<exists>lm1 tn rn. ?P lm1 tn rn")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1364
  proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1365
    from k have "?P lm1 tn (rn - 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1366
      apply(auto simp: Oc_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1367
      by(case_tac [!] "rn::nat", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1368
    thus ?thesis by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1369
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1370
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1371
  fix lm1 lm2 rn
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1372
  assume h1: "am = lm1 @ lm2 \<and> length lm1 = q \<and> (if lm1 = [] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1373
    then aaa = Bk # Bk # ires else aaa = Bk # <rev lm1> @ Bk # Bk # ires) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1374
    Bk # xs = <lm2> @ Bk\<up>rn"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1375
  from h1 have h2: "lm2 = []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1376
    apply(auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1377
    apply(case_tac [!] lm2, simp_all add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1378
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1379
  from h1 and h2 show "\<exists>lm1 tn rn. lm1 = am @ 0\<up>tn \<and> length lm1 = q \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1380
    (if lm1 = [] then aaa = Bk # Bk # ires else aaa = [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1381
    Oc # xs = [Oc] @ Bk\<up>rn" 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1382
    (is "\<exists>lm1 tn rn. ?P lm1 tn rn")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1383
  proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1384
    from h1 and h2  have "?P lm1 0 (rn - 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1385
      apply(auto simp: Oc_def
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1386
                      tape_of_nl_abv tape_of_nat_list.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1387
      by(case_tac "rn::nat", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1388
    thus ?thesis by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1389
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1390
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1391
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1392
lemma [simp]: "inv_locate_a (as, am) (q, aaa, []) ires \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1393
               inv_locate_a (as, am) (q, aaa, [Oc]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1394
apply(insert locate_a_2_locate_a [of as am q aaa "[]"])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1395
apply(subgoal_tac "inv_locate_a (as, am) (q, aaa, [Bk]) ires", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1396
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1397
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1398
(*inv: from locate_b to locate_b*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1399
lemma [simp]: "inv_locate_b (as, am) (q, aaa, Oc # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1400
         \<Longrightarrow> inv_locate_b (as, am) (q, Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1401
apply(simp only: inv_locate_b.simps in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1402
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1403
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1404
      rule_tac x = tn in exI, rule_tac x = m in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1405
apply(rule_tac x = "Suc ml" in exI, rule_tac x = "mr - 1" in exI,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1406
      rule_tac x = rn in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1407
apply(case_tac mr, simp_all, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1408
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1409
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1410
(*
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1411
lemma zero_and_nil[intro]: "(Bk # Bk\<^bsup>n\<^esup> = Oc\<^bsup>mr\<^esup> @ Bk # <lm::nat list> @ 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1412
                             Bk\<^bsup>rn \<^esup>) \<or> (lm2 = [] \<and> Bk # Bk\<^bsup>n\<^esup> = Oc\<^bsup>mr\<^esup>)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1413
       \<Longrightarrow> mr = 0 \<and> lm = []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1414
apply(rule context_conjI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1415
apply(case_tac mr, auto simp:exponent_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1416
apply(insert BkCons_nil[of "replicate (n - 1) Bk" lm rn])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1417
apply(case_tac n, auto simp: exponent_def Bk_def  tape_of_nl_nil_eq)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1418
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1419
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1420
lemma tape_of_nat_def: "<[m::nat]> =  Oc # Oc\<^bsup>m\<^esup>"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1421
apply(simp add: tape_of_nl_abv tape_of_nat_list.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1422
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1423
*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1424
lemma [simp]:  "<[x::nat]> = Oc\<up>(Suc x)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1425
apply(simp add: tape_of_nat_abv tape_of_nl_abv)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1426
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1427
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1428
lemma [simp]: " <([]::nat list)> = []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1429
apply(simp add: tape_of_nl_abv)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1430
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1431
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1432
lemma [simp]: "\<lbrakk>inv_locate_b (as, am) (q, aaa, Bk # xs) ires; \<exists>n. xs = Bk\<up>n\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1433
            \<Longrightarrow> inv_locate_a (as, am) (Suc q, Bk # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1434
apply(simp add: inv_locate_b.simps inv_locate_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1435
apply(rule_tac disjI2, rule_tac disjI1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1436
apply(simp only: in_middle.simps at_begin_fst_bwtn.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1437
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1438
apply(rule_tac x = "lm1 @ [m]" in exI, rule_tac x = tn in exI, simp split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1439
apply(case_tac mr, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1440
apply(case_tac "length am", simp_all, case_tac tn, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1441
apply(case_tac lm2, simp_all add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1442
apply(case_tac am, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1443
apply(case_tac n, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1444
apply(case_tac n, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1445
apply(case_tac mr, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1446
apply(case_tac lm2, simp_all add: tape_of_nl_cons split: if_splits, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1447
apply(case_tac [!] n, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1448
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1449
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1450
lemma [simp]: "(Oc # r = Bk \<up> rn) = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1451
apply(case_tac rn, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1452
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1453
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1454
lemma [simp]: "(\<exists>rna. Bk \<up> rn = Bk # Bk \<up> rna) \<or> rn = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1455
apply(case_tac rn, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1456
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1457
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1458
lemma [simp]: "(\<forall> x. a \<noteq> x) = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1459
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1460
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1461
lemma exp_ind: "a\<up>(Suc x) = a\<up>x @ [a]"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1462
apply(induct x, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1463
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1464
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1465
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1466
      "inv_locate_a (as, lm) (q, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1467
       \<Longrightarrow> inv_locate_b (as, lm) (q, Oc # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1468
apply(simp only: inv_locate_a.simps inv_locate_b.simps in_middle.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1469
          at_begin_norm.simps at_begin_fst_bwtn.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1470
          at_begin_fst_awtn.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1471
apply(erule disjE, erule exE, erule exE, erule exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1472
apply(rule_tac x = lm1 in exI, rule_tac x = "tl lm2" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1473
apply(rule_tac x = 0 in exI, rule_tac x = "hd lm2" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1474
apply(case_tac lm2, auto simp: tape_of_nl_cons )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1475
apply(rule_tac x = 1 in exI, rule_tac x = a in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1476
apply(case_tac list, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1477
apply(case_tac rn, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1478
apply(rule_tac x = "lm @ replicate tn 0" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1479
      rule_tac x = "[]" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1480
      rule_tac x = "Suc tn" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1481
      rule_tac x = 0 in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1482
apply(simp only: replicate_Suc[THEN sym] exp_ind)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1483
apply(rule_tac x = "Suc 0" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1484
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1485
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1486
lemma length_equal: "xs = ys \<Longrightarrow> length xs = length ys"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1487
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1488
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1489
lemma [simp]: "\<lbrakk>inv_locate_b (as, am) (q, aaa, Bk # xs) ires; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1490
                \<not> (\<exists>n. xs = Bk\<up>n)\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1491
       \<Longrightarrow> inv_locate_a (as, am) (Suc q, Bk # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1492
apply(simp add: inv_locate_b.simps inv_locate_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1493
apply(rule_tac disjI1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1494
apply(simp only: in_middle.simps at_begin_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1495
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1496
apply(rule_tac x = "lm1 @ [m]" in exI, rule_tac x = lm2 in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1497
apply(subgoal_tac "tn = 0", simp , auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1498
apply(case_tac [!] mr, simp_all, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1499
apply(simp add: tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1500
apply(drule_tac length_equal, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1501
apply(case_tac "length am", simp_all, erule_tac x = rn in allE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1502
apply(drule_tac length_equal, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1503
apply(case_tac "(Suc (length lm1) - length am)", simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1504
apply(case_tac lm2, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1505
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1506
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1507
lemma locate_b_2_a[intro]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1508
       "inv_locate_b (as, am) (q, aaa, Bk # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1509
    \<Longrightarrow> inv_locate_a (as, am) (Suc q, Bk # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1510
apply(case_tac "\<exists> n. xs = Bk\<up>n", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1511
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1512
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1513
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1514
lemma [simp]:  "inv_locate_b (as, am) (q, l, []) ires 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1515
           \<Longrightarrow>  inv_locate_b (as, am) (q, l, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1516
apply(simp only: inv_locate_b.simps in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1517
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1518
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1519
      rule_tac x = tn in exI, rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1520
      rule_tac x = ml in exI, rule_tac x = mr in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1521
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1522
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1523
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1524
(*inv: from locate_b to after_write*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1525
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1526
lemma [simp]: "(a mod 2 \<noteq> Suc 0) = (a mod 2 = 0)  "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1527
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1528
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1529
lemma [simp]: "(a mod 2 \<noteq> 0) = (a mod 2 = Suc 0)  "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1530
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1531
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1532
lemma mod_ex1: "(a mod 2 = Suc 0) = (\<exists> q. a = Suc (2 * q))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1533
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1534
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1535
lemma mod_ex2: "(a mod (2::nat) = 0) = (\<exists> q. a = 2 * q)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1536
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1537
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1538
lemma [simp]: "(2*q - Suc 0) div 2 = (q - 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1539
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1540
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1541
lemma [simp]: "(Suc (2*q)) div 2 = q"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1542
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1543
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1544
lemma mod_2: "x mod 2  = 0 \<or>  x mod 2 = Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1545
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1546
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1547
lemma [simp]: "x mod 2 = 0 \<Longrightarrow> Suc x mod 2 = Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1548
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1549
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1550
lemma [simp]: "x mod 2 = Suc 0 \<Longrightarrow> Suc x mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1551
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1552
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1553
lemma [simp]:  "inv_locate_b (as, am) (q, l, []) ires 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1554
           \<Longrightarrow>  inv_locate_b (as, am) (q, l, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1555
apply(simp only: inv_locate_b.simps in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1556
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1557
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1558
      rule_tac x = tn in exI, rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1559
      rule_tac x = ml in exI, rule_tac x = mr in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1560
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1561
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1562
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1563
lemma locate_b_2_locate_a[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1564
    "\<lbrakk>q > 0;  inv_locate_b (as, am) (q - Suc 0, aaa, Bk # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1565
   \<Longrightarrow>  inv_locate_a (as, am) (q, Bk # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1566
apply(insert locate_b_2_a [of as am "q - 1" aaa xs ires], simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1567
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1568
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1569
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1570
lemma [simp]:  "inv_locate_b (as, am) (q, l, []) ires 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1571
           \<Longrightarrow>  inv_locate_b (as, am) (q, l, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1572
apply(simp only: inv_locate_b.simps in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1573
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1574
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1575
      rule_tac x = tn in exI, rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1576
      rule_tac x = ml in exI, rule_tac x = mr in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1577
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1578
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1579
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1580
(*inv: from locate_b to after_write*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1581
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1582
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1583
  "crsp (layout_of ap) (as, lm) (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1584
  \<Longrightarrow> findnth_inv (layout_of ap) n (as, lm) (Suc 0, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1585
apply(auto simp: crsp.simps findnth_inv.simps inv_locate_a.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1586
               at_begin_norm.simps at_begin_fst_awtn.simps at_begin_fst_bwtn.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1587
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1588
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1589
lemma findnth_correct_pre: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1590
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1591
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1592
  and not0: "n > 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1593
  and f: "f = (\<lambda> stp. (steps (Suc 0, l, r) (findnth n, 0) stp, n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1594
  and P: "P = (\<lambda> ((s, l, r), n). s = Suc (2 * n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1595
  and Q: "Q = (\<lambda> ((s, l, r), n). findnth_inv ly n (as, lm) (s, l, r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1596
  shows "\<exists> stp. P (f stp) \<and> Q (f stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1597
thm halt_lemma2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1598
proof(rule_tac LE = findnth_LE in halt_lemma2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1599
  show "wf findnth_LE"  by(intro wf_findnth_LE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1600
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1601
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1602
    using crsp layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1603
    apply(simp add: f P Q steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1604
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1605
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1606
  show "\<not> P (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1607
    using not0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1608
    apply(simp add: f P steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1609
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1610
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1611
  show "\<forall>n. \<not> P (f n) \<and> Q (f n) \<longrightarrow> Q (f (Suc n)) \<and> (f (Suc n), f n) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1612
        \<in> findnth_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1613
  proof(rule_tac allI, rule_tac impI, simp add: f, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1614
      case_tac "steps (Suc 0, l, r) (findnth n, 0) na", simp add: P)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1615
    fix na a b c
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1616
    assume "a \<noteq> Suc (2 * n) \<and> Q ((a, b, c), n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1617
    thus  "Q (step (a, b, c) (findnth n, 0), n) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1618
        ((step (a, b, c) (findnth n, 0), n), (a, b, c), n) \<in> findnth_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1619
      apply(case_tac c, case_tac [2] aa)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1620
      apply(simp_all add: step.simps findnth_LE_def Q findnth_inv.simps mod_2  lex_pair_def split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1621
      apply(auto simp: mod_ex1 mod_ex2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1622
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1623
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1624
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1625
            
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1626
lemma [intro]: "inv_locate_a (as, lm) (0, Bk # Bk # ires, <lm> @ Bk \<up> x) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1627
apply(auto simp: crsp.simps inv_locate_a.simps at_begin_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1628
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1629
lemma [simp]: "crsp ly (as, lm) (s, l, r) ires \<Longrightarrow> inv_locate_a (as, lm) (0, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1630
apply(auto simp: crsp.simps inv_locate_a.simps at_begin_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1631
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1632
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1633
lemma findnth_correct: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1634
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1635
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1636
  shows "\<exists> stp l' r'. steps (Suc 0, l, r) (findnth n, 0) stp = (Suc (2 * n), l', r')
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1637
              \<and> inv_locate_a (as, lm) (n, l', r') ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1638
  using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1639
  apply(case_tac "n = 0")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1640
  apply(rule_tac x = 0 in exI, auto simp: steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1641
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1642
  apply(drule_tac findnth_correct_pre, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1643
  apply(rule_tac x = stp in exI, simp add: findnth_inv.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1644
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1645
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1646
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1647
fun inc_inv :: "nat \<Rightarrow> inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1648
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1649
  "inc_inv n (as, lm) (s, l, r) ires =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1650
              (let lm' = abc_lm_s lm n (Suc (abc_lm_v lm n)) in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1651
                if s = 0 then False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1652
                else if s = 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1653
                   inv_locate_a (as, lm) (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1654
                else if s = 2 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1655
                   inv_locate_b (as, lm) (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1656
                else if s = 3 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1657
                   inv_after_write (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1658
                else if s = Suc 3 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1659
                   inv_after_move (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1660
                else if s = Suc 4 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1661
                   inv_after_clear (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1662
                else if s = Suc (Suc 4) then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1663
                   inv_on_right_moving (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1664
                else if s = Suc (Suc 5) then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1665
                   inv_on_left_moving (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1666
                else if s = Suc (Suc (Suc 5)) then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1667
                   inv_check_left_moving (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1668
                else if s = Suc (Suc (Suc (Suc 5))) then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1669
                   inv_after_left_moving (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1670
                else if s = Suc (Suc (Suc (Suc (Suc 5)))) then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1671
                   inv_stop (as, lm') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1672
                else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1673
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1674
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1675
fun abc_inc_stage1 :: "config \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1676
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1677
  "abc_inc_stage1 (s, l, r) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1678
            (if s = 0 then 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1679
             else if s \<le> 2 then 5
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1680
             else if s \<le> 6 then 4
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1681
             else if s \<le> 8 then 3
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1682
             else if s = 9 then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1683
             else 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1684
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1685
fun abc_inc_stage2 :: "config \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1686
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1687
  "abc_inc_stage2 (s, l, r) =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1688
                (if s = 1 then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1689
                 else if s = 2 then 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1690
                 else if s = 3 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1691
                 else if s = 4 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1692
                 else if s = 5 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1693
                 else if s = 6 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1694
                                  if r \<noteq> [] then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1695
                                  else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1696
                 else if s = 7 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1697
                 else if s = 8 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1698
                 else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1699
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1700
fun abc_inc_stage3 :: "config \<Rightarrow>  nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1701
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1702
  "abc_inc_stage3 (s, l, r) = (
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1703
              if s = 4 then 4
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1704
              else if s = 5 then 3
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1705
              else if s = 6 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1706
                   if r \<noteq> [] \<and> hd r = Oc then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1707
                   else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1708
              else if s = 3 then 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1709
              else if s = 2 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1710
              else if s = 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1711
                      if (r \<noteq> [] \<and> hd r = Oc) then 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1712
                      else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1713
              else 10 - s)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1714
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1715
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1716
definition inc_measure :: "config \<Rightarrow> nat \<times> nat \<times> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1717
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1718
  "inc_measure c = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1719
    (abc_inc_stage1 c, abc_inc_stage2 c, abc_inc_stage3 c)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1720
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1721
definition lex_triple :: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1722
   "((nat \<times> (nat \<times> nat)) \<times> (nat \<times> (nat \<times> nat))) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1723
  where "lex_triple \<equiv> less_than <*lex*> lex_pair"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1724
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1725
definition inc_LE :: "(config \<times> config) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1726
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1727
  "inc_LE \<equiv> (inv_image lex_triple inc_measure)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1728
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1729
declare inc_inv.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1730
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1731
lemma wf_inc_le[intro]: "wf inc_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1732
by(auto intro:wf_inv_image simp: inc_LE_def lex_triple_def lex_pair_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1733
115
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1734
lemma numeral_5_eq_5: "5 = Suc (Suc (Suc (Suc (Suc 0))))"
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1735
by arith
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1736
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1737
lemma numeral_6_eq_6: "6 = Suc (Suc (Suc (Suc (Suc 1))))"
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1738
by arith
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1739
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1740
lemma numeral_7_eq_7: "7 = Suc (Suc (Suc (Suc (Suc 2))))"
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1741
by arith
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1742
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1743
lemma numeral_8_eq_8: "8 = Suc (Suc (Suc (Suc (Suc 3))))"
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1744
by arith
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1745
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1746
lemma numeral_9_eq_9: "9 = Suc (Suc (Suc (Suc (Suc (Suc 3)))))"
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1747
by arith
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1748
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1749
lemma numeral_10_eq_10: "10 = Suc (Suc (Suc (Suc (Suc (Suc (Suc 3))))))"
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  1750
by arith
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1751
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1752
lemma inv_locate_b_2_after_write[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1753
      "inv_locate_b (as, am) (n, aaa, Bk # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1754
      \<Longrightarrow> inv_after_write (as, abc_lm_s am n (Suc (abc_lm_v am n)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1755
          (s, aaa, Oc # xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1756
apply(auto simp: in_middle.simps inv_after_write.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1757
                 abc_lm_v.simps abc_lm_s.simps  inv_locate_b.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1758
apply(case_tac [!] mr, auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1759
apply(rule_tac x = rn in exI, rule_tac x = "Suc m" in exI,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1760
      rule_tac x = "lm1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1761
apply(rule_tac x = "lm2" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1762
apply(simp only: Suc_diff_le exp_ind)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1763
apply(subgoal_tac "lm2 = []", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1764
apply(drule_tac length_equal, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1765
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1766
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1767
lemma [simp]: "inv_locate_b (as, am) (n, aaa, []) ires \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1768
     inv_after_write (as, abc_lm_s am n (Suc (abc_lm_v am n))) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1769
                     (s, aaa, [Oc]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1770
apply(insert inv_locate_b_2_after_write [of as am n aaa "[]"])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1771
by(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1772
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1773
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1774
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1775
(*inv: from after_write to after_move*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1776
lemma [simp]: "inv_after_write (as, lm) (x, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1777
                \<Longrightarrow> inv_after_move (as, lm) (y, Oc # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1778
apply(auto simp:inv_after_move.simps inv_after_write.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1779
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1780
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1781
lemma [simp]: "inv_after_write (as, abc_lm_s am n (Suc (abc_lm_v am n)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1782
                )) (x, aaa, Bk # xs) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1783
apply(simp add: inv_after_write.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1784
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1785
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1786
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1787
 "inv_after_write (as, abc_lm_s am n (Suc (abc_lm_v am n))) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1788
                        (x, aaa, []) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1789
apply(simp add: inv_after_write.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1790
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1791
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1792
(*inv: from after_move to after_clear*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1793
lemma [simp]: "inv_after_move (as, lm) (s, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1794
                \<Longrightarrow> inv_after_clear (as, lm) (s', l, Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1795
apply(auto simp: inv_after_move.simps inv_after_clear.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1796
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1797
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1798
(*inv: from after_move to on_leftmoving*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1799
lemma [intro]: "Bk \<up> rn = Bk # Bk \<up> (rn - Suc 0) \<or> rn = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1800
apply(case_tac rn, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1801
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1802
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1803
lemma inv_after_move_2_inv_on_left_moving[simp]:  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1804
   "inv_after_move (as, lm) (s, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1805
   \<Longrightarrow> (l = [] \<longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1806
         inv_on_left_moving (as, lm) (s', [], Bk # Bk # r) ires) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1807
      (l \<noteq> [] \<longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1808
         inv_on_left_moving (as, lm) (s', tl l, hd l # Bk # r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1809
apply(simp only: inv_after_move.simps inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1810
apply(subgoal_tac "l \<noteq> []", rule conjI, simp, rule impI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1811
                rule disjI1, simp only: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1812
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1813
apply(subgoal_tac "lm2 = []")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1814
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI,  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1815
    rule_tac x = m in exI, rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1816
    rule_tac x = 1 in exI,  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1817
    rule_tac x = "rn - 1" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1818
apply(auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1819
apply(case_tac [1-2] rn, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1820
apply(case_tac [!] lm2, simp_all add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1821
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1822
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1823
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1824
lemma inv_after_move_2_inv_on_left_moving_B[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1825
    "inv_after_move (as, lm) (s, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1826
      \<Longrightarrow> (l = [] \<longrightarrow> inv_on_left_moving (as, lm) (s', [], [Bk]) ires) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1827
          (l \<noteq> [] \<longrightarrow> inv_on_left_moving (as, lm) (s', tl l, [hd l]) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1828
apply(simp only: inv_after_move.simps inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1829
apply(subgoal_tac "l \<noteq> []", rule conjI, simp, rule impI, rule disjI1,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1830
        simp only: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1831
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1832
apply(subgoal_tac "lm2 = []")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1833
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI,  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1834
      rule_tac x = m in exI, rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1835
      rule_tac x = 1 in exI, rule_tac x = "rn - 1" in exI, simp, case_tac rn)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1836
apply(auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1837
apply(case_tac [!] lm2, auto simp: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1838
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1839
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1840
(*inv: from after_clear to on_right_moving*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1841
lemma [simp]: "Oc # r = replicate rn Bk = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1842
apply(case_tac rn, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1843
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1844
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1845
lemma inv_after_clear_2_inv_on_right_moving[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1846
     "inv_after_clear (as, lm) (x, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1847
      \<Longrightarrow> inv_on_right_moving (as, lm) (y, Bk # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1848
apply(auto simp: inv_after_clear.simps inv_on_right_moving.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1849
apply(subgoal_tac "lm2 \<noteq> []")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1850
apply(rule_tac x = "lm1 @ [m]" in exI, rule_tac x = "tl lm2" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1851
      rule_tac x = "hd lm2" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1852
apply(rule_tac x = 0 in exI, rule_tac x = "hd lm2" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1853
apply(simp, rule conjI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1854
apply(case_tac [!] "lm2::nat list", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1855
apply(case_tac rn, auto split: if_splits simp: tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1856
apply(case_tac [!] rn, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1857
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1858
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1859
lemma [simp]: "inv_after_clear (as, lm) (x, l, []) ires\<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1860
               inv_after_clear (as, lm) (y, l, [Bk]) ires" 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1861
by(auto simp: inv_after_clear.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1862
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1863
lemma [simp]: "inv_after_clear (as, lm) (x, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1864
             \<Longrightarrow> inv_on_right_moving (as, lm) (y, Bk # l, []) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1865
by(insert 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1866
    inv_after_clear_2_inv_on_right_moving[of as lm n l "[]"], simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1867
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1868
(*inv: from on_right_moving to on_right_movign*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1869
lemma [simp]: "inv_on_right_moving (as, lm) (x, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1870
      \<Longrightarrow> inv_on_right_moving (as, lm) (y, Oc # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1871
apply(auto simp: inv_on_right_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1872
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1873
           rule_tac x = "ml + mr" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1874
apply(rule_tac x = "Suc ml" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1875
           rule_tac x = "mr - 1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1876
apply(case_tac mr, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1877
apply(rule_tac x = lm1 in exI, rule_tac x = "[]" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1878
      rule_tac x = "ml + mr" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1879
apply(rule_tac x = "Suc ml" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1880
      rule_tac x = "mr - 1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1881
apply(case_tac mr, auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1882
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1883
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1884
lemma inv_on_right_moving_2_inv_on_right_moving[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1885
     "inv_on_right_moving (as, lm) (x, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1886
     \<Longrightarrow> inv_after_write (as, lm) (y, l, Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1887
apply(auto simp: inv_on_right_moving.simps inv_after_write.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1888
apply(case_tac mr, auto simp: split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1889
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1890
      
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1891
lemma [simp]: "inv_on_right_moving (as, lm) (x, l, []) ires\<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1892
             inv_on_right_moving (as, lm) (y, l, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1893
apply(auto simp: inv_on_right_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1894
apply(rule_tac x = lm1 in exI, rule_tac x = "[]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1895
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1896
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1897
(*inv: from on_right_moving to after_write*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1898
lemma [simp]: "inv_on_right_moving (as, lm) (x, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1899
       \<Longrightarrow> inv_after_write (as, lm) (y, l, [Oc]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1900
apply(rule_tac inv_on_right_moving_2_inv_on_right_moving, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1901
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1902
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1903
(*inv: from on_left_moving to on_left_moving*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1904
lemma [simp]: "inv_on_left_moving_in_middle_B (as, lm) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1905
               (s, l, Oc # r) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1906
apply(auto simp: inv_on_left_moving_in_middle_B.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1907
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1908
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1909
lemma [simp]: "inv_on_left_moving_norm (as, lm) (s, l, Bk # r) ires 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1910
             = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1911
apply(auto simp: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1912
apply(case_tac [!] mr, auto simp: )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1913
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1914
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1915
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1916
  "\<lbrakk>inv_on_left_moving_norm (as, lm) (s, l, Oc # r) ires;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1917
    hd l = Bk; l \<noteq> []\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1918
     inv_on_left_moving_in_middle_B (as, lm) (s, tl l, Bk # Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1919
apply(case_tac l, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1920
apply(simp only: inv_on_left_moving_norm.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1921
                 inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1922
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1923
apply(rule_tac x = lm1 in exI, rule_tac x = "m # lm2" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1924
apply(case_tac [!] ml, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1925
apply(auto simp: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1926
apply(rule_tac [!] x = "Suc rn" in exI, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1927
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1928
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1929
lemma [simp]: "\<lbrakk>inv_on_left_moving_norm (as, lm) (s, l, Oc # r) ires; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1930
                hd l = Oc; l \<noteq> []\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1931
            \<Longrightarrow> inv_on_left_moving_norm (as, lm) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1932
                                        (s, tl l, Oc # Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1933
apply(simp only: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1934
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1935
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1936
      rule_tac x = m in exI, rule_tac x = "ml - 1" in exI,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1937
      rule_tac x = "Suc mr" in exI, rule_tac x = rn in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1938
apply(case_tac ml, auto simp: split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1939
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1940
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1941
lemma [simp]: "inv_on_left_moving_norm (as, lm) (s, [], Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1942
     \<Longrightarrow> inv_on_left_moving_in_middle_B (as, lm) (s, [], Bk # Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1943
apply(auto simp: inv_on_left_moving_norm.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1944
                 inv_on_left_moving_in_middle_B.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1945
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1946
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1947
lemma [simp]:"inv_on_left_moving (as, lm) (s, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1948
    \<Longrightarrow> (l = [] \<longrightarrow> inv_on_left_moving (as, lm) (s, [], Bk # Oc # r) ires)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1949
 \<and>  (l \<noteq> [] \<longrightarrow> inv_on_left_moving (as, lm) (s, tl l, hd l # Oc # r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1950
apply(simp add: inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1951
apply(case_tac "l \<noteq> []", rule conjI, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1952
apply(case_tac "hd l", simp, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1953
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1954
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1955
(*inv: from on_left_moving to check_left_moving*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1956
lemma [simp]: "inv_on_left_moving_in_middle_B (as, lm) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1957
                                      (s, Bk # list, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1958
          \<Longrightarrow> inv_check_left_moving_on_leftmost (as, lm) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1959
                                      (s', list, Bk # Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1960
apply(auto simp: inv_on_left_moving_in_middle_B.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1961
                 inv_check_left_moving_on_leftmost.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1962
apply(case_tac [!] "rev lm1", simp_all)
101
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  1963
apply(case_tac [!] lista, simp_all add: tape_of_nl_abv tape_of_nat_abv tape_of_nat_list.simps)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1964
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1965
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1966
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1967
    "inv_check_left_moving_in_middle (as, lm) (s, l, Bk # r) ires= False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1968
by(auto simp: inv_check_left_moving_in_middle.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1969
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1970
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1971
 "inv_on_left_moving_in_middle_B (as, lm) (s, [], Bk # r) ires\<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1972
  inv_check_left_moving_on_leftmost (as, lm) (s', [], Bk # Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1973
apply(auto simp: inv_on_left_moving_in_middle_B.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1974
                 inv_check_left_moving_on_leftmost.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1975
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1976
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1977
lemma [simp]: "inv_check_left_moving_on_leftmost (as, lm) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1978
                                       (s, list, Oc # r) ires= False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1979
by(auto simp: inv_check_left_moving_on_leftmost.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1980
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1981
lemma [simp]: "inv_on_left_moving_in_middle_B (as, lm) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1982
                                         (s, Oc # list, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1983
 \<Longrightarrow> inv_check_left_moving_in_middle (as, lm) (s', list, Oc # Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1984
apply(auto simp: inv_on_left_moving_in_middle_B.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1985
                 inv_check_left_moving_in_middle.simps  split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1986
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1987
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1988
lemma inv_on_left_moving_2_check_left_moving[simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1989
 "inv_on_left_moving (as, lm) (s, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1990
 \<Longrightarrow> (l = [] \<longrightarrow> inv_check_left_moving (as, lm) (s', [], Bk # Bk # r) ires)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1991
 \<and> (l \<noteq> [] \<longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1992
      inv_check_left_moving (as, lm) (s', tl l, hd l # Bk # r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1993
apply(simp add: inv_on_left_moving.simps inv_check_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1994
apply(case_tac l, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1995
apply(case_tac a, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1996
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1997
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1998
lemma [simp]: "inv_on_left_moving_norm (as, lm) (s, l, []) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1999
apply(auto simp: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2000
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2001
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2002
lemma [simp]: "inv_on_left_moving (as, lm) (s, l, []) ires\<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2003
     inv_on_left_moving (as, lm) (6 + 2 * n, l, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2004
apply(simp add: inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2005
apply(auto simp: inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2006
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2007
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2008
lemma [simp]: "inv_on_left_moving (as, lm) (s, l, []) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2009
apply(simp add: inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2010
apply(simp add: inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2011
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2012
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2013
lemma [simp]: "inv_on_left_moving (as, lm) (s, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2014
 \<Longrightarrow> (l = [] \<longrightarrow> inv_check_left_moving (as, lm) (s', [], [Bk]) ires) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2015
    (l \<noteq> [] \<longrightarrow> inv_check_left_moving (as, lm) (s', tl l, [hd l]) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2016
by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2017
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2018
lemma [intro]: "\<exists>rna. Bk # Bk \<up> rn = Bk \<up> rna"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2019
apply(rule_tac x = "Suc rn" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2020
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2021
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2022
lemma 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2023
inv_check_left_moving_in_middle_2_on_left_moving_in_middle_B[simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2024
"inv_check_left_moving_in_middle (as, lm) (s, Bk # list, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2025
  \<Longrightarrow> inv_on_left_moving_in_middle_B (as, lm) (s', list, Bk # Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2026
apply(simp only: inv_check_left_moving_in_middle.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2027
                 inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2028
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2029
apply(rule_tac x = "rev (tl (rev lm1))" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2030
      rule_tac x = "[hd (rev lm1)] @ lm2" in exI, auto)
101
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  2031
apply(case_tac [!] "rev lm1",simp_all add: tape_of_nat_abv tape_of_nl_abv tape_of_nat_list.simps)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2032
apply(case_tac [!] a, simp_all)
101
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  2033
apply(case_tac [1] lm2, simp_all add: tape_of_nat_list.simps tape_of_nat_abv, auto)
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  2034
apply(case_tac [3] lm2, simp_all add: tape_of_nat_list.simps tape_of_nat_abv, auto)
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  2035
apply(case_tac [!] lista, simp_all add: tape_of_nat_abv tape_of_nat_list.simps)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2036
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2037
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2038
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2039
 "inv_check_left_moving_in_middle (as, lm) (s, [], Oc # r) ires\<Longrightarrow>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2040
     inv_check_left_moving_in_middle (as, lm) (s', [Bk], Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2041
apply(auto simp: inv_check_left_moving_in_middle.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2042
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2043
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2044
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2045
 "inv_check_left_moving_in_middle (as, lm) (s, [], Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2046
   \<Longrightarrow> inv_on_left_moving_in_middle_B (as, lm) (s', [], Bk # Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2047
apply(insert 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2048
inv_check_left_moving_in_middle_2_on_left_moving_in_middle_B[of 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2049
                  as lm n "[]" r], simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2050
done 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2051
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2052
lemma [simp]: "inv_check_left_moving_in_middle (as, lm) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2053
                       (s, Oc # list, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2054
   \<Longrightarrow> inv_on_left_moving_norm (as, lm) (s', list, Oc # Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2055
apply(auto simp: inv_check_left_moving_in_middle.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2056
                 inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2057
apply(rule_tac x = "rev (tl (rev lm1))" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2058
      rule_tac x = lm2 in exI, rule_tac x = "hd (rev lm1)" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2059
apply(rule_tac conjI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2060
apply(case_tac "rev lm1", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2061
apply(rule_tac x = "hd (rev lm1) - 1" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2062
apply(rule_tac [!] x = "Suc (Suc 0)" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2063
apply(case_tac [!] "rev lm1", simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2064
apply(case_tac [!] a, simp_all add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2065
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2066
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2067
lemma [simp]: "inv_check_left_moving (as, lm) (s, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2068
\<Longrightarrow> (l = [] \<longrightarrow> inv_on_left_moving (as, lm) (s', [], Bk # Oc # r) ires) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2069
   (l \<noteq> [] \<longrightarrow> inv_on_left_moving (as, lm) (s', tl l, hd l # Oc # r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2070
apply(case_tac l, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2071
      auto simp: inv_check_left_moving.simps inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2072
apply(case_tac a, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2073
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2074
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2075
(*inv: check_left_moving to after_left_moving*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2076
lemma [simp]: "inv_check_left_moving (as, lm) (s, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2077
                \<Longrightarrow> inv_after_left_moving (as, lm) (s', Bk # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2078
apply(auto simp: inv_check_left_moving.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2079
 inv_check_left_moving_on_leftmost.simps inv_after_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2080
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2081
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2082
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2083
lemma [simp]:"inv_check_left_moving (as, lm) (s, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2084
      \<Longrightarrow> inv_after_left_moving (as, lm) (s', Bk # l, []) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2085
by(simp add: inv_check_left_moving.simps  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2086
inv_check_left_moving_in_middle.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2087
inv_check_left_moving_on_leftmost.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2088
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2089
(*inv: after_left_moving to inv_stop*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2090
lemma [simp]: "inv_after_left_moving (as, lm) (s, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2091
       \<Longrightarrow> inv_stop (as, lm) (s', Bk # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2092
apply(auto simp: inv_after_left_moving.simps inv_stop.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2093
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2094
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2095
lemma [simp]: "inv_after_left_moving (as, lm) (s, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2096
             \<Longrightarrow> inv_stop (as, lm) (s', Bk # l, []) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2097
by(auto simp: inv_after_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2098
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2099
(*inv: stop to stop*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2100
lemma [simp]: "inv_stop (as, lm) (x, l, r) ires \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2101
               inv_stop (as, lm) (y, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2102
apply(simp add: inv_stop.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2103
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2104
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2105
lemma [simp]: "inv_after_clear (as, lm) (s, aaa, Oc # xs) ires= False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2106
apply(auto simp: inv_after_clear.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2107
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2108
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2109
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2110
  "inv_after_left_moving (as, lm) (s, aaa, Oc # xs) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2111
by(auto simp: inv_after_left_moving.simps  )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2112
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2113
lemma [simp]: "inv_after_clear (as, abc_lm_s lm n (Suc (abc_lm_v lm n))) (s, b, []) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2114
apply(auto simp: inv_after_clear.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2115
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2116
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2117
lemma [simp]: "inv_on_left_moving (as, abc_lm_s lm n (Suc (abc_lm_v lm n))) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2118
           (s, b, Oc # list) ires \<Longrightarrow> b \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2119
apply(auto simp: inv_on_left_moving.simps inv_on_left_moving_norm.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2120
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2121
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2122
lemma [simp]: "inv_check_left_moving (as, abc_lm_s lm n (Suc (abc_lm_v lm n))) (s, b, Oc # list) ires \<Longrightarrow> b \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2123
apply(auto simp: inv_check_left_moving.simps inv_check_left_moving_in_middle.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2124
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2125
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2126
lemma tinc_correct_pre:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2127
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2128
  and inv_start: "inv_locate_a (as, lm) (n, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2129
  and lm': "lm' = abc_lm_s lm n (Suc (abc_lm_v lm n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2130
  and f: "f = steps (Suc 0, l, r) (tinc_b, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2131
  and P: "P = (\<lambda> (s, l, r). s = 10)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2132
  and Q: "Q = (\<lambda> (s, l, r). inc_inv n (as, lm) (s, l, r) ires)" 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2133
  shows "\<exists> stp. P (f stp) \<and> Q (f stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2134
proof(rule_tac LE = inc_LE in halt_lemma2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2135
  show "wf inc_LE" by(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2136
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2137
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2138
    using inv_start
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2139
    apply(simp add: f P Q steps.simps inc_inv.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2140
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2141
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2142
  show "\<not> P (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2143
    apply(simp add: f P steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2144
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2145
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2146
  show "\<forall>n. \<not> P (f n) \<and> Q (f n) \<longrightarrow> Q (f (Suc n)) \<and> (f (Suc n), f n) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2147
        \<in> inc_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2148
  proof(rule_tac allI, rule_tac impI, simp add: f, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2149
      case_tac "steps (Suc 0, l, r) (tinc_b, 0) n", simp add: P)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2150
    fix n a b c
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2151
    assume "a \<noteq> 10 \<and> Q (a, b, c)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2152
    thus  "Q (step (a, b, c) (tinc_b, 0)) \<and> (step (a, b, c) (tinc_b, 0), a, b, c) \<in> inc_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2153
      apply(simp add:Q)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2154
      apply(simp add: inc_inv.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2155
      apply(case_tac c, case_tac [2] aa)
115
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  2156
      apply(auto simp: Let_def step.simps tinc_b_def numeral_2_eq_2 numeral_3_eq_3  split: if_splits)
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  2157
      apply(simp_all add: inc_inv.simps inc_LE_def lex_triple_def lex_pair_def inc_measure_def numeral_5_eq_5
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  2158
                          numeral_6_eq_6 numeral_7_eq_7 numeral_8_eq_8 numeral_9_eq_9)         
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2159
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2160
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2161
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2162
         
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2163
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2164
lemma tinc_correct: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2165
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2166
  and inv_start: "inv_locate_a (as, lm) (n, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2167
  and lm': "lm' = abc_lm_s lm n (Suc (abc_lm_v lm n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2168
  shows "\<exists> stp l' r'. steps (Suc 0, l, r) (tinc_b, 0) stp = (10, l', r')
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2169
              \<and> inv_stop (as, lm') (10, l', r') ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2170
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2171
  apply(drule_tac tinc_correct_pre, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2172
  apply(rule_tac x = stp in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2173
  apply(simp add: inc_inv.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2174
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2175
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2176
declare inv_locate_a.simps[simp del] abc_lm_s.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2177
        abc_lm_v.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2178
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2179
lemma [simp]: "(4::nat) * n mod 2 = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2180
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2181
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2182
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2183
lemma crsp_step_inc_pre:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2184
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2185
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2186
  and aexec: "abc_step_l (as, lm) (Some (Inc n)) = (asa, lma)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2187
  shows "\<exists> stp k. steps (Suc 0, l, r) (findnth n @ shift tinc_b (2 * n), 0) stp 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2188
        = (2*n + 10, Bk # Bk # ires, <lma> @ Bk\<up>k) \<and> stp > 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2189
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2190
  thm tm_append_steps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2191
  have "\<exists> stp l' r'. steps (Suc 0, l, r) (findnth n, 0) stp = (Suc (2 * n), l', r')
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2192
    \<and> inv_locate_a (as, lm) (n, l', r') ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2193
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2194
    apply(rule_tac findnth_correct, simp_all add: crsp layout)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2195
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2196
  from this obtain stp l' r' where a:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2197
    "steps (Suc 0, l, r) (findnth n, 0) stp = (Suc (2 * n), l', r')
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2198
    \<and> inv_locate_a (as, lm) (n, l', r') ires" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2199
  moreover have
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2200
    "\<exists> stp la ra. steps (Suc 0, l', r') (tinc_b, 0) stp = (10, la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2201
                        \<and> inv_stop (as, lma) (10, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2202
    using assms a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2203
  proof(rule_tac lm' = lma and n = n and lm = lm and ly = ly and ap = ap in tinc_correct,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2204
      simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2205
    show "lma = abc_lm_s lm n (Suc (abc_lm_v lm n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2206
      using aexec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2207
      apply(simp add: abc_step_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2208
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2209
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2210
  from this obtain stpa la ra where b:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2211
    "steps (Suc 0, l', r') (tinc_b, 0) stpa = (10, la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2212
    \<and> inv_stop (as, lma) (10, la, ra) ires" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2213
  from a b show "\<exists>stp k. steps (Suc 0, l, r) (findnth n @ shift tinc_b (2 * n), 0) stp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2214
    = (2 * n + 10, Bk # Bk # ires, <lma> @ Bk \<up> k) \<and> stp > 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2215
    apply(rule_tac x = "stp + stpa" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2216
    using tm_append_steps[of "Suc 0" l r "findnth n" stp l' r' tinc_b stpa 10 la ra "length (findnth n) div 2"]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2217
    apply(simp add: length_findnth inv_stop.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2218
    apply(case_tac stpa, simp_all add: steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2219
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2220
qed 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2221
     
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2222
lemma crsp_step_inc:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2223
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2224
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2225
  and fetch: "abc_fetch as ap = Some (Inc n)"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2226
  shows "\<exists>stp > 0. crsp ly (abc_step_l (as, lm) (Some (Inc n)))
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2227
  (steps (s, l, r) (ci ly (start_of ly as) (Inc n), start_of ly as - Suc 0) stp) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2228
proof(case_tac "(abc_step_l (as, lm) (Some (Inc n)))")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2229
  fix a b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2230
  assume aexec: "abc_step_l (as, lm) (Some (Inc n)) = (a, b)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2231
  then have "\<exists> stp k. steps (Suc 0, l, r) (findnth n @ shift tinc_b (2 * n), 0) stp 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2232
        = (2*n + 10, Bk # Bk # ires, <b> @ Bk\<up>k) \<and> stp > 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2233
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2234
    apply(rule_tac crsp_step_inc_pre, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2235
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2236
  thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2237
    using assms aexec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2238
    apply(erule_tac exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2239
    apply(erule_tac exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2240
    apply(erule_tac conjE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2241
    apply(rule_tac x = stp in exI, simp add: ci.simps tm_shift_eq_steps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2242
    apply(drule_tac off = "(start_of (layout_of ap) as - Suc 0)" in tm_shift_eq_steps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2243
    apply(auto simp: crsp.simps abc_step_l.simps fetch start_of_Suc1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2244
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2245
qed
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2246
    
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2247
subsection{* Crsp of Dec n e*}
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2248
declare sete.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2249
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2250
type_synonym dec_inv_t = "(nat * nat list) \<Rightarrow> config \<Rightarrow> cell list \<Rightarrow>  bool"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2251
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2252
fun dec_first_on_right_moving :: "nat \<Rightarrow> dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2253
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2254
  "dec_first_on_right_moving n (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2255
               (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2256
         ml + mr = Suc m \<and> length lm1 = n \<and> ml > 0 \<and> m > 0 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2257
             (if lm1 = [] then l = Oc\<up>ml @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2258
                          else  l = Oc\<up>ml @ [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2259
    ((r = Oc\<up>mr @ [Bk] @ <lm2> @ Bk\<up>rn) \<or> (r = Oc\<up>mr \<and> lm2 = [])))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2260
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2261
fun dec_on_right_moving :: "dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2262
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2263
  "dec_on_right_moving (as, lm) (s, l, r) ires =  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2264
   (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2265
                             ml + mr = Suc (Suc m) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2266
   (if lm1 = [] then l = Oc\<up>ml@ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2267
                else  l = Oc\<up>ml @ [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2268
   ((r = Oc\<up>mr @ [Bk] @ <lm2> @ Bk\<up>rn) \<or> (r = Oc\<up>mr \<and> lm2 = [])))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2269
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2270
fun dec_after_clear :: "dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2271
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2272
  "dec_after_clear (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2273
              (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2274
                ml + mr = Suc m \<and> ml = Suc m \<and> r \<noteq> [] \<and> r \<noteq> [] \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2275
               (if lm1 = [] then l = Oc\<up>ml@ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2276
                            else l = Oc\<up>ml @ [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2277
               (tl r = Bk # <lm2> @ Bk\<up>rn \<or> tl r = [] \<and> lm2 = []))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2278
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2279
fun dec_after_write :: "dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2280
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2281
  "dec_after_write (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2282
         (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2283
       ml + mr = Suc m \<and> ml = Suc m \<and> lm2 \<noteq> [] \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2284
       (if lm1 = [] then l = Bk # Oc\<up>ml @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2285
                    else l = Bk # Oc\<up>ml @ [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2286
       tl r = <lm2> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2287
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2288
fun dec_right_move :: "dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2289
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2290
  "dec_right_move (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2291
        (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2292
            \<and> ml = Suc m \<and> mr = (0::nat) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2293
              (if lm1 = [] then l = Bk # Oc\<up>ml @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2294
                          else l = Bk # Oc\<up>ml @ [Bk] @ <rev lm1> @ Bk # Bk # ires) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2295
           \<and> (r = Bk # <lm2> @ Bk\<up>rn \<or> r = [] \<and> lm2 = []))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2296
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2297
fun dec_check_right_move :: "dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2298
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2299
  "dec_check_right_move (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2300
        (\<exists> lm1 lm2 m ml mr rn. lm = lm1 @ [m] @ lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2301
           ml = Suc m \<and> mr = (0::nat) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2302
           (if lm1 = [] then l = Bk # Bk # Oc\<up>ml @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2303
                       else l = Bk # Bk # Oc\<up>ml @ [Bk] @ <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2304
           r = <lm2> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2305
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2306
fun dec_left_move :: "dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2307
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2308
  "dec_left_move (as, lm) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2309
    (\<exists> lm1 m rn. (lm::nat list) = lm1 @ [m::nat] \<and>   
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2310
    rn > 0 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2311
   (if lm1 = [] then l = Bk # Oc\<up>Suc m @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2312
    else l = Bk # Oc\<up>Suc m @ Bk # <rev lm1> @ Bk # Bk # ires) \<and> r = Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2313
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2314
declare
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2315
  dec_on_right_moving.simps[simp del] dec_after_clear.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2316
  dec_after_write.simps[simp del] dec_left_move.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2317
  dec_check_right_move.simps[simp del] dec_right_move.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2318
  dec_first_on_right_moving.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2319
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2320
fun inv_locate_n_b :: "inc_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2321
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2322
  "inv_locate_n_b (as, lm) (s, l, r) ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2323
    (\<exists> lm1 lm2 tn m ml mr rn. lm @ 0\<up>tn = lm1 @ [m] @ lm2 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2324
     length lm1 = s \<and> m + 1 = ml + mr \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2325
     ml = 1 \<and> tn = s + 1 - length lm \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2326
     (if lm1 = [] then l = Oc\<up>ml @ Bk # Bk # ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2327
      else l = Oc\<up>ml @ Bk # <rev lm1> @ Bk # Bk # ires) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2328
     (r = Oc\<up>mr @ [Bk] @ <lm2>@ Bk\<up>rn \<or> (lm2 = [] \<and> r = Oc\<up>mr))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2329
  )"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2330
(*
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2331
fun dec_inv_1 :: "layout \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2332
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2333
  "dec_inv_1 ly n e (as, am) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2334
           (let ss = start_of ly as in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2335
            let am' = abc_lm_s am n (abc_lm_v am n - Suc 0) in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2336
            let am'' = abc_lm_s am n (abc_lm_v am n) in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2337
              if s = start_of ly e then inv_stop (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2338
              else if s = ss then False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2339
              else if s = ss + 2 * n then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2340
                  inv_locate_a (as, am) (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2341
                \<or> inv_locate_a (as, am'') (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2342
              else if s = ss + 2 * n + 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2343
                  inv_locate_b (as, am) (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2344
              else if s = ss + 2 * n + 13 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2345
                  inv_on_left_moving (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2346
              else if s = ss + 2 * n + 14 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2347
                  inv_check_left_moving (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2348
              else if s = ss + 2 * n + 15 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2349
                  inv_after_left_moving (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2350
              else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2351
*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2352
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2353
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2354
fun dec_inv_1 :: "layout \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2355
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2356
  "dec_inv_1 ly n e (as, am) (s, l, r) ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2357
           (let ss = start_of ly as in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2358
            let am' = abc_lm_s am n (abc_lm_v am n - Suc 0) in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2359
            let am'' = abc_lm_s am n (abc_lm_v am n) in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2360
              if s = start_of ly e then inv_stop (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2361
              else if s = ss then False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2362
              else if s = ss + 2 * n + 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2363
                  inv_locate_b (as, am) (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2364
              else if s = ss + 2 * n + 13 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2365
                  inv_on_left_moving (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2366
              else if s = ss + 2 * n + 14 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2367
                  inv_check_left_moving (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2368
              else if s = ss + 2 * n + 15 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2369
                  inv_after_left_moving (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2370
              else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2371
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2372
declare fetch.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2373
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2374
  "fetch (ci ly (start_of ly as) (Dec n e)) (Suc (2 * n)) Bk = (W1,  start_of ly as + 2 *n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2375
apply(auto simp: fetch.simps length_ci_dec)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2376
apply(auto simp: ci.simps nth_append length_findnth sete.simps shift.simps tdec_b_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2377
using startof_not0[of ly as] by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2378
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2379
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2380
  "fetch (ci ly (start_of ly as) (Dec n e)) (Suc (2 * n)) Oc = (R,  Suc (start_of ly as) + 2 *n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2381
apply(auto simp: fetch.simps length_ci_dec)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2382
apply(auto simp: ci.simps nth_append length_findnth sete.simps shift.simps tdec_b_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2383
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2384
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2385
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2386
  "\<lbrakk>r = [] \<or> hd r = Bk; inv_locate_a (as, lm) (n, l, r) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2387
    \<Longrightarrow> \<exists>stp la ra.
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2388
  steps (start_of ly as + 2 * n, l, r) (ci ly (start_of ly as) (Dec n e), 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2389
  start_of ly as - Suc 0) stp = (Suc (start_of ly as + 2 * n), la, ra) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2390
  inv_locate_b (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2391
apply(rule_tac x = "Suc (Suc 0)" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2392
apply(auto simp: steps.simps step.simps length_ci_dec)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2393
apply(case_tac r, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2394
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2395
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2396
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2397
  "\<lbrakk>inv_locate_a (as, lm) (n, l, r) ires; r \<noteq> [] \<and> hd r \<noteq> Bk\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2398
    \<Longrightarrow> \<exists>stp la ra.
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2399
  steps (start_of ly as + 2 * n, l, r) (ci ly (start_of ly as) (Dec n e), 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2400
  start_of ly as - Suc 0) stp = (Suc (start_of ly as + 2 * n), la, ra) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2401
  inv_locate_b (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2402
apply(rule_tac x = "(Suc 0)" in exI, case_tac "hd r", simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2403
apply(auto simp: steps.simps step.simps length_ci_dec)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2404
apply(case_tac r, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2405
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2406
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2407
fun abc_dec_1_stage1:: "config \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2408
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2409
  "abc_dec_1_stage1 (s, l, r) ss n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2410
       (if s > ss \<and> s \<le> ss + 2*n + 1 then 4
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2411
        else if s = ss + 2 * n + 13 \<or> s = ss + 2*n + 14 then 3
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2412
        else if s = ss + 2*n + 15 then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2413
        else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2414
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2415
fun abc_dec_1_stage2:: "config \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2416
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2417
  "abc_dec_1_stage2 (s, l, r) ss n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2418
       (if s \<le> ss + 2 * n + 1 then (ss + 2 * n + 16 - s)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2419
        else if s = ss + 2*n + 13 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2420
        else if s = ss + 2*n + 14 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2421
        else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2422
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2423
fun abc_dec_1_stage3 :: "config \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2424
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2425
  "abc_dec_1_stage3 (s, l, r) ss n  = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2426
        (if s \<le> ss + 2*n + 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2427
             if (s - ss) mod 2 = 0 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2428
                         if r \<noteq> [] \<and> hd r = Oc then 0 else 1  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2429
                         else length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2430
         else if s = ss + 2 * n + 13 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2431
             if r \<noteq> [] \<and> hd r = Oc then 2 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2432
             else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2433
         else if s = ss + 2 * n + 14 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2434
             if r \<noteq> [] \<and> hd r = Oc then 3 else 0 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2435
         else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2436
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2437
fun abc_dec_1_measure :: "(config \<times> nat \<times> nat) \<Rightarrow> (nat \<times> nat \<times> nat)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2438
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2439
  "abc_dec_1_measure (c, ss, n) = (abc_dec_1_stage1 c ss n, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2440
                   abc_dec_1_stage2 c ss n, abc_dec_1_stage3 c ss n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2441
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2442
definition abc_dec_1_LE ::
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2443
  "((config \<times> nat \<times>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2444
  nat) \<times> (config \<times> nat \<times> nat)) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2445
  where "abc_dec_1_LE \<equiv> (inv_image lex_triple abc_dec_1_measure)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2446
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2447
lemma wf_dec_le: "wf abc_dec_1_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2448
by(auto intro:wf_inv_image simp:abc_dec_1_LE_def lex_triple_def lex_pair_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2449
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2450
lemma startof_Suc2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2451
  "abc_fetch as ap = Some (Dec n e) \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2452
        start_of (layout_of ap) (Suc as) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2453
            start_of (layout_of ap) as + 2 * n + 16"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2454
apply(auto simp: start_of.simps layout_of.simps  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2455
                 length_of.simps abc_fetch.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2456
                 take_Suc_conv_app_nth split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2457
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2458
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2459
lemma start_of_less_2: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2460
  "start_of ly e \<le> start_of ly (Suc e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2461
thm take_Suc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2462
apply(case_tac "e < length ly")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2463
apply(auto simp: start_of.simps take_Suc take_Suc_conv_app_nth)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2464
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2465
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2466
lemma start_of_less_1: "start_of ly e \<le> start_of ly (e + d)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2467
proof(induct d)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2468
  case 0 thus "?case" by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2469
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2470
  case (Suc d)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2471
  have "start_of ly e \<le> start_of ly (e + d)"  by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2472
  moreover have "start_of ly (e + d) \<le> start_of ly (Suc (e + d))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2473
    by(rule_tac start_of_less_2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2474
  ultimately show"?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2475
    by(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2476
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2477
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2478
lemma start_of_less: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2479
  assumes "e < as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2480
  shows "start_of ly e \<le> start_of ly as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2481
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2482
  obtain d where " as = e + d"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2483
    using assms by (metis less_imp_add_positive)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2484
  thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2485
    by(simp add: start_of_less_1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2486
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2487
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2488
lemma start_of_ge: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2489
  assumes fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2490
  and layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2491
  and great: "e > as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2492
  shows "start_of ly e \<ge> start_of ly as + 2*n + 16"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2493
proof(cases "e = Suc as")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2494
  case True
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2495
  have "e = Suc as" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2496
  moreover hence "start_of ly (Suc as) = start_of ly as + 2*n + 16"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2497
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2498
    by(simp add: startof_Suc2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2499
  ultimately show "?thesis" by (simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2500
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2501
  case False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2502
  have "e \<noteq> Suc as" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2503
  then have "e > Suc as" using great by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2504
  then have "start_of ly (Suc as) \<le> start_of ly e"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2505
    by(simp add: start_of_less)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2506
  moreover have "start_of ly (Suc as) = start_of ly as + 2*n + 16"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2507
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2508
    by(simp add: startof_Suc2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2509
  ultimately show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2510
    by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2511
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2512
    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2513
lemma [elim]: "\<lbrakk>abc_fetch as ap = Some (Dec n e); as < e; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2514
  Suc (start_of (layout_of ap) as + 2 * n) = start_of (layout_of ap) e\<rbrakk> \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2515
apply(drule_tac start_of_ge, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2516
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2517
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2518
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2519
lemma [elim]: "\<lbrakk>abc_fetch as ap = Some (Dec n e); as > e;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2520
  Suc (start_of (layout_of ap) as + 2 * n) = start_of (layout_of ap) e\<rbrakk> \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2521
apply(drule_tac ly = "layout_of ap" in start_of_less[of])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2522
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2523
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2524
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2525
lemma [elim]: "\<lbrakk>abc_fetch as ap = Some (Dec n e);
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2526
  Suc (start_of (layout_of ap) as + 2 * n) = start_of (layout_of ap) e\<rbrakk> \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2527
apply(subgoal_tac "as = e \<or> as < e \<or> as > e", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2528
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2529
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2530
lemma [simp]:"fetch (ci (ly) (start_of ly as) (Dec n e)) (Suc (2 * n))  Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2531
  = (R, start_of ly as + 2*n + 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2532
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2533
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2534
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2535
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2536
lemma [simp]: "(start_of ly as = 0) = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2537
apply(simp add: start_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2538
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2539
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2540
lemma [simp]: "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2541
  (start_of ly as) (Dec n e)) (Suc (2 * n))  Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2542
  = (W1, start_of ly as + 2*n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2543
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2544
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2545
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2546
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2547
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2548
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2549
                (start_of ly as) (Dec n e)) (Suc (Suc (2 * n)))  Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2550
      = (R, start_of ly as + 2*n + 2)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2551
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2552
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2553
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2554
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2555
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2556
lemma [simp]: "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2557
                  (start_of ly as) (Dec n e)) (Suc (Suc (2 * n))) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2558
      = (L, start_of ly as + 2*n + 13)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2559
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2560
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2561
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2562
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2563
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2564
lemma [simp]: "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2565
             (start_of ly as) (Dec n e)) (Suc (Suc (Suc (2 * n))))  Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2566
     = (R, start_of ly as + 2*n + 2)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2567
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2568
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2569
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2570
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2571
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2572
lemma [simp]: "fetch (ci (ly) (start_of ly as) (Dec n e)) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2573
                             (Suc (Suc (Suc (2 * n))))  Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2574
     = (L, start_of ly as + 2*n + 3)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2575
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2576
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2577
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2578
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2579
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2580
     "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2581
                      (start_of ly as) (Dec n e)) (2 * n + 4) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2582
    = (W0, start_of ly as + 2*n + 3)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2583
apply(subgoal_tac "2*n + 4 = Suc (2*n + 3)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2584
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2585
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2586
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2587
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2588
lemma [simp]: "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2589
                   (start_of ly as) (Dec n e)) (2 * n + 4) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2590
    = (R, start_of ly as + 2*n + 4)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2591
apply(subgoal_tac "2*n + 4 = Suc (2*n + 3)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2592
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2593
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2594
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2595
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2596
lemma [simp]:"fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2597
                          (start_of ly as) (Dec n e)) (2 * n + 5) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2598
    = (R, start_of ly as + 2*n + 5)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2599
apply(subgoal_tac "2*n + 5 = Suc (2*n + 4)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2600
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2601
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2602
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2603
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2604
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2605
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2606
  "fetch (ci (ly)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2607
                (start_of ly as) (Dec n e)) (2 * n + 6) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2608
    = (L, start_of ly as + 2*n + 6)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2609
apply(subgoal_tac "2*n + 6 = Suc (2*n + 5)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2610
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2611
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2612
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2613
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2614
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2615
  "fetch (ci (ly) (start_of ly as) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2616
                      (Dec n e)) (2 * n + 6) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2617
    = (L, start_of ly as + 2*n + 7)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2618
apply(subgoal_tac "2*n + 6 = Suc (2*n + 5)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2619
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2620
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2621
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2622
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2623
lemma [simp]:"fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2624
             (start_of ly as) (Dec n e)) (2 * n + 7) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2625
    = (L, start_of ly as + 2*n + 10)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2626
apply(subgoal_tac "2*n + 7 = Suc (2*n + 6)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2627
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2628
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2629
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2630
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2631
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2632
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2633
                   (start_of ly as) (Dec n e)) (2 * n + 8) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2634
    = (W1, start_of ly as + 2*n + 7)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2635
apply(subgoal_tac "2*n + 8 = Suc (2*n + 7)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2636
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2637
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2638
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2639
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2640
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2641
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2642
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2643
                   (start_of ly as) (Dec n e)) (2 * n + 8) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2644
    = (R, start_of ly as + 2*n + 8)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2645
apply(subgoal_tac "2*n + 8 = Suc (2*n + 7)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2646
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2647
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2648
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2649
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2650
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2651
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2652
  (start_of ly as) (Dec n e)) (2 * n + 9) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2653
  = (L, start_of ly as + 2*n + 9)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2654
apply(subgoal_tac "2*n + 9 = Suc (2*n + 8)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2655
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2656
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2657
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2658
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2659
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2660
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2661
  (start_of ly as) (Dec n e)) (2 * n + 9) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2662
  = (R, start_of ly as + 2*n + 8)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2663
apply(subgoal_tac "2*n + 9 = Suc (2*n + 8)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2664
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2665
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2666
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2667
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2668
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2669
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2670
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2671
  (start_of ly as) (Dec n e)) (2 * n + 10) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2672
  = (R, start_of ly as + 2*n + 4)" 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2673
apply(subgoal_tac "2*n + 10 = Suc (2*n + 9)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2674
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2675
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2676
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2677
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2678
lemma [simp]: "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2679
             (start_of ly as) (Dec n e)) (2 * n + 10) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2680
    = (W0, start_of ly as + 2*n + 9)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2681
apply(subgoal_tac "2*n + 10 = Suc (2*n + 9)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2682
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2683
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2684
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2685
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2686
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2687
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2688
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2689
  (start_of ly as) (Dec n e)) (2 * n + 11) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2690
  = (L, start_of ly as + 2*n + 10)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2691
apply(subgoal_tac "2*n + 11 = Suc (2*n + 10)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2692
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2693
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2694
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2695
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2696
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2697
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2698
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2699
  (start_of ly as) (Dec n e)) (2 * n + 11) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2700
  = (L, start_of ly as + 2*n + 11)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2701
apply(subgoal_tac "2*n + 11 = Suc (2*n + 10)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2702
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2703
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2704
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2705
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2706
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2707
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2708
  (start_of ly as) (Dec n e)) (2 * n + 12) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2709
  = (L, start_of ly as + 2*n + 10)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2710
apply(subgoal_tac "2*n + 12 = Suc (2*n + 11)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2711
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2712
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2713
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2714
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2715
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2716
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2717
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2718
  (start_of ly as) (Dec n e)) (2 * n + 12) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2719
  = (R, start_of ly as + 2*n + 12)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2720
apply(subgoal_tac "2*n + 12 = Suc (2*n + 11)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2721
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2722
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2723
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2724
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2725
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2726
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2727
  (start_of ly as) (Dec n e)) (2 * n + 13) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2728
  = (R, start_of ly as + 2*n + 16)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2729
apply(subgoal_tac "2*n + 13 = Suc (2*n + 12)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2730
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2731
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2732
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2733
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2734
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2735
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2736
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2737
  (start_of ly as) (Dec n e)) (14 + 2 * n) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2738
  = (L, start_of ly as + 2*n + 13)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2739
apply(subgoal_tac "14 + 2*n = Suc (2*n + 13)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2740
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2741
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2742
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2743
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2744
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2745
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2746
  (start_of ly as) (Dec n e)) (14 + 2 * n) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2747
  = (L, start_of ly as + 2*n + 14)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2748
apply(subgoal_tac "14 + 2*n = Suc (2*n + 13)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2749
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2750
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2751
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2752
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2753
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2754
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2755
  (start_of ly as) (Dec n e)) (15 + 2 * n)  Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2756
  = (L, start_of ly as + 2*n + 13)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2757
apply(subgoal_tac "15 + 2*n = Suc (2*n + 14)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2758
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2759
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2760
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2761
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2762
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2763
  "fetch (ci (ly) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2764
  (start_of ly as) (Dec n e)) (15 + 2 * n)  Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2765
 = (R, start_of ly as + 2*n + 15)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2766
apply(subgoal_tac "15 + 2*n = Suc (2*n + 14)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2767
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2768
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2769
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2770
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2771
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2772
  "abc_fetch as aprog = Some (Dec n e) \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2773
     fetch (ci (ly) (start_of (ly) as) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2774
              (Dec n e)) (16 + 2 * n)  Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2775
 = (R, start_of (ly) e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2776
apply(subgoal_tac "16 + 2*n = Suc (2*n + 15)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2777
apply(auto simp: ci.simps findnth.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2778
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2779
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2780
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2781
declare dec_inv_1.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2782
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2783
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2784
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2785
 "\<lbrakk>abc_fetch as aprog = Some (Dec n e); ly = layout_of aprog\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2786
   \<Longrightarrow> (start_of ly e \<noteq> Suc (start_of ly as + 2 * n) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2787
        start_of ly e \<noteq> Suc (Suc (start_of ly as + 2 * n)) \<and>  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2788
        start_of ly e \<noteq> start_of ly as + 2 * n + 3 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2789
        start_of ly e \<noteq> start_of ly as + 2 * n + 4 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2790
        start_of ly e \<noteq> start_of ly as + 2 * n + 5 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2791
        start_of ly e \<noteq> start_of ly as + 2 * n + 6 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2792
        start_of ly e \<noteq> start_of ly as + 2 * n + 7 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2793
        start_of ly e \<noteq> start_of ly as + 2 * n + 8 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2794
        start_of ly e \<noteq> start_of ly as + 2 * n + 9 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2795
        start_of ly e \<noteq> start_of ly as + 2 * n + 10 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2796
        start_of ly e \<noteq> start_of ly as + 2 * n + 11 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2797
        start_of ly e \<noteq> start_of ly as + 2 * n + 12 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2798
        start_of ly e \<noteq> start_of ly as + 2 * n + 13 \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2799
        start_of ly e \<noteq> start_of ly as + 2 * n + 14 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2800
        start_of ly e \<noteq> start_of ly as + 2 * n + 15)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2801
using start_of_ge[of as aprog n e ly] start_of_less[of e as ly]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2802
apply(case_tac "e < as", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2803
apply(case_tac "e = as", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2804
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2805
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2806
lemma [simp]: "\<lbrakk>abc_fetch as aprog = Some (Dec n e); ly = layout_of aprog\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2807
      \<Longrightarrow> (Suc (start_of ly as + 2 * n) \<noteq> start_of ly e \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2808
          Suc (Suc (start_of ly as + 2 * n)) \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2809
          start_of ly as + 2 * n + 3 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2810
          start_of ly as + 2 * n + 4 \<noteq> start_of ly e \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2811
          start_of ly as + 2 * n + 5 \<noteq>start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2812
          start_of ly as + 2 * n + 6 \<noteq> start_of ly e \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2813
          start_of ly as + 2 * n + 7 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2814
          start_of ly as + 2 * n + 8 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2815
          start_of ly as + 2 * n + 9 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2816
          start_of ly as + 2 * n + 10 \<noteq> start_of ly e \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2817
          start_of ly as + 2 * n + 11 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2818
          start_of ly as + 2 * n + 12 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2819
          start_of ly as + 2 * n + 13 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2820
          start_of ly as + 2 * n + 14 \<noteq> start_of ly e \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2821
          start_of ly as + 2 * n + 15 \<noteq> start_of ly e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2822
using start_of_ge[of as aprog n e ly] start_of_less[of e as ly]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2823
apply(case_tac "e < as", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2824
apply(case_tac "e = as", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2825
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2826
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2827
lemma [simp]: "inv_locate_b (as, lm) (n, [], []) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2828
apply(auto simp: inv_locate_b.simps in_middle.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2829
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2830
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2831
lemma [simp]: "inv_locate_b (as, lm) (n, [], Bk # list) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2832
apply(auto simp: inv_locate_b.simps in_middle.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2833
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2834
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2835
(*
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2836
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2837
lemma  inv_locate_b_2_on_left_moving_b[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2838
   "inv_locate_b (as, am) (n, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2839
     \<Longrightarrow> inv_on_left_moving (as, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2840
                  abc_lm_s am n (abc_lm_v am n)) (s, [], [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2841
apply(auto simp: inv_locate_b.simps inv_on_left_moving.simps inv_on_left_moving_in_middle_B.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2842
                 in_middle.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2843
apply(drule_tac length_equal, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2844
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2845
apply(insert inv_locate_b_2_on_left_moving[of as am n l "[]" ires s])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2846
apply(simp only: inv_on_left_moving.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2847
apply(subgoal_tac "\<not> inv_on_left_moving_in_middle_B 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2848
         (as, abc_lm_s am n (abc_lm_v am n)) (s, tl l, [hd l]) ires", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2849
*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2850
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2851
(*
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2852
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2853
  "inv_locate_b (as, am) (n, l, []) ires; l \<noteq> []\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2854
 \<Longrightarrow> inv_on_left_moving (as, abc_lm_s am n 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2855
                  (abc_lm_v am n)) (s, tl l, [hd l]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2856
apply(auto simp: inv_locate_b.simps inv_on_left_moving.simps inv_on_left_moving_in_middle_B.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2857
                 in_middle.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2858
apply(drule_tac length_equal, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2859
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2860
apply(insert inv_locate_b_2_on_left_moving[of as am n l "[]" ires s])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2861
apply(simp only: inv_on_left_moving.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2862
apply(subgoal_tac "\<not> inv_on_left_moving_in_middle_B 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2863
         (as, abc_lm_s am n (abc_lm_v am n)) (s, tl l, [hd l]) ires", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2864
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2865
apply(insert inv_locate_b_2_on_left_moving[of as am n l "[]" ires s])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2866
apply(simp only: inv_on_left_moving.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2867
apply(subgoal_tac "\<not> inv_on_left_moving_in_middle_B 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2868
         (as, abc_lm_s am n (abc_lm_v am n)) (s, tl l, [hd l]) ires", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2869
apply(simp only: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2870
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2871
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2872
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2873
      rule_tac x = m in exI, rule_tac x = ml in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2874
      rule_tac x = mr in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2875
apply(case_tac mr, simp, simp, case_tac nat, auto intro: nil_2_nil)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2876
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2877
*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2878
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2879
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2880
 "\<lbrakk>dec_first_on_right_moving n (as, am) (s, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2881
   \<Longrightarrow> dec_first_on_right_moving n (as, am) (s', Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2882
apply(simp only: dec_first_on_right_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2883
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2884
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2885
      rule_tac x = m in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2886
apply(rule_tac x = "Suc ml" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2887
      rule_tac x = "mr - 1" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2888
apply(case_tac [!] mr, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2889
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2890
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2891
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2892
  "dec_first_on_right_moving n (as, am) (s, l, Bk # xs) ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2893
apply(auto simp: dec_first_on_right_moving.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2894
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2895
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2896
lemma [elim]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2897
  "\<lbrakk>\<not> length lm1 < length am; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2898
    am @ replicate (length lm1 - length am) 0 @ [0::nat] = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2899
                                                lm1 @ m # lm2;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2900
    0 < m\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2901
   \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2902
apply(subgoal_tac "lm2 = []", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2903
apply(drule_tac length_equal, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2904
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2905
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2906
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2907
 "\<lbrakk>dec_first_on_right_moving n (as, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2908
                   abc_lm_s am n (abc_lm_v am n)) (s, l, Bk # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2909
\<Longrightarrow> dec_after_clear (as, abc_lm_s am n 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2910
                 (abc_lm_v am n - Suc 0)) (s', tl l, hd l # Bk # xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2911
apply(simp only: dec_first_on_right_moving.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2912
                 dec_after_clear.simps abc_lm_s.simps abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2913
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2914
apply(case_tac "n < length am")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2915
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2916
      rule_tac x = "m - 1" in exI, auto simp: )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2917
apply(case_tac [!] mr, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2918
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2919
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2920
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2921
 "\<lbrakk>dec_first_on_right_moving n (as, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2922
                   abc_lm_s am n (abc_lm_v am n)) (s, l, []) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2923
\<Longrightarrow> (l = [] \<longrightarrow> dec_after_clear (as, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2924
             abc_lm_s am n (abc_lm_v am n - Suc 0)) (s', [], [Bk]) ires) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2925
    (l \<noteq> [] \<longrightarrow> dec_after_clear (as, abc_lm_s am n 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2926
                      (abc_lm_v am n - Suc 0)) (s', tl l, [hd l]) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2927
apply(subgoal_tac "l \<noteq> []", 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2928
      simp only: dec_first_on_right_moving.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2929
                 dec_after_clear.simps abc_lm_s.simps abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2930
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2931
apply(case_tac "n < length am", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2932
apply(rule_tac x = lm1 in exI, rule_tac x = "m - 1" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2933
apply(case_tac [1-2] m, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2934
apply(auto simp: dec_first_on_right_moving.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2935
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2936
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2937
lemma [simp]: "\<lbrakk>dec_after_clear (as, am) (s, l, Oc # r) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2938
                \<Longrightarrow> dec_after_clear (as, am) (s', l, Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2939
apply(auto simp: dec_after_clear.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2940
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2941
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2942
lemma [simp]: "\<lbrakk>dec_after_clear (as, am) (s, l, Bk # r) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2943
                \<Longrightarrow> dec_right_move (as, am) (s', Bk # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2944
apply(auto simp: dec_after_clear.simps dec_right_move.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2945
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2946
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2947
lemma [simp]: "\<lbrakk>dec_after_clear (as, am) (s, l, []) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2948
             \<Longrightarrow> dec_right_move (as, am) (s', Bk # l, []) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2949
apply(auto simp: dec_after_clear.simps dec_right_move.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2950
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2951
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2952
lemma [simp]: "\<lbrakk>dec_after_clear (as, am) (s, l, []) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2953
             \<Longrightarrow> dec_right_move (as, am) (s', Bk # l, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2954
apply(auto simp: dec_after_clear.simps dec_right_move.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2955
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2956
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2957
lemma [simp]:"dec_right_move (as, am) (s, l, Oc # r) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2958
apply(auto simp: dec_right_move.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2959
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2960
              
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2961
lemma dec_right_move_2_check_right_move[simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2962
     "\<lbrakk>dec_right_move (as, am) (s, l, Bk # r) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2963
      \<Longrightarrow> dec_check_right_move (as, am) (s', Bk # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2964
apply(auto simp: dec_right_move.simps dec_check_right_move.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2965
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2966
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2967
lemma [simp]: "(<lm::nat list> = []) = (lm = [])"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2968
apply(case_tac lm, simp_all add: tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2969
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2970
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2971
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2972
 "dec_right_move (as, am) (s, l, []) ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2973
  dec_right_move (as, am) (s, l, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2974
apply(simp add: dec_right_move.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2975
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2976
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2977
lemma [simp]: "\<lbrakk>dec_right_move (as, am) (s, l, []) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2978
             \<Longrightarrow> dec_check_right_move (as, am) (s, Bk # l, []) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2979
apply(insert dec_right_move_2_check_right_move[of as am s l "[]" s'], 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2980
      simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2981
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2982
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2983
lemma [simp]: "dec_check_right_move (as, am) (s, l, r) ires\<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2984
apply(auto simp: dec_check_right_move.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2985
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2986
 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2987
lemma [simp]: "\<lbrakk>dec_check_right_move (as, am) (s, l, Oc # r) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2988
             \<Longrightarrow> dec_after_write (as, am) (s', tl l, hd l # Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2989
apply(auto simp: dec_check_right_move.simps dec_after_write.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2990
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2991
      rule_tac x = m in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2992
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2993
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2994
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2995
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2996
lemma [simp]: "\<lbrakk>dec_check_right_move (as, am) (s, l, Bk # r) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2997
                \<Longrightarrow> dec_left_move (as, am) (s', tl l, hd l # Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2998
apply(auto simp: dec_check_right_move.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2999
                 dec_left_move.simps inv_after_move.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3000
apply(rule_tac x = lm1 in exI, rule_tac x = m in exI, auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3001
apply(case_tac [!] lm2, simp_all add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3002
apply(rule_tac [!] x = "(Suc rn)" in exI, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3003
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3004
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3005
lemma [simp]: "\<lbrakk>dec_check_right_move (as, am) (s, l, []) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3006
             \<Longrightarrow> dec_left_move (as, am) (s', tl l, [hd l]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3007
apply(auto simp: dec_check_right_move.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3008
                 dec_left_move.simps inv_after_move.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3009
apply(rule_tac x = lm1 in exI, rule_tac x = m in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3010
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3011
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3012
lemma [simp]: "dec_left_move (as, am) (s, aaa, Oc # xs) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3013
apply(auto simp: dec_left_move.simps inv_after_move.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3014
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3015
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3016
lemma [simp]: "dec_left_move (as, am) (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3017
             \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3018
apply(auto simp: dec_left_move.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3019
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3020
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3021
lemma [simp]: "inv_on_left_moving_in_middle_B (as, [m])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3022
  (s', Oc # Oc\<up>m @ Bk # Bk # ires, Bk # Bk\<up>rn) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3023
apply(simp add: inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3024
apply(rule_tac x = "[m]" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3025
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3026
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3027
lemma [simp]: "inv_on_left_moving_in_middle_B (as, [m])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3028
  (s', Oc # Oc\<up>m @ Bk # Bk # ires, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3029
apply(simp add: inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3030
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3031
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3032
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3033
lemma [simp]: "lm1 \<noteq> [] \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3034
  inv_on_left_moving_in_middle_B (as, lm1 @ [m]) (s', 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3035
  Oc # Oc\<up>m @ Bk # <rev lm1> @ Bk # Bk # ires, Bk # Bk\<up>rn) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3036
apply(simp only: inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3037
apply(rule_tac x = "lm1 @ [m ]" in exI, rule_tac x = "[]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3038
apply(simp add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3039
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3040
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3041
lemma [simp]: "lm1 \<noteq> [] \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3042
  inv_on_left_moving_in_middle_B (as, lm1 @ [m]) (s', 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3043
  Oc # Oc\<up> m @ Bk # <rev lm1> @ Bk # Bk # ires, [Bk]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3044
apply(simp only: inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3045
apply(rule_tac x = "lm1 @ [m ]" in exI, rule_tac x = "[]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3046
apply(simp add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3047
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3048
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3049
lemma [simp]: "dec_left_move (as, am) (s, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3050
       \<Longrightarrow> inv_on_left_moving (as, am) (s', tl l, hd l # Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3051
apply(auto simp: dec_left_move.simps inv_on_left_moving.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3052
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3053
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3054
(*
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3055
lemma [simp]: "inv_on_left_moving_in_middle_B (as, lm1 @ [m]) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3056
                        (s', Oc # Oc\<^bsup>m\<^esup> @ Bk # <rev lm1> @ Bk\<^bsup>ln\<^esup>, [Bk])  ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3057
apply(auto simp: inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3058
apply(rule_tac x = "lm1 @ [m]" in exI, rule_tac x = "[]" in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3059
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3060
*)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3061
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3062
lemma [simp]: "dec_left_move (as, am) (s, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3063
             \<Longrightarrow> inv_on_left_moving (as, am) (s', tl l, [hd l]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3064
apply(auto simp: dec_left_move.simps inv_on_left_moving.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3065
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3066
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3067
lemma [simp]: "dec_after_write (as, am) (s, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3068
       \<Longrightarrow> dec_on_right_moving (as, am) (s', Oc # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3069
apply(auto simp: dec_after_write.simps dec_on_right_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3070
apply(rule_tac x = "lm1 @ [m]" in exI, rule_tac x = "tl lm2" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3071
      rule_tac x = "hd lm2" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3072
apply(rule_tac x = "Suc 0" in exI,rule_tac x =  "Suc (hd lm2)" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3073
apply(case_tac lm2, auto split: if_splits simp: tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3074
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3075
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3076
lemma [simp]: "dec_after_write (as, am) (s, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3077
       \<Longrightarrow> dec_after_write (as, am) (s', l, Oc # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3078
apply(auto simp: dec_after_write.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3079
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3080
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3081
lemma [simp]: "dec_after_write (as, am) (s, aaa, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3082
             \<Longrightarrow> dec_after_write (as, am) (s', aaa, [Oc]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3083
apply(auto simp: dec_after_write.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3084
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3085
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3086
lemma [simp]: "dec_on_right_moving (as, am) (s, l, Oc # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3087
       \<Longrightarrow> dec_on_right_moving (as, am) (s', Oc # l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3088
apply(simp only: dec_on_right_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3089
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3090
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3091
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3092
      rule_tac x = "m" in exI, rule_tac x = "Suc ml" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3093
      rule_tac x = "mr - 1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3094
apply(case_tac mr, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3095
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3096
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3097
lemma [simp]: "dec_on_right_moving (as, am) (s, l, r) ires\<Longrightarrow>  l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3098
apply(auto simp: dec_on_right_moving.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3099
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3100
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3101
lemma [simp]: "dec_on_right_moving (as, am) (s, l, Bk # r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3102
      \<Longrightarrow>  dec_after_clear (as, am) (s', tl l, hd l # Bk # r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3103
apply(auto simp: dec_on_right_moving.simps dec_after_clear.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3104
apply(case_tac [!] mr, auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3105
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3106
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3107
lemma [simp]: "dec_on_right_moving (as, am) (s, l, []) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3108
             \<Longrightarrow> dec_after_clear (as, am) (s', tl l, [hd l]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3109
apply(auto simp: dec_on_right_moving.simps dec_after_clear.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3110
apply(simp_all split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3111
apply(rule_tac x = lm1 in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3112
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3113
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3114
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3115
 "inv_stop (as, abc_lm_s am n (abc_lm_v am n)) (s, l, r) ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3116
apply(auto simp: inv_stop.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3117
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3118
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3119
lemma dec_false_1[simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3120
 "\<lbrakk>abc_lm_v am n = 0; inv_locate_b (as, am) (n, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3121
  \<Longrightarrow> False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3122
apply(auto simp: inv_locate_b.simps in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3123
apply(case_tac "length lm1 \<ge> length am", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3124
apply(subgoal_tac "lm2 = []", simp, subgoal_tac "m = 0", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3125
apply(case_tac mr, auto simp: )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3126
apply(subgoal_tac "Suc (length lm1) - length am = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3127
                   Suc (length lm1 - length am)", 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3128
      simp add: exp_ind del: replicate.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3129
apply(drule_tac xs = "am @ replicate (Suc (length lm1) - length am) 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3130
                and ys = "lm1 @ m # lm2" in length_equal, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3131
apply(case_tac mr, auto simp: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3132
apply(case_tac "mr = 0", simp_all split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3133
apply(subgoal_tac "Suc (length lm1) - length am = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3134
                       Suc (length lm1 - length am)", 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3135
      simp add: exp_ind del: replicate.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3136
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3137
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3138
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3139
 "\<lbrakk>inv_locate_b (as, am) (n, aaa, Bk # xs) ires; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3140
   abc_lm_v am n = 0\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3141
   \<Longrightarrow> inv_on_left_moving (as, abc_lm_s am n 0) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3142
                         (s, tl aaa, hd aaa # Bk # xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3143
apply(simp add: inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3144
apply(simp only: inv_locate_b.simps in_middle.simps) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3145
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3146
apply(simp add: inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3147
apply(subgoal_tac "\<not> inv_on_left_moving_in_middle_B 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3148
         (as, abc_lm_s am n 0) (s, tl aaa, hd aaa # Bk # xs) ires", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3149
apply(simp only: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3150
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3151
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3152
      rule_tac x =  m in exI, rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3153
      rule_tac x = "Suc 0" in exI, simp add: abc_lm_s.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3154
apply(case_tac mr, simp_all, auto simp: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3155
apply(simp only: exp_ind[THEN sym] replicate_Suc Nat.Suc_diff_le)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3156
apply(auto simp: inv_on_left_moving_in_middle_B.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3157
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3158
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3159
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3160
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3161
 "\<lbrakk>abc_lm_v am n = 0; inv_locate_b (as, am) (n, aaa, []) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3162
   \<Longrightarrow> inv_on_left_moving (as, abc_lm_s am n 0) (s, tl aaa, [hd aaa]) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3163
apply(simp add: inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3164
apply(simp only: inv_locate_b.simps in_middle.simps) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3165
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3166
apply(simp add: inv_on_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3167
apply(subgoal_tac "\<not> inv_on_left_moving_in_middle_B 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3168
         (as, abc_lm_s am n 0) (s, tl aaa, [hd aaa]) ires", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3169
apply(simp only: inv_on_left_moving_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3170
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3171
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3172
      rule_tac x =  m in exI, rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3173
      rule_tac x = "Suc 0" in exI, simp add: abc_lm_s.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3174
apply(case_tac mr, simp_all, auto simp: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3175
apply(simp_all only: exp_ind Nat.Suc_diff_le del: replicate_Suc, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3176
apply(auto simp: inv_on_left_moving_in_middle_B.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3177
apply(case_tac [!] m, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3178
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3179
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3180
lemma [simp]: "\<lbrakk>am ! n = (0::nat); n < length am\<rbrakk> \<Longrightarrow> am[n := 0] = am"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3181
apply(simp add: list_update_same_conv)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3182
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3183
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3184
lemma  [intro]: "\<lbrakk>abc_lm_v (a # list) 0 = 0\<rbrakk> \<Longrightarrow> a = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3185
apply(simp add: abc_lm_v.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3186
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3187
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3188
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3189
 "inv_stop (as, abc_lm_s am n 0) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3190
          (start_of (layout_of aprog) e, aaa, Oc # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3191
  \<Longrightarrow> inv_locate_a (as, abc_lm_s am n 0) (0, aaa, Oc # xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3192
apply(simp add: inv_locate_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3193
apply(rule disjI1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3194
apply(auto simp: inv_stop.simps at_begin_norm.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3195
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3196
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3197
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3198
 "\<lbrakk>inv_stop (as, abc_lm_s am n 0) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3199
          (start_of (layout_of aprog) e, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3200
  \<Longrightarrow> inv_locate_b (as, am) (0, Oc # aaa, xs) ires \<or> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3201
      inv_locate_b (as, abc_lm_s am n 0) (0, Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3202
apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3203
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3204
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3205
lemma dec_false2: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3206
 "inv_stop (as, abc_lm_s am n 0) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3207
  (start_of (layout_of aprog) e, aaa, Bk # xs) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3208
apply(auto simp: inv_stop.simps abc_lm_s.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3209
apply(case_tac [!] am, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3210
apply(case_tac [!] n, auto simp: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3211
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3212
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3213
lemma dec_false3:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3214
   "inv_stop (as, abc_lm_s am n 0) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3215
              (start_of (layout_of aprog) e, aaa, []) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3216
apply(auto simp: inv_stop.simps abc_lm_s.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3217
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3218
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3219
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3220
  "fetch (ci (layout_of aprog) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3221
       (start_of (layout_of aprog) as) (Dec n e)) 0 b = (Nop, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3222
by(simp add: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3223
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3224
declare dec_inv_1.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3225
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3226
declare inv_locate_n_b.simps [simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3227
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3228
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3229
  "\<lbrakk>0 < abc_lm_v am n; 0 < n; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3230
    at_begin_fst_bwtn (as, am) (n, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3231
 \<Longrightarrow> inv_locate_n_b (as, am) (n, Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3232
apply(simp add: at_begin_fst_bwtn.simps inv_locate_n_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3233
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3234
 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3235
lemma Suc_minus:"length am + tn = n
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3236
       \<Longrightarrow> Suc tn = Suc n - length am "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3237
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3238
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3239
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3240
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3241
 "\<lbrakk>0 < abc_lm_v am n; 0 < n; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3242
   at_begin_fst_awtn (as, am) (n, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3243
 \<Longrightarrow> inv_locate_n_b (as, am) (n, Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3244
apply(simp only: at_begin_fst_awtn.simps inv_locate_n_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3245
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3246
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3247
apply(rule_tac x = lm1 in exI, rule_tac x = "[]" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3248
      rule_tac x = "Suc tn" in exI, rule_tac x = 0 in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3249
apply(simp add: exp_ind del: replicate.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3250
apply(rule conjI)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3251
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3252
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3253
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3254
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3255
 "\<lbrakk>inv_locate_n_b (as, am) (n, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3256
 \<Longrightarrow> dec_first_on_right_moving n (as, abc_lm_s am n (abc_lm_v am n))  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3257
                                      (s, Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3258
apply(auto simp: inv_locate_n_b.simps dec_first_on_right_moving.simps 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3259
                 abc_lm_s.simps abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3260
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3261
      rule_tac x = m in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3262
apply(rule_tac x = "Suc (Suc 0)" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3263
      rule_tac x = "m - 1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3264
apply(case_tac m, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3265
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3266
      rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3267
      simp add: Suc_diff_le exp_ind del: replicate.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3268
apply(rule_tac x = "Suc (Suc 0)" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3269
      rule_tac x = "m - 1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3270
apply(case_tac m, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3271
apply(rule_tac x = lm1 in exI, rule_tac x = "[]" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3272
      rule_tac x = m in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3273
apply(rule_tac x = "Suc (Suc 0)" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3274
      rule_tac x = "m - 1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3275
apply(case_tac m, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3276
apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3277
      rule_tac x = m in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3278
      simp add: Suc_diff_le exp_ind del: replicate.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3279
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3280
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3281
lemma [simp]: "inv_on_left_moving (as, am) (s, [], r) ires 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3282
  = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3283
apply(simp add: inv_on_left_moving.simps inv_on_left_moving_norm.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3284
                inv_on_left_moving_in_middle_B.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3285
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3286
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3287
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3288
  "inv_check_left_moving (as, abc_lm_s am n 0)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3289
  (start_of (layout_of aprog) as + 2 * n + 14, [], Oc # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3290
 = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3291
apply(simp add: inv_check_left_moving.simps inv_check_left_moving_in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3292
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3293
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3294
lemma [simp]: "inv_check_left_moving (as, abc_lm_s lm n (abc_lm_v lm n)) (s, [], Oc # list) ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3295
apply(simp add: inv_check_left_moving.simps inv_check_left_moving_in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3296
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3297
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3298
lemma [elim]: "\<lbrakk>abc_fetch as ap = Some (Dec n e);
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3299
                start_of (layout_of ap) as < start_of (layout_of ap) e; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3300
                start_of (layout_of ap) e \<le> Suc (start_of (layout_of ap) as + 2 * n)\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3301
       \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3302
  using start_of_less[of e as "layout_of ap"] start_of_ge[of as ap n e "layout_of ap"]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3303
apply(case_tac "as < e", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3304
apply(case_tac "as = e", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3305
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3306
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3307
lemma crsp_step_dec_b_e_pre':
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3308
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3309
  and inv_start: "inv_locate_b (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3310
  and fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3311
  and dec_0: "abc_lm_v lm n = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3312
  and f: "f = (\<lambda> stp. (steps (Suc (start_of ly as) + 2 * n, la, ra) (ci ly (start_of ly as) (Dec n e), 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3313
            start_of ly as - Suc 0) stp, start_of ly as, n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3314
  and P: "P = (\<lambda> ((s, l, r), ss, x). s = start_of ly e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3315
  and Q: "Q = (\<lambda> ((s, l, r), ss, x). dec_inv_1 ly x e (as, lm) (s, l, r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3316
  shows "\<exists> stp. P (f stp) \<and> Q (f stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3317
proof(rule_tac LE = abc_dec_1_LE in halt_lemma2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3318
  show "wf abc_dec_1_LE" by(intro wf_dec_le)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3319
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3320
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3321
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3322
    apply(simp add: f steps.simps Q dec_inv_1.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3323
    apply(subgoal_tac "e > as \<or> e = as \<or> e < as")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3324
    apply(auto simp: Let_def start_of_ge start_of_less inv_start)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3325
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3326
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3327
  show "\<not> P (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3328
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3329
    apply(simp add: f steps.simps P)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3330
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3331
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3332
  show "\<forall>n. \<not> P (f n) \<and> Q (f n) \<longrightarrow> Q (f (Suc n)) \<and> (f (Suc n), f n) \<in> abc_dec_1_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3333
    using fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3334
  proof(rule_tac allI, rule_tac impI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3335
    fix na
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3336
    assume "\<not> P (f na) \<and> Q (f na)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3337
    thus "Q (f (Suc na)) \<and> (f (Suc na), f na) \<in> abc_dec_1_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3338
      apply(simp add: f)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3339
      apply(case_tac "steps (Suc (start_of ly as + 2 * n), la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3340
        (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0) na", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3341
    proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3342
      fix a b c 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3343
      assume "\<not> P ((a, b, c), start_of ly as, n) \<and> Q ((a, b, c), start_of ly as, n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3344
      thus "Q (step (a, b, c) (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0), start_of ly as, n) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3345
               ((step (a, b, c) (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0), start_of ly as, n), 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3346
                   (a, b, c), start_of ly as, n) \<in> abc_dec_1_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3347
        apply(simp add: Q)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3348
        apply(case_tac c, case_tac [2] aa)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3349
        apply(simp_all add: dec_inv_1.simps Let_def split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3350
        using fetch layout dec_0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3351
        apply(auto simp: step.simps P dec_inv_1.simps Let_def abc_dec_1_LE_def lex_triple_def lex_pair_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3352
        using dec_0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3353
        apply(drule_tac dec_false_1, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3354
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3355
    qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3356
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3357
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3358
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3359
lemma crsp_step_dec_b_e_pre:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3360
  assumes "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3361
  and inv_start: "inv_locate_b (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3362
  and dec_0: "abc_lm_v lm n  = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3363
  and fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3364
  shows "\<exists>stp lb rb.
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3365
       steps (Suc (start_of ly as) + 2 * n, la, ra) (ci ly (start_of ly as) (Dec n e), 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3366
       start_of ly as - Suc 0) stp = (start_of ly e, lb, rb) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3367
       dec_inv_1 ly n e (as, lm) (start_of ly e, lb, rb) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3368
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3369
  apply(drule_tac crsp_step_dec_b_e_pre', auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3370
  apply(rule_tac x = stp in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3371
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3372
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3373
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3374
  "\<lbrakk>abc_lm_v lm n = 0;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3375
  inv_stop (as, abc_lm_s lm n (abc_lm_v lm n)) (start_of ly e, lb, rb) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3376
  \<Longrightarrow> crsp ly (abc_step_l (as, lm) (Some (Dec n e))) (start_of ly e, lb, rb) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3377
apply(auto simp: crsp.simps abc_step_l.simps inv_stop.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3378
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3379
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3380
lemma crsp_step_dec_b_e:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3381
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3382
  and inv_start: "inv_locate_a (as, lm) (n, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3383
  and dec_0: "abc_lm_v lm n = 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3384
  and fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3385
  shows "\<exists>stp > 0. crsp ly (abc_step_l (as, lm) (Some (Dec n e)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3386
  (steps (start_of ly as + 2 * n, l, r) (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0) stp) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3387
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3388
  let ?P = "ci ly (start_of ly as) (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3389
  let ?off = "start_of ly as - Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3390
  have "\<exists> stp la ra. steps (start_of ly as + 2 * n, l, r) (?P, ?off) stp = (Suc (start_of ly as) + 2*n, la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3391
             \<and>  inv_locate_b (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3392
    using inv_start
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3393
    apply(case_tac "r = [] \<or> hd r = Bk", simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3394
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3395
  from this obtain stpa la ra where a:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3396
    "steps (start_of ly as + 2 * n, l, r) (?P, ?off) stpa = (Suc (start_of ly as) + 2*n, la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3397
             \<and>  inv_locate_b (as, lm) (n, la, ra) ires" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3398
  term dec_inv_1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3399
  have "\<exists> stp lb rb. steps (Suc (start_of ly as) + 2 * n, la, ra) (?P, ?off) stp = (start_of ly e, lb, rb)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3400
             \<and>  dec_inv_1 ly n e (as, lm) (start_of ly e, lb, rb) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3401
    using assms a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3402
    apply(rule_tac crsp_step_dec_b_e_pre, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3403
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3404
  from this obtain stpb lb rb where b:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3405
    "steps (Suc (start_of ly as) + 2 * n, la, ra) (?P, ?off) stpb = (start_of ly e, lb, rb)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3406
             \<and>  dec_inv_1 ly n e (as, lm) (start_of ly e, lb, rb) ires"  by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3407
  from a b show "\<exists>stp > 0. crsp ly (abc_step_l (as, lm) (Some (Dec n e))) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3408
    (steps (start_of ly as + 2 * n, l, r) (?P, ?off) stp) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3409
    apply(rule_tac x = "stpa + stpb" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3410
    apply(simp add: steps_add)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3411
    using dec_0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3412
    apply(simp add: dec_inv_1.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3413
    apply(case_tac stpa, simp_all add: steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3414
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3415
qed    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3416
  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3417
fun dec_inv_2 :: "layout \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> dec_inv_t"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3418
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3419
  "dec_inv_2 ly n e (as, am) (s, l, r) ires =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3420
           (let ss = start_of ly as in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3421
            let am' = abc_lm_s am n (abc_lm_v am n - Suc 0) in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3422
            let am'' = abc_lm_s am n (abc_lm_v am n) in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3423
              if s = 0 then False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3424
              else if s = ss + 2 * n then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3425
                      inv_locate_a (as, am) (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3426
              else if s = ss + 2 * n + 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3427
                      inv_locate_n_b (as, am) (n, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3428
              else if s = ss + 2 * n + 2 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3429
                      dec_first_on_right_moving n (as, am'') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3430
              else if s = ss + 2 * n + 3 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3431
                      dec_after_clear (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3432
              else if s = ss + 2 * n + 4 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3433
                      dec_right_move (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3434
              else if s = ss + 2 * n + 5 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3435
                      dec_check_right_move (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3436
              else if s = ss + 2 * n + 6 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3437
                      dec_left_move (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3438
              else if s = ss + 2 * n + 7 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3439
                      dec_after_write (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3440
              else if s = ss + 2 * n + 8 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3441
                      dec_on_right_moving (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3442
              else if s = ss + 2 * n + 9 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3443
                      dec_after_clear (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3444
              else if s = ss + 2 * n + 10 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3445
                      inv_on_left_moving (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3446
              else if s = ss + 2 * n + 11 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3447
                      inv_check_left_moving (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3448
              else if s = ss + 2 * n + 12 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3449
                      inv_after_left_moving (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3450
              else if s = ss + 2 * n + 16 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3451
                      inv_stop (as, am') (s, l, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3452
              else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3453
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3454
declare dec_inv_2.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3455
fun abc_dec_2_stage1 :: "config \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3456
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3457
  "abc_dec_2_stage1 (s, l, r) ss n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3458
              (if s \<le> ss + 2*n + 1 then 7
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3459
               else if s = ss + 2*n + 2 then 6 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3460
               else if s = ss + 2*n + 3 then 5
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3461
               else if s \<ge> ss + 2*n + 4 \<and> s \<le> ss + 2*n + 9 then 4
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3462
               else if s = ss + 2*n + 6 then 3
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3463
               else if s = ss + 2*n + 10 \<or> s = ss + 2*n + 11 then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3464
               else if s = ss + 2*n + 12 then 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3465
               else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3466
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3467
fun abc_dec_2_stage2 :: "config \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3468
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3469
  "abc_dec_2_stage2 (s, l, r) ss n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3470
       (if s \<le> ss + 2 * n + 1 then (ss + 2 * n + 16 - s)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3471
        else if s = ss + 2*n + 10 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3472
        else if s = ss + 2*n + 11 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3473
        else if s = ss + 2*n + 4 then length r - 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3474
        else if s = ss + 2*n + 5 then length r 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3475
        else if s = ss + 2*n + 7 then length r - 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3476
        else if s = ss + 2*n + 8 then  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3477
              length r + length (takeWhile (\<lambda> a. a = Oc) l) - 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3478
        else if s = ss + 2*n + 9 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3479
              length r + length (takeWhile (\<lambda> a. a = Oc) l) - 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3480
        else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3481
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3482
fun abc_dec_2_stage3 :: "config \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3483
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3484
  "abc_dec_2_stage3 (s, l, r) ss n  =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3485
        (if s \<le> ss + 2*n + 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3486
            if (s - ss) mod 2 = 0 then if r \<noteq> [] \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3487
                                          hd r = Oc then 0 else 1  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3488
            else length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3489
         else if s = ss + 2 * n + 10 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3490
             if  r \<noteq> [] \<and> hd r = Oc then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3491
             else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3492
         else if s = ss + 2 * n + 11 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3493
             if r \<noteq> [] \<and> hd r = Oc then 3 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3494
             else 0 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3495
         else (ss + 2 * n + 16 - s))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3496
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3497
fun abc_dec_2_stage4 :: "config \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3498
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3499
  "abc_dec_2_stage4 (s, l, r) ss n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3500
          (if s = ss + 2*n + 2 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3501
           else if s = ss + 2*n + 8 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3502
           else if s = ss + 2*n + 3 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3503
               if r \<noteq> [] \<and> hd r = Oc then 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3504
               else 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3505
           else if s = ss + 2*n + 7 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3506
               if r \<noteq> [] \<and> hd r = Oc then 0 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3507
               else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3508
           else if s = ss + 2*n + 9 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3509
               if r \<noteq> [] \<and> hd r = Oc then 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3510
               else 0 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3511
           else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3512
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3513
fun abc_dec_2_measure :: "(config \<times> nat \<times> nat) \<Rightarrow> (nat \<times> nat \<times> nat \<times> nat)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3514
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3515
  "abc_dec_2_measure (c, ss, n) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3516
  (abc_dec_2_stage1 c ss n, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3517
  abc_dec_2_stage2 c ss n, abc_dec_2_stage3 c ss n,  abc_dec_2_stage4 c ss n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3518
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3519
definition lex_square:: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3520
   "((nat \<times> nat \<times> nat \<times> nat) \<times> (nat \<times> nat \<times> nat \<times> nat)) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3521
  where "lex_square \<equiv> less_than <*lex*> lex_triple"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3522
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3523
definition abc_dec_2_LE ::
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3524
  "((config \<times> nat \<times>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3525
  nat) \<times> (config \<times> nat \<times> nat)) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3526
  where "abc_dec_2_LE \<equiv> (inv_image lex_square abc_dec_2_measure)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3527
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3528
lemma wf_dec2_le: "wf abc_dec_2_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3529
by(auto intro:wf_inv_image simp:abc_dec_2_LE_def lex_square_def lex_triple_def lex_pair_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3530
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3531
lemma fix_add: "fetch ap ((x::nat) + 2*n) b = fetch ap (2*n + x) b"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3532
by (metis Suc_1 mult_2 nat_add_commute)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3533
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3534
lemma [elim]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3535
 "\<lbrakk>0 < abc_lm_v am n; inv_locate_n_b (as, am) (n, aaa, Bk # xs) ires\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3536
 \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3537
apply(auto simp: inv_locate_n_b.simps abc_lm_v.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3538
apply(case_tac [!] m, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3539
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3540
 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3541
lemma [elim]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3542
 "\<lbrakk>0 < abc_lm_v am n; inv_locate_n_b (as, am) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3543
                                (n, aaa, []) ires\<rbrakk> \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3544
apply(auto simp: inv_locate_n_b.simps abc_lm_v.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3545
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3546
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3547
lemma [simp]: "dec_after_write (as, am) (s, aa, r) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3548
           \<Longrightarrow> takeWhile (\<lambda>a. a = Oc) aa = []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3549
apply(simp only : dec_after_write.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3550
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3551
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3552
apply(case_tac aa, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3553
apply(case_tac a, simp only: takeWhile.simps , simp_all split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3554
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3555
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3556
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3557
     "\<lbrakk>dec_on_right_moving (as, lm) (s, aa, []) ires; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3558
       length (takeWhile (\<lambda>a. a = Oc) (tl aa)) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3559
           \<noteq> length (takeWhile (\<lambda>a. a = Oc) aa) - Suc 0\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3560
    \<Longrightarrow> length (takeWhile (\<lambda>a. a = Oc) (tl aa)) < 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3561
                       length (takeWhile (\<lambda>a. a = Oc) aa) - Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3562
apply(simp only: dec_on_right_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3563
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3564
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3565
apply(case_tac mr, auto split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3566
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3567
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3568
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3569
  "dec_after_clear (as, abc_lm_s am n (abc_lm_v am n - Suc 0)) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3570
             (start_of (layout_of aprog) as + 2 * n + 9, aa, Bk # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3571
 \<Longrightarrow> length xs - Suc 0 < length xs + 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3572
                             length (takeWhile (\<lambda>a. a = Oc) aa)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3573
apply(simp only: dec_after_clear.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3574
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3575
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3576
apply(simp split: if_splits )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3577
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3578
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3579
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3580
 "\<lbrakk>dec_after_clear (as, abc_lm_s am n (abc_lm_v am n - Suc 0))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3581
       (start_of (layout_of aprog) as + 2 * n + 9, aa, []) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3582
    \<Longrightarrow> Suc 0 < length (takeWhile (\<lambda>a. a = Oc) aa)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3583
apply(simp add: dec_after_clear.simps split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3584
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3585
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3586
lemma [elim]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3587
  "inv_check_left_moving (as, lm)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3588
  (s, [], Oc # xs) ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3589
 \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3590
apply(simp add: inv_check_left_moving.simps inv_check_left_moving_in_middle.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3591
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3592
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3593
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3594
"\<lbrakk>0 < abc_lm_v am n; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3595
  at_begin_norm (as, am) (n, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3596
  \<Longrightarrow> inv_locate_n_b (as, am) (n, Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3597
apply(simp only: at_begin_norm.simps inv_locate_n_b.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3598
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3599
apply(rule_tac x = lm1 in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3600
apply(case_tac "length lm2", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3601
apply(case_tac "lm2", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3602
apply(case_tac "lm2", auto simp: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3603
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3604
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3605
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3606
 "\<lbrakk>0 < abc_lm_v am n; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3607
   at_begin_fst_awtn (as, am) (n, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3608
 \<Longrightarrow> inv_locate_n_b (as, am) (n, Oc # aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3609
apply(simp only: at_begin_fst_awtn.simps inv_locate_n_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3610
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3611
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3612
apply(rule_tac x = lm1 in exI, rule_tac x = "[]" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3613
      rule_tac x = "Suc tn" in exI, rule_tac x = 0 in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3614
apply(simp add: exp_ind del: replicate.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3615
apply(rule conjI)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3616
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3617
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3618
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3619
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3620
 "\<lbrakk>0 < abc_lm_v am n; inv_locate_a (as, am) (n, aaa, Oc # xs) ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3621
 \<Longrightarrow> inv_locate_n_b (as, am) (n, Oc#aaa, xs) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3622
apply(auto simp: inv_locate_a.simps at_begin_fst_bwtn.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3623
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3624
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3625
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3626
 "\<lbrakk>dec_on_right_moving (as, am) (s, aa, Bk # xs) ires; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3627
   Suc (length (takeWhile (\<lambda>a. a = Oc) (tl aa)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3628
   \<noteq> length (takeWhile (\<lambda>a. a = Oc) aa)\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3629
  \<Longrightarrow> Suc (length (takeWhile (\<lambda>a. a = Oc) (tl aa))) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3630
    < length (takeWhile (\<lambda>a. a = Oc) aa)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3631
apply(simp only: dec_on_right_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3632
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3633
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3634
apply(case_tac ml, auto split: if_splits )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3635
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3636
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3637
lemma crsp_step_dec_b_suc_pre:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3638
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3639
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3640
  and inv_start: "inv_locate_a (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3641
  and fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3642
  and dec_suc: "0 < abc_lm_v lm n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3643
  and f: "f = (\<lambda> stp. (steps (start_of ly as + 2 * n, la, ra) (ci ly (start_of ly as) (Dec n e), 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3644
            start_of ly as - Suc 0) stp, start_of ly as, n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3645
  and P: "P = (\<lambda> ((s, l, r), ss, x). s = start_of ly as + 2*n + 16)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3646
  and Q: "Q = (\<lambda> ((s, l, r), ss, x). dec_inv_2 ly x e (as, lm) (s, l, r) ires)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3647
  shows "\<exists> stp. P (f stp) \<and> Q(f stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3648
  proof(rule_tac LE = abc_dec_2_LE in halt_lemma2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3649
  show "wf abc_dec_2_LE" by(intro wf_dec2_le)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3650
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3651
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3652
    using layout fetch inv_start
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3653
    apply(simp add: f steps.simps Q)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3654
    apply(simp only: dec_inv_2.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3655
    apply(auto simp: Let_def start_of_ge start_of_less inv_start dec_inv_2.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3656
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3657
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3658
  show "\<not> P (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3659
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3660
    apply(simp add: f steps.simps P)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3661
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3662
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3663
  show "\<forall>n. \<not> P (f n) \<and> Q (f n) \<longrightarrow> Q (f (Suc n)) \<and> (f (Suc n), f n) \<in> abc_dec_2_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3664
    using fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3665
  proof(rule_tac allI, rule_tac impI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3666
    fix na
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3667
    assume "\<not> P (f na) \<and> Q (f na)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3668
    thus "Q (f (Suc na)) \<and> (f (Suc na), f na) \<in> abc_dec_2_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3669
      apply(simp add: f)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3670
      apply(case_tac "steps ((start_of ly as + 2 * n), la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3671
        (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0) na", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3672
    proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3673
      fix a b c 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3674
      assume "\<not> P ((a, b, c), start_of ly as, n) \<and> Q ((a, b, c), start_of ly as, n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3675
      thus "Q (step (a, b, c) (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0), start_of ly as, n) \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3676
               ((step (a, b, c) (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0), start_of ly as, n), 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3677
                   (a, b, c), start_of ly as, n) \<in> abc_dec_2_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3678
        apply(simp add: Q)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3679
        apply(erule_tac conjE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3680
        apply(case_tac c, case_tac [2] aa)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3681
        apply(simp_all add: dec_inv_2.simps Let_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3682
        apply(simp_all split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3683
        using fetch layout dec_suc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3684
        apply(auto simp: step.simps P dec_inv_2.simps Let_def abc_dec_2_LE_def lex_triple_def lex_pair_def lex_square_def
115
653426ed4b38 started with abacus section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 112
diff changeset
  3685
                         fix_add numeral_3_eq_3) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3686
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3687
    qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3688
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3689
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3690
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3691
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3692
  "\<lbrakk>inv_stop (as, abc_lm_s lm n (abc_lm_v lm n - Suc 0)) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3693
  (start_of (layout_of ap) as + 2 * n + 16, a, b) ires;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3694
   abc_lm_v lm n > 0;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3695
   abc_fetch as ap = Some (Dec n e)\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3696
  \<Longrightarrow> crsp (layout_of ap) (abc_step_l (as, lm) (Some (Dec n e))) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3697
  (start_of (layout_of ap) as + 2 * n + 16, a, b) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3698
apply(auto simp: inv_stop.simps crsp.simps  abc_step_l.simps startof_Suc2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3699
apply(drule_tac startof_Suc2, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3700
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3701
  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3702
lemma crsp_step_dec_b_suc:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3703
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3704
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3705
  and inv_start: "inv_locate_a (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3706
  and fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3707
  and dec_suc: "0 < abc_lm_v lm n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3708
  shows "\<exists>stp > 0. crsp ly (abc_step_l (as, lm) (Some (Dec n e)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3709
              (steps (start_of ly as + 2 * n, la, ra) (ci (layout_of ap) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3710
                  (start_of ly as) (Dec n e), start_of ly as - Suc 0) stp) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3711
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3712
  apply(drule_tac crsp_step_dec_b_suc_pre, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3713
  apply(rule_tac x = stp in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3714
  apply(simp add: dec_inv_2.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3715
  apply(case_tac stp, simp_all add: steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3716
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3717
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3718
lemma crsp_step_dec_b:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3719
  assumes layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3720
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3721
  and inv_start: "inv_locate_a (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3722
  and fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3723
  shows "\<exists>stp > 0. crsp ly (abc_step_l (as, lm) (Some (Dec n e)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3724
  (steps (start_of ly as + 2 * n, la, ra) (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0) stp) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3725
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3726
apply(case_tac "abc_lm_v lm n = 0")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3727
apply(rule_tac crsp_step_dec_b_e, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3728
apply(rule_tac crsp_step_dec_b_suc, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3729
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3730
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3731
lemma crsp_step_dec: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3732
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3733
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3734
  and fetch: "abc_fetch as ap = Some (Dec n e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3735
  shows "\<exists>stp > 0. crsp ly (abc_step_l (as, lm) (Some (Dec n e)))
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3736
  (steps (s, l, r) (ci ly (start_of ly as) (Dec n e), start_of ly as - Suc 0) stp) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3737
proof(simp add: ci.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3738
  let ?off = "start_of ly as - Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3739
  let ?A = "findnth n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3740
  let ?B = "sete (shift (shift tdec_b (2 * n)) ?off) (start_of ly e)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3741
  have "\<exists> stp la ra. steps (s, l, r) (shift ?A ?off @ ?B, ?off) stp = (start_of ly as + 2*n, la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3742
                    \<and> inv_locate_a (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3743
  proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3744
    have "\<exists>stp l' r'. steps (Suc 0, l, r) (?A, 0) stp = (Suc (2 * n), l', r') \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3745
                     inv_locate_a (as, lm) (n, l', r') ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3746
      using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3747
      apply(rule_tac findnth_correct, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3748
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3749
    then obtain stp l' r' where a: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3750
      "steps (Suc 0, l, r) (?A, 0) stp = (Suc (2 * n), l', r') \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3751
      inv_locate_a (as, lm) (n, l', r') ires" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3752
    then have "steps (Suc 0 + ?off, l, r) (shift ?A ?off, ?off) stp = (Suc (2 * n) + ?off, l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3753
      apply(rule_tac tm_shift_eq_steps, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3754
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3755
    moreover have "s = start_of ly as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3756
      using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3757
      apply(auto simp: crsp.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3758
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3759
    ultimately show "\<exists> stp la ra. steps (s, l, r) (shift ?A ?off @ ?B, ?off) stp = (start_of ly as + 2*n, la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3760
                    \<and> inv_locate_a (as, lm) (n, la, ra) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3761
      using a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3762
      apply(drule_tac B = ?B in tm_append_first_steps_eq, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3763
      apply(rule_tac x = stp in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3764
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3765
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3766
  from this obtain stpa la ra where a: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3767
    "steps (s, l, r) (shift ?A ?off @ ?B, ?off) stpa = (start_of ly as + 2*n, la, ra)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3768
                    \<and> inv_locate_a (as, lm) (n, la, ra) ires" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3769
  have "\<exists>stp. crsp ly (abc_step_l (as, lm) (Some (Dec n e)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3770
           (steps (start_of ly as + 2*n, la, ra) (shift ?A ?off @ ?B, ?off) stp) ires \<and> stp > 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3771
    using assms a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3772
    apply(drule_tac crsp_step_dec_b, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3773
    apply(rule_tac x = stp in exI, simp add: ci.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3774
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3775
  then obtain stpb where b: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3776
    "crsp ly (abc_step_l (as, lm) (Some (Dec n e)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3777
    (steps (start_of ly as + 2*n, la, ra) (shift ?A ?off @ ?B, ?off) stpb) ires \<and> stpb > 0" ..
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3778
  from a b show "\<exists> stp>0. crsp ly (abc_step_l (as, lm) (Some (Dec n e)))
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3779
    (steps (s, l, r) (shift ?A ?off @ ?B, ?off) stp) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3780
    apply(rule_tac x = "stpa + stpb" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3781
    apply(simp add: steps_add)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3782
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3783
qed    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3784
  
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3785
subsection{*Crsp of Goto*}
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3786
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3787
lemma crsp_step_goto:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3788
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3789
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3790
  shows "\<exists>stp>0. crsp ly (abc_step_l (as, lm) (Some (Goto n)))
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3791
  (steps (s, l, r) (ci ly (start_of ly as) (Goto n), 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3792
            start_of ly as - Suc 0) stp) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3793
using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3794
apply(rule_tac x = "Suc 0" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3795
apply(case_tac r, case_tac [2] a)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3796
apply(simp_all add: ci.simps steps.simps step.simps crsp.simps fetch.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3797
  crsp.simps abc_step_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3798
done
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3799
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3800
lemma crsp_step_in:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3801
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3802
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3803
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3804
  and fetch: "abc_fetch as ap = Some ins"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3805
  shows "\<exists> stp>0. crsp ly (abc_step_l (as, lm) (Some ins))
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3806
                      (steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3807
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3808
  apply(case_tac ins, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3809
  apply(rule crsp_step_inc, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3810
  apply(rule crsp_step_dec, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3811
  apply(rule_tac crsp_step_goto, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3812
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3813
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3814
lemma crsp_step:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3815
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3816
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3817
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3818
  and fetch: "abc_fetch as ap = Some ins"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3819
  shows "\<exists> stp>0. crsp ly (abc_step_l (as, lm) (Some ins))
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3820
                      (steps (s, l, r) (tp, 0) stp) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3821
proof -
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3822
  have "\<exists> stp>0. crsp ly (abc_step_l (as, lm) (Some ins))
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3823
                      (steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3824
    using assms
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3825
    apply(rule_tac crsp_step_in, simp_all)
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3826
    done
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3827
  from this obtain stp where d: "stp > 0 \<and> crsp ly (abc_step_l (as, lm) (Some ins))
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3828
                      (steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp) ires" ..
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3829
  obtain s' l' r' where e:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3830
    "(steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp) = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3831
    apply(case_tac "(steps (s, l, r) (ci ly (start_of ly as) ins, start_of ly as - 1) stp)")
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3832
    by blast
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3833
  then have "steps (s, l, r) (tp, 0) stp = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3834
    using assms d
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3835
    apply(rule_tac steps_eq_in)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3836
    apply(simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3837
    apply(case_tac "(abc_step_l (as, lm) (Some ins))", simp add: crsp.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3838
    done    
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3839
  thus " \<exists>stp>0. crsp ly (abc_step_l (as, lm) (Some ins)) (steps (s, l, r) (tp, 0) stp) ires"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3840
    using d e
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3841
    apply(rule_tac x = stp in exI, simp)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3842
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3843
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3844
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3845
lemma crsp_steps:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3846
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3847
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3848
  and crsp: "crsp ly (as, lm) (s, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3849
  shows "\<exists> stp. crsp ly (abc_steps_l (as, lm) ap n)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3850
                      (steps (s, l, r) (tp, 0) stp) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3851
(*
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3852
proof(induct n)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3853
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3854
  have "crsp ly (abc_steps_l (as, lm) ap 0) (steps (s, l, r) (tp, 0) 0) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3855
    using crsp by(simp add: steps.simps abc_steps_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3856
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3857
    by(rule_tac x = 0 in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3858
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3859
  case (Suc n)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3860
  obtain as' lm' where a: "abc_steps_l (as, lm) ap n = (as', lm')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3861
    by(case_tac "abc_steps_l (as, lm) ap n", auto) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3862
  have "\<exists>stp\<ge>n. crsp ly (abc_steps_l (as, lm) ap n) (steps (s, l, r) (tp, 0) stp) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3863
    by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3864
  from this a obtain stpa where b:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3865
    "stpa\<ge>n \<and> crsp ly (as', lm') (steps (s, l, r) (tp, 0) stpa) ires" by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3866
  obtain s' l' r' where "steps (s, l, r) (tp, 0) stpa = (s', l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3867
    by(case_tac "steps (s, l, r) (tp, 0) stpa")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3868
  then have "stpa\<ge>n \<and> crsp ly (as', lm') (s', l', r') ires" using b by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3869
  from a and this show "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3870
  proof(cases "abc_fetch as' ap")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3871
    case None
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3872
    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3873
  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3874
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3875
    have "crsp ly (abc_steps_l (as, lm) ap 0) (steps (s, l, r) (tp, 0) stp) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3876
    apply(simp add: steps.simps abc_steps_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3877
*)
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3878
  using crsp
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3879
  apply(induct n)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3880
  apply(rule_tac x = 0 in exI) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3881
  apply(simp add: steps.simps abc_steps_l.simps, simp)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3882
  apply(case_tac "(abc_steps_l (as, lm) ap n)", auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3883
  apply(frule_tac abc_step_red, simp)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3884
  apply(case_tac "abc_fetch a ap", simp add: abc_step_l.simps, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3885
  apply(case_tac "steps (s, l, r) (tp, 0) stp", simp)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3886
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3887
  apply(drule_tac s = ab and l = ba and r = c in crsp_step, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3888
  apply(rule_tac x = "stp + stpa" in exI, simp add: steps_add)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3889
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3890
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3891
lemma tp_correct': 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3892
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3893
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3894
  and crsp: "crsp ly (0, lm) (Suc 0, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3895
  and abc_halt: "abc_steps_l (0, lm) ap stp = (length ap, am)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3896
  shows "\<exists> stp k. steps (Suc 0, l, r) (tp, 0) stp = (start_of ly (length ap), Bk # Bk # ires, <am> @ Bk\<up>k)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3897
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3898
  apply(drule_tac n = stp in crsp_steps, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3899
  apply(rule_tac x = stpa in exI)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3900
  apply(case_tac "steps (Suc 0, l, r) (tm_of ap, 0) stpa", simp add: crsp.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3901
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3902
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3903
text{*The tp @ [(Nop, 0), (Nop, 0)] is nomoral turing machines, so we can use Hoare_plus when composing with Mop machine*}
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3904
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3905
thm layout_of.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3906
lemma layout_id_cons: "layout_of (ap @ [p]) = layout_of ap @ [length_of p]"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3907
apply(simp add: layout_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3908
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3909
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3910
lemma [simp]: "length (layout_of xs) = length xs"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3911
by(simp add: layout_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3912
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3913
thm tms_of.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3914
term ci
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3915
thm tms_of.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3916
thm tpairs_of.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3917
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3918
lemma [simp]:  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3919
  "map (start_of (layout_of xs @ [length_of x])) [0..<length xs] =  (map (start_of (layout_of xs)) [0..<length xs])"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3920
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3921
apply(simp add: layout_of.simps start_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3922
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3923
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3924
lemma tpairs_id_cons: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3925
  "tpairs_of (xs @ [x]) = tpairs_of xs @ [(start_of (layout_of (xs @ [x])) (length xs), x)]"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3926
apply(auto simp: tpairs_of.simps layout_id_cons )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3927
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3928
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3929
lemma map_length_ci:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3930
  "(map (length \<circ> (\<lambda>(xa, y). ci (layout_of xs @ [length_of x]) xa y)) (tpairs_of xs)) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3931
  (map (length \<circ> (\<lambda>(x, y). ci (layout_of xs) x y)) (tpairs_of xs)) "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3932
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3933
apply(case_tac b, auto simp: ci.simps sete.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3934
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3935
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3936
lemma length_tp'[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3937
  "\<lbrakk>ly = layout_of ap; tp = tm_of ap\<rbrakk> \<Longrightarrow>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3938
       length tp = 2 * listsum (take (length ap) (layout_of ap))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3939
proof(induct ap arbitrary: ly tp rule: rev_induct)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3940
  case Nil
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3941
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3942
    by(simp add: tms_of.simps tm_of.simps tpairs_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3943
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3944
  fix x xs ly tp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3945
  assume ind: "\<And>ly tp. \<lbrakk>ly = layout_of xs; tp = tm_of xs\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3946
    length tp = 2 * listsum (take (length xs) (layout_of xs))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3947
  and layout: "ly = layout_of (xs @ [x])"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3948
  and tp: "tp = tm_of (xs @ [x])"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3949
  obtain ly' where a: "ly' = layout_of xs"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3950
    by metis
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3951
  obtain tp' where b: "tp' = tm_of xs"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3952
    by metis
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3953
  have c: "length tp' = 2 * listsum (take (length xs) (layout_of xs))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3954
    using a b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3955
    by(erule_tac ind, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3956
  thus "length tp = 2 * 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3957
    listsum (take (length (xs @ [x])) (layout_of (xs @ [x])))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3958
    using tp b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3959
    apply(auto simp: layout_id_cons tm_of.simps tms_of.simps length_concat tpairs_id_cons map_length_ci)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3960
    apply(case_tac x)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3961
    apply(auto simp: ci.simps tinc_b_def tdec_b_def length_findnth sete.simps length_of.simps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3962
                 split: abc_inst.splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3963
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3964
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3965
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3966
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3967
  "\<lbrakk>ly = layout_of ap; tp = tm_of ap\<rbrakk> \<Longrightarrow>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3968
        fetch (tp @ [(Nop, 0), (Nop, 0)]) (start_of ly (length ap)) b = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3969
       (Nop, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3970
apply(case_tac b)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3971
apply(simp_all add: start_of.simps fetch.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3972
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3973
(*
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3974
lemma tp_correct: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3975
  assumes layout: "ly = layout_of ap"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3976
  and compile: "tp = tm_of ap"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3977
  and crsp: "crsp ly (0, lm) (Suc 0, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3978
  and abc_halt: "abc_steps_l (0, lm) ap stp = (length ap, am)"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3979
  shows "\<exists> stp k. steps (Suc 0, l, r) (tp @ [(Nop, 0), (Nop, 0)], 0) stp = (0, Bk # Bk # ires, <am> @ Bk\<up>k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3980
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3981
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3982
  have "\<exists> stp k. steps (Suc 0, l, r) (tp @ [(Nop, 0), (Nop, 0)], 0) stp =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3983
    (start_of ly (length ap), Bk # Bk # ires, <am> @ Bk\<up>k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3984
  proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3985
    have "\<exists> stp k. steps (Suc 0, l, r) (tp, 0) stp =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3986
    (start_of ly (length ap), Bk # Bk # ires, <am> @ Bk\<up>k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3987
      using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3988
      apply(rule_tac tp_correct', simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3989
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3990
    from this obtain stp k where "steps (Suc 0, l, r) (tp, 0) stp =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3991
    (start_of ly (length ap), Bk # Bk # ires, <am> @ Bk\<up>k)" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3992
    thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3993
      apply(rule_tac x = stp in exI, rule_tac x = k in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3994
      apply(drule_tac tm_append_first_steps_eq, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3995
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3996
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3997
  from this obtain stp k where 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3998
    "steps (Suc 0, l, r) (tp @ [(Nop, 0), (Nop, 0)], 0) stp =
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3999
    (start_of ly (length ap), Bk # Bk # ires, <am> @ Bk\<up>k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4000
    by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4001
  thus "\<exists>stp k. steps (Suc 0, l, r) (tp @ [(Nop, 0), (Nop, 0)], 0) stp 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4002
    = (0, Bk # Bk # ires, <am> @ Bk \<up> k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4003
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4004
    apply(rule_tac x = "stp + Suc 0" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4005
    apply(simp add: steps_add)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4006
    apply(auto simp: step.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4007
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4008
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4009
 *)   
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4010
(********for mopup***********)
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4011
fun mopup_a :: "nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4012
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4013
  "mopup_a 0 = []" |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4014
  "mopup_a (Suc n) = mopup_a n @ 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4015
       [(R, 2*n + 3), (W0, 2*n + 2), (R, 2*n + 1), (W1, 2*n + 2)]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4016
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4017
definition mopup_b :: "instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4018
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4019
  "mopup_b \<equiv> [(R, 2), (R, 1), (L, 5), (W0, 3), (R, 4), (W0, 3),
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4020
            (R, 2), (W0, 3), (L, 5), (L, 6), (R, 0), (L, 6)]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4021
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4022
fun mopup :: "nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4023
  where 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4024
  "mopup n = mopup_a n @ shift mopup_b (2*n)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4025
(****)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4026
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4027
type_synonym mopup_type = "config \<Rightarrow> nat list \<Rightarrow> nat \<Rightarrow> cell list \<Rightarrow> bool"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4028
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4029
fun mopup_stop :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4030
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4031
  "mopup_stop (s, l, r) lm n ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4032
        (\<exists> ln rn. l = Bk\<up>ln @ Bk # Bk # ires \<and> r = <abc_lm_v lm n> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4033
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4034
fun mopup_bef_erase_a :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4035
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4036
  "mopup_bef_erase_a (s, l, r) lm n ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4037
         (\<exists> ln m rn. l = Bk\<up>ln @ Bk # Bk # ires \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4038
                  r = Oc\<up>m@ Bk # <(drop ((s + 1) div 2) lm)> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4039
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4040
fun mopup_bef_erase_b :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4041
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4042
  "mopup_bef_erase_b (s, l, r) lm n ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4043
      (\<exists> ln m rn. l = Bk\<up>ln @ Bk # Bk # ires \<and> r = Bk # Oc\<up>m @ Bk # 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4044
                                      <(drop (s div 2) lm)> @ Bk\<up>rn)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4045
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4046
fun mopup_jump_over1 :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4047
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4048
  "mopup_jump_over1 (s, l, r) lm n ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4049
      (\<exists> ln m1 m2 rn. m1 + m2 = Suc (abc_lm_v lm n) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4050
        l = Oc\<up>m1 @ Bk\<up>ln @ Bk # Bk # ires \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4051
     (r = Oc\<up>m2 @ Bk # <(drop (Suc n) lm)> @ Bk\<up>rn \<or> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4052
     (r = Oc\<up>m2 \<and> (drop (Suc n) lm) = [])))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4053
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4054
fun mopup_aft_erase_a :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4055
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4056
  "mopup_aft_erase_a (s, l, r) lm n ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4057
      (\<exists> lnl lnr rn (ml::nat list) m. 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4058
          m = Suc (abc_lm_v lm n) \<and> l = Bk\<up>lnr @ Oc\<up>m @ Bk\<up>lnl @ Bk # Bk # ires \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4059
                                   (r = <ml> @ Bk\<up>rn))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4060
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4061
fun mopup_aft_erase_b :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4062
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4063
  "mopup_aft_erase_b (s, l, r) lm n ires= 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4064
   (\<exists> lnl lnr rn (ml::nat list) m. 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4065
      m = Suc (abc_lm_v lm n) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4066
      l = Bk\<up>lnr @ Oc\<up>m @ Bk\<up>lnl @ Bk # Bk # ires \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4067
     (r = Bk # <ml> @ Bk\<up>rn \<or>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4068
      r = Bk # Bk # <ml> @ Bk\<up>rn))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4069
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4070
fun mopup_aft_erase_c :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4071
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4072
  "mopup_aft_erase_c (s, l, r) lm n ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4073
 (\<exists> lnl lnr rn (ml::nat list) m. 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4074
     m = Suc (abc_lm_v lm n) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4075
     l = Bk\<up>lnr @ Oc\<up>m @ Bk\<up>lnl @ Bk # Bk # ires \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4076
    (r = <ml> @ Bk\<up>rn \<or> r = Bk # <ml> @ Bk\<up>rn))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4077
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4078
fun mopup_left_moving :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4079
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4080
  "mopup_left_moving (s, l, r) lm n ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4081
  (\<exists> lnl lnr rn m.
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4082
     m = Suc (abc_lm_v lm n) \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4083
   ((l = Bk\<up>lnr @ Oc\<up>m @ Bk\<up>lnl @ Bk # Bk # ires \<and> r = Bk\<up>rn) \<or>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4084
    (l = Oc\<up>(m - 1) @ Bk\<up>lnl @ Bk # Bk # ires \<and> r = Oc # Bk\<up>rn)))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4085
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4086
fun mopup_jump_over2 :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4087
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4088
  "mopup_jump_over2 (s, l, r) lm n ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4089
     (\<exists> ln rn m1 m2.
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4090
          m1 + m2 = Suc (abc_lm_v lm n) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4091
        \<and> r \<noteq> [] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4092
        \<and> (hd r = Oc \<longrightarrow> (l = Oc\<up>m1 @ Bk\<up>ln @ Bk # Bk # ires \<and> r = Oc\<up>m2 @ Bk\<up>rn)) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4093
        \<and> (hd r = Bk \<longrightarrow> (l = Bk\<up>ln @ Bk # ires \<and> r = Bk # Oc\<up>(m1+m2)@ Bk\<up>rn)))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4094
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4095
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4096
fun mopup_inv :: "mopup_type"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4097
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4098
  "mopup_inv (s, l, r) lm n ires = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4099
      (if s = 0 then mopup_stop (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4100
       else if s \<le> 2*n then
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4101
               if s mod 2 = 1 then mopup_bef_erase_a (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4102
                   else mopup_bef_erase_b (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4103
            else if s = 2*n + 1 then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4104
                mopup_jump_over1 (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4105
            else if s = 2*n + 2 then mopup_aft_erase_a (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4106
            else if s = 2*n + 3 then mopup_aft_erase_b (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4107
            else if s = 2*n + 4 then mopup_aft_erase_c (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4108
            else if s = 2*n + 5 then mopup_left_moving (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4109
            else if s = 2*n + 6 then mopup_jump_over2 (s, l, r) lm n ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4110
            else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4111
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4112
lemma mopup_fetch_0[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4113
     "(fetch (mopup_a n @ shift mopup_b (2 * n)) 0 b) = (Nop, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4114
by(simp add: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4115
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4116
lemma mop_bef_length[simp]: "length (mopup_a n) = 4 * n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4117
apply(induct n, simp_all add: mopup_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4118
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4119
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4120
lemma mopup_a_nth: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4121
  "\<lbrakk>q < n; x < 4\<rbrakk> \<Longrightarrow> mopup_a n ! (4 * q + x) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4122
                             mopup_a (Suc q) ! ((4 * q) + x)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4123
apply(induct n, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4124
apply(case_tac "q < n", simp add: mopup_a.simps, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4125
apply(simp add: nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4126
apply(subgoal_tac "q = n", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4127
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4128
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4129
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4130
lemma fetch_bef_erase_a_o[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4131
 "\<lbrakk>0 < s; s \<le> 2 * n; s mod 2 = Suc 0\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4132
  \<Longrightarrow> (fetch (mopup_a n @ shift mopup_b (2 * n)) s Oc) = (W0, s + 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4133
apply(subgoal_tac "\<exists> q. s = 2*q + 1", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4134
apply(subgoal_tac "length (mopup_a n) = 4*n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4135
apply(auto simp: fetch.simps nth_of.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4136
apply(subgoal_tac "mopup_a n ! (4 * q + 1) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4137
                      mopup_a (Suc q) ! ((4 * q) + 1)", 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4138
      simp add: mopup_a.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4139
apply(rule mopup_a_nth, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4140
apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4141
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4142
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4143
lemma fetch_bef_erase_a_b[simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4144
  "\<lbrakk>0 < s; s \<le> 2 * n; s mod 2 = Suc 0\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4145
   \<Longrightarrow>  (fetch (mopup_a n @ shift mopup_b (2 * n)) s Bk) = (R, s + 2)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4146
apply(subgoal_tac "\<exists> q. s = 2*q + 1", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4147
apply(subgoal_tac "length (mopup_a n) = 4*n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4148
apply(auto simp: fetch.simps nth_of.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4149
apply(subgoal_tac "mopup_a n ! (4 * q + 0) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4150
                       mopup_a (Suc q) ! ((4 * q + 0))", 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4151
      simp add: mopup_a.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4152
apply(rule mopup_a_nth, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4153
apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4154
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4155
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4156
lemma fetch_bef_erase_b_b: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4157
  "\<lbrakk>n < length lm; 0 < s; s \<le> 2 * n; s mod 2 = 0\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4158
     (fetch (mopup_a n @ shift mopup_b (2 * n)) s Bk) = (R, s - 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4159
apply(subgoal_tac "\<exists> q. s = 2 * q", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4160
apply(case_tac qa, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4161
apply(auto simp: fetch.simps nth_of.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4162
apply(subgoal_tac "mopup_a n ! (4 * nat + 2) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4163
                     mopup_a (Suc nat) ! ((4 * nat) + 2)", 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4164
      simp add: mopup_a.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4165
apply(rule mopup_a_nth, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4166
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4167
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4168
lemma fetch_jump_over1_o: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4169
 "fetch (mopup_a n @ shift mopup_b (2 * n)) (Suc (2 * n)) Oc
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4170
  = (R, Suc (2 * n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4171
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4172
apply(auto simp: fetch.simps nth_of.simps mopup_b_def nth_append 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4173
                 shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4174
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4175
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4176
lemma fetch_jump_over1_b: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4177
 "fetch (mopup_a n @ shift mopup_b (2 * n)) (Suc (2 * n)) Bk 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4178
 = (R, Suc (Suc (2 * n)))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4179
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4180
apply(auto simp: fetch.simps nth_of.simps mopup_b_def 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4181
                 nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4182
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4183
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4184
lemma fetch_aft_erase_a_o: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4185
 "fetch (mopup_a n @ shift mopup_b (2 * n)) (Suc (Suc (2 * n))) Oc 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4186
 = (W0, Suc (2 * n + 2))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4187
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4188
apply(auto simp: fetch.simps nth_of.simps mopup_b_def 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4189
                 nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4190
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4191
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4192
lemma fetch_aft_erase_a_b: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4193
 "fetch (mopup_a n @ shift mopup_b (2 * n)) (Suc (Suc (2 * n))) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4194
  = (L, Suc (2 * n + 4))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4195
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4196
apply(auto simp: fetch.simps nth_of.simps mopup_b_def 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4197
                 nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4198
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4199
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4200
lemma fetch_aft_erase_b_b: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4201
 "fetch (mopup_a n @ shift mopup_b (2 * n)) (2*n + 3) Bk
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4202
  = (R, Suc (2 * n + 3))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4203
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4204
apply(subgoal_tac "2*n + 3 = Suc (2*n + 2)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4205
apply(auto simp: nth_of.simps mopup_b_def nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4206
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4207
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4208
lemma fetch_aft_erase_c_o: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4209
 "fetch (mopup_a n @ shift mopup_b (2 * n)) (2 * n + 4) Oc 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4210
 = (W0, Suc (2 * n + 2))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4211
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4212
apply(subgoal_tac "2*n + 4 = Suc (2*n + 3)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4213
apply(auto simp: nth_of.simps mopup_b_def nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4214
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4215
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4216
lemma fetch_aft_erase_c_b: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4217
 "fetch (mopup_a n @ shift mopup_b (2 * n)) (2 * n + 4) Bk 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4218
 = (R, Suc (2 * n + 1))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4219
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4220
apply(subgoal_tac "2*n + 4 = Suc (2*n + 3)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4221
apply(auto simp: nth_of.simps mopup_b_def nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4222
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4223
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4224
lemma fetch_left_moving_o: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4225
 "(fetch (mopup_a n @ shift mopup_b (2 * n)) (2 * n + 5) Oc) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4226
 = (L, 2*n + 6)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4227
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4228
apply(subgoal_tac "2*n + 5 = Suc (2*n + 4)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4229
apply(auto simp: nth_of.simps mopup_b_def nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4230
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4231
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4232
lemma fetch_left_moving_b: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4233
 "(fetch (mopup_a n @ shift mopup_b (2 * n)) (2 * n + 5) Bk)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4234
  = (L, 2*n + 5)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4235
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4236
apply(subgoal_tac "2*n + 5 = Suc (2*n + 4)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4237
apply(auto simp: nth_of.simps mopup_b_def nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4238
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4239
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4240
lemma fetch_jump_over2_b:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4241
  "(fetch (mopup_a n @ shift mopup_b (2 * n)) (2 * n + 6) Bk) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4242
 = (R, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4243
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4244
apply(subgoal_tac "2*n + 6 = Suc (2*n + 5)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4245
apply(auto simp: nth_of.simps mopup_b_def nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4246
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4247
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4248
lemma fetch_jump_over2_o: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4249
"(fetch (mopup_a n @ shift mopup_b (2 * n)) (2 * n + 6) Oc) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4250
 = (L, 2*n + 6)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4251
apply(subgoal_tac "length (mopup_a n) = 4 * n")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4252
apply(subgoal_tac "2*n + 6 = Suc (2*n + 5)", simp only: fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4253
apply(auto simp: nth_of.simps mopup_b_def nth_append shift.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4254
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4255
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4256
lemmas mopupfetchs = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4257
fetch_bef_erase_a_o fetch_bef_erase_a_b fetch_bef_erase_b_b 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4258
fetch_jump_over1_o fetch_jump_over1_b fetch_aft_erase_a_o 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4259
fetch_aft_erase_a_b fetch_aft_erase_b_b fetch_aft_erase_c_o 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4260
fetch_aft_erase_c_b fetch_left_moving_o fetch_left_moving_b 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4261
fetch_jump_over2_b fetch_jump_over2_o
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4262
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4263
declare 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4264
  mopup_jump_over2.simps[simp del] mopup_left_moving.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4265
  mopup_aft_erase_c.simps[simp del] mopup_aft_erase_b.simps[simp del] 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4266
  mopup_aft_erase_a.simps[simp del] mopup_jump_over1.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4267
  mopup_bef_erase_a.simps[simp del] mopup_bef_erase_b.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4268
  mopup_stop.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4269
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4270
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4271
  "\<lbrakk>mopup_bef_erase_a (s, l, Oc # xs) lm n ires\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4272
  mopup_bef_erase_b (Suc s, l, Bk # xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4273
apply(auto simp: mopup_bef_erase_a.simps mopup_bef_erase_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4274
apply(rule_tac x = "m - 1" in exI, rule_tac x = rn in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4275
apply(case_tac m, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4276
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4277
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4278
lemma mopup_false1:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4279
  "\<lbrakk>0 < s; s \<le> 2 * n; s mod 2 = Suc 0;  \<not> Suc s \<le> 2 * n\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4280
  \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4281
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4282
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4283
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4284
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4285
 "\<lbrakk>n < length lm; 0 < s; s \<le> 2 * n; s mod 2 = Suc 0; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4286
   mopup_bef_erase_a (s, l, Oc # xs) lm n ires; r = Oc # xs\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4287
 \<Longrightarrow> (Suc s \<le> 2 * n \<longrightarrow> mopup_bef_erase_b (Suc s, l, Bk # xs) lm n ires)  \<and>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4288
     (\<not> Suc s \<le> 2 * n \<longrightarrow> mopup_jump_over1 (Suc s, l, Bk # xs) lm n ires) "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4289
apply(auto elim: mopup_false1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4290
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4291
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4292
lemma drop_tape_of_cons: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4293
  "\<lbrakk>Suc q < length lm; x = lm ! q\<rbrakk> \<Longrightarrow> <drop q lm> = Oc # Oc \<up> x @ Bk # <drop (Suc q) lm>"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4294
by (metis Suc_lessD append_Cons list.simps(2) nth_drop' replicate_Suc tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4295
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4296
lemma erase2jumpover1:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4297
  "\<lbrakk>q < length list; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4298
             \<forall>rn. <drop q list> \<noteq> Oc # Oc \<up> abc_lm_v (a # list) (Suc q) @ Bk # <drop (Suc q) list> @ Bk \<up> rn\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4299
       \<Longrightarrow> <drop q list> = Oc # Oc \<up> abc_lm_v (a # list) (Suc q)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4300
apply(erule_tac x = 0 in allE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4301
apply(case_tac "Suc q < length list")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4302
apply(erule_tac notE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4303
apply(rule_tac drop_tape_of_cons, simp_all add: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4304
apply(subgoal_tac "length list = Suc q", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4305
apply(subgoal_tac "drop q list = [list ! q]")
101
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4306
apply(simp add: tape_of_nl_abv tape_of_nat_abv)
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4307
by (metis append_Nil2 append_eq_conv_conj drop_Suc_conv_tl lessI)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4308
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4309
lemma erase2jumpover2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4310
  "\<lbrakk>q < length list; \<forall>rn. <drop q list> @ Bk # Bk \<up> n \<noteq>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4311
  Oc # Oc \<up> abc_lm_v (a # list) (Suc q) @ Bk # <drop (Suc q) list> @ Bk \<up> rn\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4312
  \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4313
apply(case_tac "Suc q < length list")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4314
apply(erule_tac x = "Suc n" in allE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4315
apply(erule_tac notE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4316
apply(rule_tac drop_tape_of_cons, simp_all add: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4317
apply(subgoal_tac "length list = Suc q", auto)
101
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4318
apply(erule_tac x = "n" in allE, simp add: tape_of_nl_abv)
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4319
by (metis append_Nil2 append_eq_conv_conj drop_Suc_conv_tl lessI replicate_Suc tape_of_nl_abv tape_of_nl_cons)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4320
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4321
lemma mopup_bef_erase_a_2_jump_over[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4322
 "\<lbrakk>n < length lm; 0 < s; s mod 2 = Suc 0;  s \<le> 2 * n;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4323
   mopup_bef_erase_a (s, l, Bk # xs) lm n ires; \<not> (Suc (Suc s) \<le> 2 * n)\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4324
\<Longrightarrow> mopup_jump_over1 (s', Bk # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4325
apply(auto simp: mopup_bef_erase_a.simps mopup_jump_over1.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4326
apply(case_tac m, auto simp: mod_ex1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4327
apply(subgoal_tac "n = Suc q", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4328
apply(rule_tac x = "Suc ln" in exI, rule_tac x = 0 in exI, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4329
apply(case_tac [!] lm, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4330
apply(case_tac [!] rn, auto elim: erase2jumpover1 erase2jumpover2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4331
apply(erule_tac x = 0 in allE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4332
apply(rule_tac classical, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4333
apply(erule_tac notE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4334
apply(rule_tac drop_tape_of_cons, simp_all add: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4335
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4336
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4337
lemma Suc_Suc_div:  "\<lbrakk>0 < s; s mod 2 = Suc 0; Suc (Suc s) \<le> 2 * n\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4338
           \<Longrightarrow> (Suc (Suc (s div 2))) \<le> n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4339
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4340
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4341
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4342
lemma mopup_bef_erase_a_2_a[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4343
 "\<lbrakk>n < length lm; 0 < s; s mod 2 = Suc 0; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4344
   mopup_bef_erase_a (s, l, Bk # xs) lm n ires; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4345
   Suc (Suc s) \<le> 2 * n\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4346
   mopup_bef_erase_a (Suc (Suc s), Bk # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4347
apply(auto simp: mopup_bef_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4348
apply(subgoal_tac "drop (Suc (Suc (s div 2))) lm \<noteq> []")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4349
apply(case_tac m, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4350
apply(rule_tac x = "Suc (abc_lm_v lm (Suc (s div 2)))" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4351
      rule_tac x = rn in exI, auto simp: mod_ex1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4352
apply(rule_tac drop_tape_of_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4353
apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4354
apply(simp add: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4355
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4356
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4357
lemma mopup_false2: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4358
 "\<lbrakk>0 < s; s \<le> 2 * n; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4359
   s mod 2 = Suc 0; Suc s \<noteq> 2 * n;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4360
   \<not> Suc (Suc s) \<le> 2 * n\<rbrakk> \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4361
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4362
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4363
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4364
lemma [simp]: "mopup_bef_erase_a (s, l, []) lm n ires \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4365
                        mopup_bef_erase_a (s, l, [Bk]) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4366
apply(auto simp: mopup_bef_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4367
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4368
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4369
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4370
   "\<lbrakk>n < length lm; 0 < s; s \<le> 2 * n; s mod 2 = Suc 0; \<not> Suc (Suc s) \<le> 2 *n;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4371
     mopup_bef_erase_a (s, l, []) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4372
    \<Longrightarrow>  mopup_jump_over1 (s', Bk # l, []) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4373
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4374
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4375
lemma "mopup_bef_erase_b (s, l, Oc # xs) lm n ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4376
apply(auto simp: mopup_bef_erase_b.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4377
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4378
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4379
lemma [simp]: "mopup_bef_erase_b (s, l, Oc # xs) lm n ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4380
apply(auto simp: mopup_bef_erase_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4381
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4382
 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4383
lemma [simp]: "\<lbrakk>0 < s; s \<le> 2 *n; s mod 2 \<noteq> Suc 0\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4384
                                      (s - Suc 0) mod 2 = Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4385
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4386
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4387
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4388
lemma [simp]: "\<lbrakk>0 < s; s \<le> 2 *n; s mod 2 \<noteq> Suc 0\<rbrakk> \<Longrightarrow>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4389
                                       s - Suc 0 \<le> 2 * n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4390
apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4391
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4392
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4393
lemma [simp]: "\<lbrakk>0 < s; s \<le> 2 *n; s mod 2 \<noteq> Suc 0\<rbrakk> \<Longrightarrow> \<not> s \<le> Suc 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4394
apply(arith)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4395
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4396
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4397
lemma [simp]: "\<lbrakk>n < length lm; 0 < s; s \<le> 2 * n; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4398
               s mod 2 \<noteq> Suc 0; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4399
               mopup_bef_erase_b (s, l, Bk # xs) lm n ires; r = Bk # xs\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4400
           \<Longrightarrow> mopup_bef_erase_a (s - Suc 0, Bk # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4401
apply(auto simp: mopup_bef_erase_b.simps mopup_bef_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4402
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4403
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4404
lemma [simp]: "\<lbrakk>mopup_bef_erase_b (s, l, []) lm n ires\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4405
                   mopup_bef_erase_a (s - Suc 0, Bk # l, []) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4406
apply(auto simp: mopup_bef_erase_b.simps mopup_bef_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4407
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4408
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4409
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4410
   "\<lbrakk>n < length lm;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4411
    mopup_jump_over1 (Suc (2 * n), l, Oc # xs) lm n ires;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4412
    r = Oc # xs\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4413
  \<Longrightarrow> mopup_jump_over1 (Suc (2 * n), Oc # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4414
apply(auto simp: mopup_jump_over1.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4415
apply(rule_tac x = ln in exI, rule_tac x = "Suc m1" in exI,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4416
       rule_tac x = "m2 - 1" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4417
apply(case_tac "m2", simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4418
apply(rule_tac x = ln in exI, rule_tac x = "Suc m1" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4419
      rule_tac x = "m2 - 1" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4420
apply(case_tac m2, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4421
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4422
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4423
lemma mopup_jump_over1_2_aft_erase_a[simp]:  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4424
 "\<lbrakk>n < length lm; mopup_jump_over1 (Suc (2 * n), l, Bk # xs) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4425
  \<Longrightarrow> mopup_aft_erase_a (Suc (Suc (2 * n)), Bk # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4426
apply(simp only: mopup_jump_over1.simps mopup_aft_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4427
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4428
apply(rule_tac x = ln in exI, rule_tac x = "Suc 0" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4429
apply(case_tac m2, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4430
apply(rule_tac x = rn in exI, rule_tac x = "drop (Suc n) lm" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4431
      simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4432
apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4433
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4434
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4435
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4436
 "\<lbrakk>n < length lm; mopup_jump_over1 (Suc (2 * n), l, []) lm n ires\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4437
    mopup_aft_erase_a (Suc (Suc (2 * n)), Bk # l, []) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4438
apply(rule mopup_jump_over1_2_aft_erase_a, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4439
apply(auto simp: mopup_jump_over1.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4440
apply(rule_tac x = ln in exI, rule_tac x = "Suc (abc_lm_v lm n)" in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4441
      rule_tac x = 0 in exI, simp add: )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4442
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4443
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4444
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4445
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4446
 "\<lbrakk>n < length lm; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4447
   mopup_aft_erase_a (Suc (Suc (2 * n)), l, Oc # xs) lm n ires\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4448
 \<Longrightarrow> mopup_aft_erase_b (Suc (Suc (Suc (2 * n))), l, Bk # xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4449
apply(auto simp: mopup_aft_erase_a.simps mopup_aft_erase_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4450
apply(case_tac ml)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4451
apply(simp_all add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4452
apply(case_tac a, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4453
apply(rule_tac x = rn in exI, rule_tac x = "[]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4454
apply(rule_tac x = rn in exI, rule_tac x = "[nat]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4455
apply(case_tac a, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4456
apply(rule_tac x = rn in exI, rule_tac x = "list" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4457
apply(rule_tac x = rn in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4458
apply(rule_tac x = "nat # list" in exI, simp add: tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4459
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4460
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4461
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4462
  "mopup_aft_erase_a (Suc (Suc (2 * n)), l, Bk # xs) lm n ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4463
apply(auto simp: mopup_aft_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4464
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4465
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4466
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4467
  "\<lbrakk>n < length lm;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4468
    mopup_aft_erase_a (Suc (Suc (2 * n)), l, Bk # xs) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4469
  \<Longrightarrow> mopup_left_moving (5 + 2 * n, tl l, hd l # Bk # xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4470
apply(simp only: mopup_aft_erase_a.simps mopup_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4471
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4472
apply(case_tac lnr, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4473
apply(case_tac ml, simp, simp add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4474
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4475
apply(case_tac ml, simp_all add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4476
apply(rule_tac x = "Suc rn" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4477
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4478
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4479
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4480
  "mopup_aft_erase_a (Suc (Suc (2 * n)), l, []) lm n ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4481
apply(simp only: mopup_aft_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4482
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4483
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4484
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4485
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4486
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4487
  "\<lbrakk>n < length lm; mopup_aft_erase_a (Suc (Suc (2 * n)), l, []) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4488
  \<Longrightarrow> mopup_left_moving (5 + 2 * n, tl l, [hd l]) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4489
apply(simp only: mopup_aft_erase_a.simps mopup_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4490
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4491
apply(subgoal_tac "ml = [] \<and> rn = 0", erule conjE, erule conjE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4492
apply(case_tac lnr, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4493
apply(rule_tac x = lnl in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4494
apply(rule_tac x = 1 in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4495
apply(case_tac ml, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4496
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4497
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4498
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4499
lemma [simp]: "mopup_aft_erase_b (2 * n + 3, l, Oc # xs) lm n ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4500
apply(auto simp: mopup_aft_erase_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4501
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4502
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4503
lemma tape_of_ex1[intro]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4504
  "\<exists>rna ml. Oc \<up> a @ Bk \<up> rn = <ml::nat list> @ Bk \<up> rna \<or> Oc \<up> a @ Bk \<up> rn = Bk # <ml> @ Bk \<up> rna"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4505
apply(case_tac a, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4506
apply(rule_tac x = rn in exI, rule_tac x = "[]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4507
apply(rule_tac x = rn in exI, rule_tac x = "[nat]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4508
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4509
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4510
lemma [intro]: "\<exists>rna ml. Oc \<up> a @ Bk # <list::nat list> @ Bk \<up> rn = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4511
  <ml> @ Bk \<up> rna \<or> Oc \<up> a @ Bk # <list> @ Bk \<up> rn = Bk # <ml::nat list> @ Bk \<up> rna"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4512
apply(case_tac "list = []", simp add: replicate_Suc[THEN sym] del: replicate_Suc)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4513
apply(rule_tac rn = "Suc rn" in tape_of_ex1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4514
apply(case_tac a, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4515
apply(rule_tac x = rn in exI, rule_tac x = list in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4516
apply(rule_tac x = rn in exI, rule_tac x = "nat # list" in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4517
apply(simp add: tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4518
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4519
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4520
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4521
 "\<lbrakk>n < length lm; 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4522
   mopup_aft_erase_c (2 * n + 4, l, Oc # xs) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4523
  \<Longrightarrow> mopup_aft_erase_b (Suc (Suc (Suc (2 * n))), l, Bk # xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4524
apply(auto simp: mopup_aft_erase_c.simps mopup_aft_erase_b.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4525
apply(case_tac ml, simp_all add: tape_of_nl_cons split: if_splits, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4526
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4527
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4528
lemma mopup_aft_erase_c_aft_erase_a[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4529
 "\<lbrakk>n < length lm; mopup_aft_erase_c (2 * n + 4, l, Bk # xs) lm n ires\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4530
 \<Longrightarrow> mopup_aft_erase_a (Suc (Suc (2 * n)), Bk # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4531
apply(simp only: mopup_aft_erase_c.simps mopup_aft_erase_a.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4532
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4533
apply(erule conjE, erule conjE, erule disjE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4534
apply(subgoal_tac "ml = []", simp, case_tac rn, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4535
      simp, simp, rule conjI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4536
apply(rule_tac x = lnl in exI, rule_tac x = "Suc lnr" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4537
apply(rule_tac x = nat in exI, rule_tac x = "[]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4538
apply(case_tac ml, simp, simp add: tape_of_nl_cons split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4539
apply(rule_tac x = lnl in exI, rule_tac x = "Suc lnr" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4540
apply(rule_tac x = rn in exI, rule_tac x = "ml" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4541
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4542
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4543
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4544
 "\<lbrakk>n < length lm; mopup_aft_erase_c (2 * n + 4, l, []) lm n ires\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4545
 \<Longrightarrow> mopup_aft_erase_a (Suc (Suc (2 * n)), Bk # l, []) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4546
apply(rule mopup_aft_erase_c_aft_erase_a, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4547
apply(simp only: mopup_aft_erase_c.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4548
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4549
apply(rule_tac x = lnl in exI, rule_tac x = lnr in exI, simp add: )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4550
apply(rule_tac x = 0 in exI, rule_tac x = "[]" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4551
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4552
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4553
lemma mopup_aft_erase_b_2_aft_erase_c[simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4554
  "\<lbrakk>n < length lm; mopup_aft_erase_b (2 * n + 3, l, Bk # xs) lm n ires\<rbrakk>  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4555
 \<Longrightarrow> mopup_aft_erase_c (4 + 2 * n, Bk # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4556
apply(auto simp: mopup_aft_erase_b.simps mopup_aft_erase_c.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4557
apply(rule_tac x = "lnl" in exI, rule_tac x = "Suc lnr" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4558
apply(rule_tac x = "lnl" in exI, rule_tac x = "Suc lnr" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4559
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4560
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4561
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4562
 "\<lbrakk>n < length lm; mopup_aft_erase_b (2 * n + 3, l, []) lm n ires\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4563
 \<Longrightarrow> mopup_aft_erase_c (4 + 2 * n, Bk # l, []) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4564
apply(rule_tac mopup_aft_erase_b_2_aft_erase_c, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4565
apply(simp add: mopup_aft_erase_b.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4566
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4567
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4568
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4569
    "mopup_left_moving (2 * n + 5, l, Oc # xs) lm n ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4570
apply(auto simp: mopup_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4571
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4572
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4573
lemma [simp]:  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4574
 "\<lbrakk>n < length lm; mopup_left_moving (2 * n + 5, l, Oc # xs) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4575
  \<Longrightarrow> mopup_jump_over2 (2 * n + 6, tl l, hd l # Oc # xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4576
apply(simp only: mopup_left_moving.simps mopup_jump_over2.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4577
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4578
apply(erule conjE, erule disjE, erule conjE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4579
apply(case_tac rn, simp, simp add: )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4580
apply(case_tac "hd l", simp add:  )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4581
apply(case_tac "abc_lm_v lm n", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4582
apply(rule_tac x = "lnl" in exI, rule_tac x = rn in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4583
      rule_tac x = "Suc 0" in exI, rule_tac x = 0 in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4584
apply(case_tac lnl, simp, simp, simp add: exp_ind[THEN sym], simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4585
apply(case_tac "abc_lm_v lm n", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4586
apply(case_tac lnl, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4587
apply(rule_tac x = lnl in exI, rule_tac x = rn in exI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4588
apply(rule_tac x = nat in exI, rule_tac x = "Suc (Suc 0)" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4589
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4590
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4591
lemma [simp]: "mopup_left_moving (2 * n + 5, l, xs) lm n ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4592
apply(auto simp: mopup_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4593
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4594
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4595
lemma [simp]:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4596
  "\<lbrakk>n < length lm; mopup_left_moving (2 * n + 5, l, Bk # xs) lm n ires\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4597
 \<Longrightarrow> mopup_left_moving (2 * n + 5, tl l, hd l # Bk # xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4598
apply(simp only: mopup_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4599
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4600
apply(case_tac lnr, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4601
apply(rule_tac x = lnl in exI, rule_tac x = nat in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4602
apply(rule_tac x = "Suc rn" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4603
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4604
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4605
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4606
"\<lbrakk>n < length lm; mopup_left_moving (2 * n + 5, l, []) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4607
    \<Longrightarrow> mopup_left_moving (2 * n + 5, tl l, [hd l]) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4608
apply(simp only: mopup_left_moving.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4609
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4610
apply(case_tac lnr, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4611
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4612
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4613
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4614
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4615
 "mopup_jump_over2 (2 * n + 6, l, Oc # xs) lm n ires \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4616
apply(auto simp: mopup_jump_over2.simps )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4617
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4618
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4619
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4620
"\<lbrakk>n < length lm; mopup_jump_over2 (2 * n + 6, l, Oc # xs) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4621
 \<Longrightarrow>  mopup_jump_over2 (2 * n + 6, tl l, hd l # Oc # xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4622
apply(simp only: mopup_jump_over2.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4623
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4624
apply(simp add:  , erule conjE, erule_tac conjE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4625
apply(case_tac m1, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4626
apply(rule_tac x = ln in exI, rule_tac x = rn in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4627
      rule_tac x = 0 in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4628
apply(case_tac ln, simp, simp, simp only: exp_ind[THEN sym], simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4629
apply(rule_tac x = ln in exI, rule_tac x = rn in exI, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4630
      rule_tac x = nat in exI, rule_tac x = "Suc m2" in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4631
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4632
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4633
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4634
 "\<lbrakk>n < length lm; mopup_jump_over2 (2 * n + 6, l, Bk # xs) lm n ires\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4635
  \<Longrightarrow> mopup_stop (0, Bk # l, xs) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4636
apply(auto simp: mopup_jump_over2.simps mopup_stop.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4637
apply(simp_all add: tape_of_nat_abv exp_ind[THEN sym])
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4638
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4639
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4640
lemma [simp]: "mopup_jump_over2 (2 * n + 6, l, []) lm n ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4641
apply(simp only: mopup_jump_over2.simps, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4642
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4643
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4644
lemma mopup_inv_step:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4645
  "\<lbrakk>n < length lm; mopup_inv (s, l, r) lm n ires\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4646
  \<Longrightarrow> mopup_inv (step (s, l, r) (mopup_a n @ shift mopup_b (2 * n), 0)) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4647
apply(case_tac r, case_tac [2] a)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4648
apply(auto split:if_splits simp add:step.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4649
apply(simp_all add: mopupfetchs)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4650
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4651
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4652
declare mopup_inv.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4653
lemma mopup_inv_steps: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4654
"\<lbrakk>n < length lm; mopup_inv (s, l, r) lm n ires\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4655
     mopup_inv (steps (s, l, r) (mopup_a n @ shift mopup_b (2 * n), 0)  stp) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4656
apply(induct_tac stp, simp add: steps.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4657
apply(simp add: step_red)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4658
apply(case_tac "steps (s, l, r) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4659
                (mopup_a n @ shift mopup_b (2 * n), 0) na", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4660
apply(rule_tac mopup_inv_step, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4661
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4662
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4663
fun abc_mopup_stage1 :: "config \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4664
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4665
  "abc_mopup_stage1 (s, l, r) n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4666
           (if s > 0 \<and> s \<le> 2*n then 6
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4667
            else if s = 2*n + 1 then 4
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4668
            else if s \<ge> 2*n + 2 \<and> s \<le> 2*n + 4 then 3
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4669
            else if s = 2*n + 5 then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4670
            else if s = 2*n + 6 then 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4671
            else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4672
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4673
fun abc_mopup_stage2 :: "config \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4674
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4675
  "abc_mopup_stage2 (s, l, r) n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4676
           (if s > 0 \<and> s \<le> 2*n then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4677
            else if s = 2*n + 1 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4678
            else if s = 2*n + 5 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4679
            else if s = 2*n + 6 then length l
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4680
            else if s \<ge> 2*n + 2 \<and> s \<le> 2*n + 4 then length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4681
            else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4682
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4683
fun abc_mopup_stage3 :: "config \<Rightarrow> nat \<Rightarrow> nat"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4684
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4685
  "abc_mopup_stage3 (s, l, r) n = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4686
          (if s > 0 \<and> s \<le> 2*n then 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4687
              if hd r = Bk then 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4688
              else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4689
           else if s = 2*n + 2 then 1 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4690
           else if s = 2*n + 3 then 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4691
           else if s = 2*n + 4 then 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4692
           else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4693
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4694
fun abc_mopup_measure :: "(config \<times> nat) \<Rightarrow> (nat \<times> nat \<times> nat)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4695
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4696
  "abc_mopup_measure (c, n) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4697
    (abc_mopup_stage1 c n, abc_mopup_stage2 c n, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4698
                                       abc_mopup_stage3 c n)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4699
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4700
definition abc_mopup_LE ::
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4701
   "(((nat \<times> cell list \<times> cell list) \<times> nat) \<times> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4702
    ((nat \<times> cell list \<times> cell list) \<times> nat)) set"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4703
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4704
  "abc_mopup_LE \<equiv> (inv_image lex_triple abc_mopup_measure)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4705
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4706
lemma wf_abc_mopup_le[intro]: "wf abc_mopup_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4707
by(auto intro:wf_inv_image simp:abc_mopup_LE_def lex_triple_def lex_pair_def)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4708
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4709
lemma [simp]: "mopup_bef_erase_a (a, aa, []) lm n ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4710
apply(auto simp: mopup_bef_erase_a.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4711
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4712
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4713
lemma [simp]: "mopup_bef_erase_b (a, aa, []) lm n ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4714
apply(auto simp: mopup_bef_erase_b.simps) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4715
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4716
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4717
lemma [simp]: "mopup_aft_erase_b (2 * n + 3, aa, []) lm n ires = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4718
apply(auto simp: mopup_aft_erase_b.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4719
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4720
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4721
declare mopup_inv.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4722
term mopup_inv
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4723
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4724
lemma [simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4725
  "\<lbrakk>0 < q; q \<le> n\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4726
     (fetch (mopup_a n @ shift mopup_b (2 * n)) (2*q) Bk) = (R, 2*q - 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4727
apply(case_tac q, simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4728
apply(auto simp: fetch.simps nth_of.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4729
apply(subgoal_tac "mopup_a n ! (4 * nat + 2) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4730
                     mopup_a (Suc nat) ! ((4 * nat) + 2)", 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4731
      simp add: mopup_a.simps nth_append)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4732
apply(rule mopup_a_nth, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4733
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4734
101
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4735
(* FIXME: is also in uncomputable *)
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4736
lemma halt_lemma: 
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4737
  "\<lbrakk>wf LE; \<forall>n. (\<not> P (f n) \<longrightarrow> (f (Suc n), (f n)) \<in> LE)\<rbrakk> \<Longrightarrow> \<exists>n. P (f n)"
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4738
by (metis wf_iff_no_infinite_down_chain)
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4739
06db15939b7c theories
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 63
diff changeset
  4740
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4741
lemma mopup_halt:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4742
  assumes 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4743
  less: "n < length lm"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4744
  and inv: "mopup_inv (Suc 0, l, r) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4745
  and f: "f = (\<lambda> stp. (steps (Suc 0, l, r) (mopup_a n @ shift mopup_b (2 * n), 0) stp, n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4746
  and P: "P = (\<lambda> (c, n). is_final c)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4747
  shows "\<exists> stp. P (f stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4748
proof(rule_tac LE = abc_mopup_LE in halt_lemma)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4749
  show "wf abc_mopup_LE" by(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4750
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4751
  show "\<forall>n. \<not> P (f n) \<longrightarrow> (f (Suc n), f n) \<in> abc_mopup_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4752
  proof(rule_tac allI, rule_tac impI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4753
    fix na
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4754
    assume h: "\<not> P (f na)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4755
    show "(f (Suc na), f na) \<in> abc_mopup_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4756
    proof(simp add: f)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4757
      obtain a b c where g:"steps (Suc 0, l, r) (mopup_a n @ shift mopup_b (2 * n), 0) na = (a, b, c)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4758
        apply(case_tac "steps (Suc 0, l, r) (mopup_a n @ shift mopup_b (2 * n), 0) na", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4759
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4760
      then have "mopup_inv (a, b, c) lm n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4761
        thm mopup_inv_steps
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4762
        using inv less mopup_inv_steps[of n lm "Suc 0" l r ires na]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4763
        apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4764
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4765
      moreover have "a > 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4766
        using h g
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4767
        apply(simp add: f P)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4768
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4769
      ultimately have "((step (a, b, c) (mopup_a n @ shift mopup_b (2 * n), 0), n), (a, b, c), n) \<in> abc_mopup_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4770
        apply(case_tac c, case_tac [2] aa)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4771
        apply(auto split:if_splits simp add:step.simps mopup_inv.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4772
        apply(simp_all add: mopupfetchs abc_mopup_LE_def lex_triple_def lex_pair_def )
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4773
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4774
      thus "((step (steps (Suc 0, l, r) (mopup_a n @ shift mopup_b (2 * n), 0) na) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4775
        (mopup_a n @ shift mopup_b (2 * n), 0), n),
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4776
        steps (Suc 0, l, r) (mopup_a n @ shift mopup_b (2 * n), 0) na, n)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4777
        \<in> abc_mopup_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4778
        using g by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4779
    qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4780
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4781
qed     
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4782
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4783
lemma mopup_inv_start: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4784
  "n < length am \<Longrightarrow> mopup_inv (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) am n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4785
apply(auto simp: mopup_inv.simps mopup_bef_erase_a.simps mopup_jump_over1.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4786
apply(case_tac [!] am, auto split: if_splits simp: tape_of_nl_cons)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4787
apply(rule_tac x = "Suc a" in exI, rule_tac x = k in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4788
apply(case_tac [!] n, simp_all add: abc_lm_v.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4789
apply(case_tac k, simp, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4790
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4791
      
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4792
lemma mopup_correct:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4793
  assumes less: "n < length (am::nat list)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4794
  and rs: "abc_lm_v am n = rs"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4795
  shows "\<exists> stp i j. (steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) (mopup_a n @ shift mopup_b (2 * n), 0) stp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4796
    = (0, Bk\<up>i @ Bk # Bk # ires, Oc # Oc\<up> rs @ Bk\<up>j)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4797
using less
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4798
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4799
  have a: "mopup_inv (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) am n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4800
    using less
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4801
    apply(simp add: mopup_inv_start)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4802
    done    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4803
  then have "\<exists> stp. is_final (steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) (mopup_a n @ shift mopup_b (2 * n), 0) stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4804
    using less mopup_halt[of n am  "Bk # Bk # ires" "<am> @ Bk \<up> k" ires
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4805
      "(\<lambda>stp. (steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) (mopup_a n @ shift mopup_b (2 * n), 0) stp, n))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4806
      "(\<lambda>(c, n). is_final c)"]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4807
    apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4808
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4809
  from this obtain stp where b:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4810
    "is_final (steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) (mopup_a n @ shift mopup_b (2 * n), 0) stp)" ..
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4811
  from a b have
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4812
    "mopup_inv (steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) (mopup_a n @ shift mopup_b (2 * n), 0) stp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4813
    am n ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4814
    apply(rule_tac mopup_inv_steps, simp_all add: less)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4815
    done    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4816
  from b and this show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4817
    apply(rule_tac x = stp in exI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4818
    apply(case_tac "steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4819
      (mopup_a n @ shift mopup_b (2 * n), 0) stp")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4820
    apply(simp add: mopup_inv.simps mopup_stop.simps rs)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4821
    using rs
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4822
    apply(simp add: tape_of_nat_abv)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4823
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4824
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4825
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4826
(*we can use Hoare_plus here*)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4827
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4828
lemma wf_mopup[intro]: "tm_wf (mopup n, 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4829
apply(induct n, simp add: mopup.simps shift.simps mopup_b_def tm_wf.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4830
apply(auto simp: mopup.simps shift.simps mopup_b_def tm_wf.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4831
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4832
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4833
lemma length_tp:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4834
  "\<lbrakk>ly = layout_of ap; tp = tm_of ap\<rbrakk> \<Longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4835
  start_of ly (length ap) = Suc (length tp div 2)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4836
apply(frule_tac length_tp', simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4837
apply(simp add: start_of.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4838
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4839
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4840
lemma compile_correct_halt: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4841
  assumes layout: "ly = layout_of ap"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4842
  and compile: "tp = tm_of ap"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4843
  and crsp: "crsp ly (0, lm) (Suc 0, l, r) ires"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4844
  and abc_halt: "abc_steps_l (0, lm) ap stp = (length ap, am)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4845
  and rs_loc: "n < length am"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4846
  and rs: "abc_lm_v am n = rs"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4847
  and off: "off = length tp div 2"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4848
  shows "\<exists> stp i j. steps (Suc 0, l, r) (tp @ shift (mopup n) off, 0) stp = (0, Bk\<up>i @ Bk # Bk # ires, Oc\<up>Suc rs @ Bk\<up>j)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4849
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4850
  have "\<exists> stp k. steps (Suc 0, l, r) (tp, 0) stp = (Suc off, Bk # Bk # ires, <am> @ Bk\<up>k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4851
    using assms tp_correct'[of ly ap tp lm l r ires stp am]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4852
    by(simp add: length_tp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4853
  then obtain stp k where "steps (Suc 0, l, r) (tp, 0) stp = (Suc off, Bk # Bk # ires, <am> @ Bk\<up>k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4854
    by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4855
  then have a: "steps (Suc 0, l, r) (tp@shift (mopup n) off , 0) stp = (Suc off, Bk # Bk # ires, <am> @ Bk\<up>k)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4856
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4857
    by(auto intro: tm_append_first_steps_eq)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4858
  have "\<exists> stp i j. (steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) (mopup_a n @ shift mopup_b (2 * n), 0) stp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4859
    = (0, Bk\<up>i @ Bk # Bk # ires, Oc # Oc\<up> rs @ Bk\<up>j)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4860
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4861
    by(auto intro: mopup_correct)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4862
  then obtain stpb i j where 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4863
    "steps (Suc 0, Bk # Bk # ires, <am> @ Bk \<up> k) (mopup_a n @ shift mopup_b (2 * n), 0) stpb
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4864
    = (0, Bk\<up>i @ Bk # Bk # ires, Oc # Oc\<up> rs @ Bk\<up>j)" by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4865
  then have b: "steps (Suc 0 + off, Bk # Bk # ires, <am> @ Bk \<up> k) (tp @ shift (mopup n) off, 0) stpb
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4866
    = (0, Bk\<up>i @ Bk # Bk # ires, Oc # Oc\<up> rs @ Bk\<up>j)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4867
    using assms wf_mopup
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4868
   thm tm_append_second_halt_eq
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4869
    apply(drule_tac tm_append_second_halt_eq, auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4870
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4871
  from a b show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4872
    by(rule_tac x = "stp + stpb" in exI, simp add: steps_add)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4873
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4874
 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4875
declare mopup.simps[simp del]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4876
lemma abc_step_red2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4877
  "abc_steps_l (s, lm) p (Suc n) = (let (as', am') = abc_steps_l (s, lm) p n in
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4878
                                    abc_step_l (as', am') (abc_fetch as' p))"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4879
apply(case_tac "abc_steps_l (s, lm) p n", simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4880
apply(drule_tac abc_step_red, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4881
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4882
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4883
lemma crsp_steps2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4884
  assumes 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4885
  layout: "ly = layout_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4886
  and compile: "tp = tm_of ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4887
  and crsp: "crsp ly (0, lm) (Suc 0, l, r) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4888
  and nothalt: "as < length ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4889
  and aexec: "abc_steps_l (0, lm) ap stp = (as, am)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4890
  shows "\<exists>stpa\<ge>stp. crsp ly (as, am) (steps (Suc 0, l, r) (tp, 0) stpa) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4891
using nothalt aexec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4892
proof(induct stp arbitrary: as am)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4893
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4894
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4895
    using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4896
    by(rule_tac x = 0 in exI, auto simp: abc_steps_l.simps steps.simps crsp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4897
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4898
  case (Suc stp as am)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4899
  have ind: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4900
    "\<And> as am.  \<lbrakk>as < length ap; abc_steps_l (0, lm) ap stp = (as, am)\<rbrakk> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4901
    \<Longrightarrow> \<exists>stpa\<ge>stp. crsp ly (as, am) (steps (Suc 0, l, r) (tp, 0) stpa) ires" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4902
  have a: "as < length ap" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4903
  have b: "abc_steps_l (0, lm) ap (Suc stp) = (as, am)" by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4904
  obtain as' am' where c: "abc_steps_l (0, lm) ap stp = (as', am')" 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4905
    by(case_tac "abc_steps_l (0, lm) ap stp", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4906
  then have d: "as' < length ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4907
    using a b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4908
    by(simp add: abc_step_red2, case_tac "as' < length ap", simp,
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4909
      simp add: abc_fetch.simps abc_steps_l.simps abc_step_l.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4910
  have "\<exists>stpa\<ge>stp. crsp ly (as', am') (steps (Suc 0, l, r) (tp, 0) stpa) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4911
    using d c ind by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4912
  from this obtain stpa where e: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4913
    "stpa \<ge> stp \<and>  crsp ly (as', am') (steps (Suc 0, l, r) (tp, 0) stpa) ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4914
    by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4915
  obtain s' l' r' where f: "steps (Suc 0, l, r) (tp, 0) stpa = (s', l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4916
    by(case_tac "steps (Suc 0, l, r) (tp, 0) stpa", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4917
  obtain ins where g: "abc_fetch as' ap = Some ins" using d 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4918
    by(case_tac "abc_fetch as' ap",auto simp: abc_fetch.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4919
  then have "\<exists>stp> (0::nat). crsp ly (abc_step_l (as', am') (Some ins)) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4920
    (steps (s', l', r') (tp, 0) stp) ires "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4921
    using layout compile e f 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4922
    by(rule_tac crsp_step, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4923
  then obtain stpb where "stpb > 0 \<and> crsp ly (abc_step_l (as', am') (Some ins)) 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4924
    (steps (s', l', r') (tp, 0) stpb) ires" ..
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4925
  from this show "?case" using b e g f c
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4926
    by(rule_tac x = "stpa + stpb" in exI, simp add: steps_add abc_step_red2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4927
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4928
    
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4929
lemma compile_correct_unhalt: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4930
  assumes layout: "ly = layout_of ap"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4931
  and compile: "tp = tm_of ap"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4932
  and crsp: "crsp ly (0, lm) (Suc 0, l, r) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4933
  and off: "off = length tp div 2"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4934
  and abc_unhalt: "\<forall> stp. (\<lambda> (as, am). as < length ap) (abc_steps_l (0, lm) ap stp)"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4935
  shows "\<forall> stp.\<not> is_final (steps (Suc 0, l, r) (tp @ shift (mopup n) off, 0) stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4936
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4937
proof(rule_tac allI, rule_tac notI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4938
  fix stp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4939
  assume h: "is_final (steps (Suc 0, l, r) (tp @ shift (mopup n) off, 0) stp)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4940
  obtain as am where a: "abc_steps_l (0, lm) ap stp = (as, am)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4941
    by(case_tac "abc_steps_l (0, lm) ap stp", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4942
  then have b: "as < length ap"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4943
    using abc_unhalt
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4944
    by(erule_tac x = stp in allE, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4945
  have "\<exists> stpa\<ge>stp. crsp ly (as, am) (steps (Suc 0, l, r) (tp, 0) stpa) ires "
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4946
    using assms b a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4947
    apply(rule_tac crsp_steps2, simp_all)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4948
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4949
  then obtain stpa where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4950
    "stpa\<ge>stp \<and> crsp ly (as, am) (steps (Suc 0, l, r) (tp, 0) stpa) ires" ..
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4951
  then obtain s' l' r' where b: "(steps (Suc 0, l, r) (tp, 0) stpa) = (s', l', r') \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4952
       stpa\<ge>stp \<and> crsp ly (as, am) (s', l', r') ires"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4953
    by(case_tac "steps (Suc 0, l, r) (tp, 0) stpa", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4954
  hence c:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4955
    "(steps (Suc 0, l, r) (tp @ shift (mopup n) off, 0) stpa) = (s', l', r')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4956
    by(rule_tac tm_append_first_steps_eq, simp_all add: crsp.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4957
  from b have d: "s' > 0 \<and> stpa \<ge> stp"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4958
    by(simp add: crsp.simps)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4959
  then obtain diff where e: "stpa = stp + diff"   by (metis le_iff_add)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4960
  obtain s'' l'' r'' where f:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4961
    "steps (Suc 0, l, r) (tp @ shift (mopup n) off, 0) stp = (s'', l'', r'') \<and> is_final (s'', l'', r'')"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4962
    using h
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4963
    by(case_tac "steps (Suc 0, l, r) (tp @ shift (mopup n) off, 0) stp", auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4964
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4965
  then have "is_final (steps (s'', l'', r'') (tp @ shift (mopup n) off, 0) diff)"
61
7edbd5657702 updated files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 60
diff changeset
  4966
    by(auto intro: after_is_final)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4967
  then have "is_final (steps (Suc 0, l, r) (tp @ shift (mopup n) off, 0) stpa)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4968
    using e
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4969
    by(simp add: steps_add f)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4970
  from this and c d show "False" by simp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  4971
qed
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4972
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4973
end
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  4974