thys/Abacus.thy
author Christian Urban <christian.urban@kcl.ac.uk>
Thu, 22 Feb 2024 14:06:37 +0000
changeset 299 a2707a5652d9
parent 292 293e9c6f22e1
permissions -rwxr-xr-x
test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
     1
(* Title: thys/Abacus.thy
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
     2
   Author: Jian Xu, Xingyuan Zhang, and Christian Urban
292
293e9c6f22e1 Added myself to the comments at the start of all files
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 291
diff changeset
     3
   Modifications: Sebastiaan Joosten
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
     4
*)
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
     5
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
     6
chapter {* Abacus Machines *}
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
     7
163
67063c5365e1 changed theory names to uppercase
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 115
diff changeset
     8
theory Abacus
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
     9
imports Turing_Hoare Abacus_Mopup
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    10
begin
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    11
111
dfc629cd11de made uncomputable compatible with abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 101
diff changeset
    12
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
    13
165
582916f289ea took out all deadcode from abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 163
diff changeset
    14
(* Abacus instructions *)
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    15
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    16
datatype abc_inst =
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    17
     Inc nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    18
   | Dec nat nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    19
   | Goto nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    20
  
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    21
type_synonym abc_prog = "abc_inst list"
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
type_synonym abc_state = nat
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    24
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    25
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    26
  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
    27
  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
    28
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    29
type_synonym abc_lm = "nat list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    30
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    31
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    32
  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
    33
  as having content @{text "0"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    34
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    35
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
    36
  where 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    37
    "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
    38
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    39
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    40
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    41
  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
    42
  @{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
    43
  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
    44
  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
    45
*}
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
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
    48
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    49
    "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
    50
                           am@ (replicate (n - length am) 0) @ [v])"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    51
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    52
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    53
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    54
  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
    55
  current memory:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    56
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    57
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
    58
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    59
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    60
  Fetch instruction out of Abacus program:
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
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    63
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
    64
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    65
  "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
    66
                    else None)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    67
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    68
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    69
  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
    70
  configuration does not change.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    71
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    72
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
    73
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    74
  "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
    75
               None \<Rightarrow> (s, lm) |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    76
               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
    77
                       (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
    78
               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
    79
                       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
    80
                       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
    81
               Some (Goto n) \<Rightarrow> (n, lm) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    82
               )"
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
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    85
  Multi-step execution of Abacus machine.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    86
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    87
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
    88
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    89
  "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
    90
  "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
    91
      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
    92
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    93
section {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    94
  Compiling Abacus machines into Truing machines
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
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    97
subsection {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
    98
  Compiling functions
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
  @{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
   103
  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
   104
  on the way.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   105
*}
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
fun findnth :: "nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   108
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   109
  "findnth 0 = []" |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   110
  "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
   111
           (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
   112
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   113
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   114
  @{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
   115
  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
   116
  of cells afterwards to the right accordingly.
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
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   119
definition tinc_b :: "instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   120
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   121
  "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
   122
             (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
   123
             (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
   124
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   125
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   126
  @{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
   127
  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
   128
  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
   129
  Abacus program.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   130
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   131
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   132
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
   133
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   134
  "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
   135
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   136
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   137
  @{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
   138
  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
   139
  of cells afterwards to the left accordingly.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   140
  *}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   141
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   142
definition tdec_b :: "instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   143
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   144
  "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
   145
              (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
   146
              (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
   147
              (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
   148
              (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
   149
              (R, 0), (W0, 16)]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   150
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   151
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   152
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   153
  @{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
   154
  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
   155
  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
   156
  Abacus program.
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
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   159
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
   160
  where
190
f1ecb4a68a54 renamed sete definition to adjust and old special case of adjust to adjust0
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 181
diff changeset
   161
  "tdec ss n e = shift (findnth n) (ss - 1) @ adjust (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
   162
 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   163
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   164
  @{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
   165
  @{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
   166
  @{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
   167
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   168
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   169
fun tgoto :: "nat \<Rightarrow> instr list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   170
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   171
  "tgoto n = [(Nop, n), (Nop, n)]"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   172
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   173
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   174
  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
   175
  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
   176
  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
   177
  in the Abacus program.
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
type_synonym layout = "nat list"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   181
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   182
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   183
  @{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
   184
  TM simulating the Abacus instruction @{text "i"}.
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
fun length_of :: "abc_inst \<Rightarrow> nat"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   187
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   188
  "length_of i = (case i of 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   189
                    Inc n   \<Rightarrow> 2 * n + 9 |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   190
                    Dec n e \<Rightarrow> 2 * n + 16 |
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   191
                    Goto n  \<Rightarrow> 1)"
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
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   194
  @{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
   195
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   196
fun layout_of :: "abc_prog \<Rightarrow> layout"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   197
  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
   198
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   199
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   200
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   201
  @{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
   202
  TM in the finall TM.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   203
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   204
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   205
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
   206
  where
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   207
  "start_of ly x = (Suc (sum_list (take x ly))) "
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   208
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   209
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   210
  @{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
   211
  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
   212
  within the overal layout @{text "lo"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   213
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   214
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   215
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
   216
  where
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   217
  "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
   218
| "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
   219
| "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
   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 "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
   223
  every instruction with its starting state.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   224
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   225
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   226
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
   227
  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
   228
                         [0..<(length ap)]) ap)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   229
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   230
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   231
  @{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
   232
  the corresponding Abacus intruction in @{text "ap"}.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   233
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   234
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   235
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
   236
  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
   237
                         (tpairs_of ap)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   238
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   239
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   240
  @{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
   241
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   242
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
   243
  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
   244
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   245
lemma length_findnth: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   246
  "length (findnth n) = 4 * n"
165
582916f289ea took out all deadcode from abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 163
diff changeset
   247
by (induct n, auto)
47
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
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
   250
apply(auto simp: ci.simps tinc_b_def tdec_b_def length_findnth
190
f1ecb4a68a54 renamed sete definition to adjust and old special case of adjust to adjust0
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 181
diff changeset
   251
                 split: abc_inst.splits simp del: adjust.simps)
f1ecb4a68a54 renamed sete definition to adjust and old special case of adjust to adjust0
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 181
diff changeset
   252
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   253
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   254
165
582916f289ea took out all deadcode from abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 163
diff changeset
   255
subsection {* Representation of Abacus memory by TM tapes *}
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   256
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   257
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   258
  @{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
   259
  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
   260
*}
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
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
   263
  where 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   264
  "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
   265
           (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
   266
            l = Bk # Bk # inres)"
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
declare crsp.simps[simp del]
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   269
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   270
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   271
  The type of invarints expressing correspondence between 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   272
  Abacus configuration and TM configuration.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   273
*}
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
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
   276
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   277
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
   278
        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
   279
        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
   280
        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
   281
        layout_of.simps[simp del]
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   282
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   283
text {*
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   284
  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
   285
  the compilation of @{text "Inc n"} instruction.
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   286
*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   287
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   288
declare abc_step_l.simps[simp del] abc_steps_l.simps[simp del]
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
   289
lemma start_of_nonzero[simp]: "start_of ly as > 0" "(start_of ly as = 0) = False"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
   290
apply(auto simp: start_of.simps)
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   291
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   292
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   293
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
   294
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
   295
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   296
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
   297
 "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
   298
  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
   299
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
   300
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   301
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   302
    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
   303
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   304
  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
   305
  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
   306
    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
   307
    by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   308
  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
   309
  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
   310
    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
   311
  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
   312
    using h
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   313
    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
   314
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   315
    using g
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   316
    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
   317
qed
47
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
lemma tm_shift_fetch: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   320
  "\<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
   321
  \<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
   322
apply(case_tac b)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   323
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
   324
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   325
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   326
lemma tm_shift_eq_step:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   327
  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
   328
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   329
  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
   330
using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   331
apply(simp add: step.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   332
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
   333
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
   334
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   335
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   336
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
   337
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   338
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
   339
  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
   340
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   341
  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
   342
  using exec notfinal
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   343
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
   344
  fix stp s' l' r'
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   345
  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
   346
     \<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
   347
  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
   348
  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
   349
    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
   350
  moreover then have "s1 \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   351
    using h
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   352
    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
   353
    apply(case_tac "0 < s1", auto)
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   354
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   355
  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
   356
                   (s1 + off, l1, r1)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   357
    apply(rule_tac ind, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   358
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   359
  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
   360
    using h g assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   361
    apply(simp add: step_red)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   362
    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
   363
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   364
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   365
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   366
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
   367
apply(simp add: start_of.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   368
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   369
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   370
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
   371
       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
   372
       \<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
   373
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
   374
                 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
   375
                 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
   376
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   377
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   378
lemma start_of_Suc2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   379
  "\<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
   380
  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
   381
        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
   382
            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
   383
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
   384
                 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
   385
                 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
   386
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   387
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   388
lemma start_of_Suc3:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   389
  "\<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
   390
  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
   391
  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
   392
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
   393
                 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
   394
                 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
   395
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   396
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   397
lemma length_ci_inc: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   398
  "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
   399
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
   400
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   401
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   402
lemma length_ci_dec: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   403
  "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
   404
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
   405
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   406
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   407
lemma length_ci_goto: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   408
  "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
   409
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
   410
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   411
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   412
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
   413
            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
   414
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
   415
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
   416
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   417
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   418
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
   419
       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
   420
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
   421
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   422
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   423
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
   424
   "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
   425
           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
   426
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
   427
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
   428
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
   429
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   430
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   431
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
   432
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   433
lemma  tm_append:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   434
  "\<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
   435
  \<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
   436
  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
   437
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
   438
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
   439
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   440
apply(induct n, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   441
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
   442
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
   443
               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
   444
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
   445
apply(subgoal_tac " concat (drop (Suc n) tps) = tps ! Suc n @ 
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   446
                  concat (drop (Suc (Suc n)) tps)")
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   447
  apply (metis append_take_drop_id concat_append)
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   448
   apply(rule concat_drop_suc_iff,force)
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   449
  by (simp add: concat_suc)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   450
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   451
declare append_assoc[simp]
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   452
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
   453
lemma length_tms_of[simp]: "length (tms_of aprog) = length aprog"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   454
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
   455
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   456
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   457
lemma ci_nth: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   458
  "\<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
   459
  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
   460
  \<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
   461
apply(simp add: tms_of.simps tpairs_of.simps 
291
93db7414931d More naming of lemmas, cleanup of Abacus and NatBijection
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 290
diff changeset
   462
      abc_fetch.simps del: map_append split: if_splits)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   463
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   464
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   465
lemma t_split:"\<lbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   466
        ly = layout_of aprog;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   467
        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
   468
      \<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
   469
            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
   470
            \<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
   471
              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
   472
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
   473
                             "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
   474
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
   475
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
   476
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
   477
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
   478
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   479
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   480
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
   481
          \<Longrightarrow> (x + y) div 2 = x div 2 + y div 2"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   482
  by(auto)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   483
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
   484
lemma length_layout_of[simp]: "length (layout_of aprog) = length aprog"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   485
by(auto simp: layout_of.simps)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   486
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
   487
lemma length_tms_of_elem_even[intro]:  "n < length ap \<Longrightarrow> length (tms_of ap ! n) mod 2 = 0"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   488
  apply(cases "ap ! n")
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   489
  by (auto simp: tms_of.simps tpairs_of.simps ci.simps length_findnth tinc_b_def tdec_b_def)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   490
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   491
lemma compile_mod2: "length (concat (take n (tms_of ap))) mod 2 = 0"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   492
proof(induct n)
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   493
  case 0
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   494
  then show ?case by (auto simp add: take_Suc_conv_app_nth)
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   495
next
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   496
  case (Suc n)
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   497
  hence "n < length (tms_of ap) \<Longrightarrow> is_even (length (concat (take (Suc n) (tms_of ap))))"
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   498
    unfolding take_Suc_conv_app_nth by fastforce
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   499
  with Suc show ?case by(cases "n < length (tms_of ap)", auto)
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   500
qed
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   501
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   502
lemma tpa_states:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   503
  "\<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
   504
  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
   505
  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
   506
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
   507
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   508
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   509
    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
   510
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   511
  case (Suc as tp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   512
  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
   513
    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
   514
  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
   515
  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
   516
  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
   517
    using le
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   518
    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
   519
  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
   520
    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
   521
    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
   522
    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
   523
    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
   524
    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
   525
    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
   526
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   527
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   528
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
   529
declare fetch.simps[simp]
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   530
lemma append_append_fetch: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   531
    "\<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
   532
      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
   533
    \<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
   534
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
   535
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
   536
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
   537
             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
   538
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
   539
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
   540
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
   541
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
   542
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
   543
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
   544
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
   545
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
   546
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   547
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   548
lemma step_eq_fetch':
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   549
  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
   550
  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
   551
  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
   552
  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
   553
  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
   554
  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
   555
       (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
   556
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   557
  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
   558
    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
   559
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   560
    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
   561
  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
   562
    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
   563
  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
   564
    using fetch
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   565
    by(rule_tac tpa_states, simp, simp add: abc_fetch.simps split: if_splits)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   566
  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
   567
        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
   568
  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
   569
    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
   570
      using a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   571
      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
   572
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   573
    show "length (ci ly (start_of ly as) ins) mod 2 = 0"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   574
      by(case_tac ins, auto simp: ci.simps length_findnth tinc_b_def tdec_b_def)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   575
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   576
    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
   577
      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
   578
    proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   579
      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
   580
        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
   581
      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
   582
        using fetch layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   583
        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
   584
          split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   585
        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
   586
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   587
      ultimately show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   588
        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
   589
        apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   590
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   591
    qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   592
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   593
  thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   594
    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
   595
    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
   596
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   597
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   598
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   599
lemma step_eq_fetch: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   600
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   601
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   602
  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
   603
  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
   604
       (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
   605
  and notfinal: "ns \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   606
  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
   607
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   608
  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
   609
  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
   610
    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
   611
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   612
    case False 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   613
    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
   614
    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
   615
      by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   616
    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
   617
       (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
   618
      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
   619
    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
   620
      by(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   621
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   622
  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
   623
  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
   624
    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
   625
  next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   626
    case False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   627
    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
   628
      by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   629
    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
   630
      using abc_fetch layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   631
      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
   632
      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
   633
      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
   634
      apply arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   635
      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
   636
      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
   637
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   638
    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
   639
      using abc_fetch layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   640
      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
   641
      apply(case_tac [!] ins, simp_all add: start_of_Suc2 start_of_Suc1 start_of_Suc3)
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   642
      by (simp_all only: length_ci_inc length_ci_dec length_ci_goto, auto)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   643
    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
   644
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   645
  ultimately show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   646
    using assms
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
   647
    by(drule_tac b= b and ins = ins in step_eq_fetch', auto)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   648
qed
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
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   651
lemma step_eq_in:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   652
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   653
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   654
  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
   655
  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
   656
  = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   657
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   658
  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
   659
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   660
  apply(simp add: step.simps)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   661
  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
   662
    (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
   663
  using layout
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   664
  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
   665
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   666
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   667
lemma steps_eq_in:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   668
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   669
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   670
  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
   671
  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
   672
  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
   673
  = (s', l', r')"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   674
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   675
  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
   676
  using exec notfinal
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   677
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
   678
  fix stp s' l' r'
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   679
  assume ind: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   680
    "\<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
   681
              \<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
   682
  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
   683
  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
   684
                        (s1, l1, r1)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   685
    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
   686
  moreover hence "s1 \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   687
    using h
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   688
    apply(simp add: step_red)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   689
    apply(case_tac "0 < s1", simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   690
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   691
  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
   692
    apply(rule_tac ind, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   693
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   694
  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
   695
    using h g assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   696
    apply(simp add: step_red)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   697
    apply(rule_tac step_eq_in, auto)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   698
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   699
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   700
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   701
lemma tm_append_fetch_first: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   702
  "\<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
   703
    fetch (A @ B) s b = (ac, ns)"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   704
apply(case_tac b)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   705
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
   706
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   707
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   708
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
   709
  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
   710
  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
   711
  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
   712
using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   713
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
   714
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
   715
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
   716
done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   717
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   718
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
   719
  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
   720
  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
   721
  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
   722
using assms
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   723
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
   724
  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
   725
  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
   726
    \<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
   727
    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
   728
  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
   729
    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
   730
  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
   731
    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
   732
    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
   733
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   734
  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
   735
    using h a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   736
    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
   737
    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
   738
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   739
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   740
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   741
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
   742
  assumes
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   743
  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
   744
  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
   745
  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
   746
  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
   747
  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
   748
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   749
apply(case_tac b)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   750
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
   751
  split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   752
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   753
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   754
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   755
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
   756
  assumes 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   757
  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
   758
  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
   759
  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
   760
  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
   761
  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
   762
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   763
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
   764
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
   765
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
   766
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   767
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   768
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   769
lemma tm_append_second_steps_eq: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   770
  assumes 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   771
  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
   772
  and notfinal: "s' \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   773
  and off: "off = length A div 2"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   774
  and even: "length A mod 2 = 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   775
  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
   776
using exec notfinal
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   777
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
   778
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   779
  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
   780
    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
   781
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   782
  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
   783
  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
   784
    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
   785
    by fact
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   786
  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
   787
  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
   788
  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
   789
    by (metis prod_cases3)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   790
  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
   791
    using h k
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   792
    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
   793
  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
   794
    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
   795
  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
   796
    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
   797
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   798
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   799
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
   800
  assumes
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   801
  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
   802
  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
   803
  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
   804
  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
   805
  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
   806
using assms
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   807
apply(case_tac b)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   808
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
   809
  split: if_splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   810
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   811
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   812
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
   813
  assumes 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   814
  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
   815
  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
   816
  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
   817
  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
   818
  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
   819
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   820
  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
   821
    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
   822
 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
   823
   "\<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
   824
 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
   825
   using a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   826
   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
   827
 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
   828
   using a b assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   829
   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
   830
 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
   831
   using  b a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   832
   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
   833
 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
   834
   using assms b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   835
   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
   836
 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
   837
   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
   838
   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
   839
 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
   840
   using exec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   841
 proof(cases "n < stp")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   842
   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
   843
 next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   844
   case False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   845
   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
   846
   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
   847
     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
   848
   thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   849
     using a e exec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   850
     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
   851
 qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   852
 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
   853
   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
   854
 thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   855
   using e
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   856
   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
   857
qed
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   858
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   859
lemma tm_append_steps: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   860
  assumes 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   861
  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
   862
  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
   863
  and notfinal: "sb \<noteq> 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   864
  and off: "off = length A div 2"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   865
  and even: "length A mod 2 = 0"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   866
  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
   867
proof -
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   868
  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
   869
    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
   870
    apply(auto simp: assms)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   871
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   872
  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
   873
    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
   874
    apply(auto simp: assms bexec)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   875
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   876
  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
   877
    apply(simp add: steps_add off)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   878
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   879
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   880
       
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   881
subsection {* Crsp of Inc*}
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
   882
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   883
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
   884
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   885
  "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
   886
      (\<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
   887
          (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
   888
           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
   889
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   890
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   891
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
   892
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   893
  "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
   894
      (\<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
   895
         (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
   896
          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
   897
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   898
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
   899
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   900
  "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
   901
      (\<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
   902
        (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
   903
         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
   904
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   905
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
   906
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   907
  "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
   908
      (\<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
   909
       \<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
   910
         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
   911
       (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
   912
        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
   913
                 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
   914
      (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
   915
      )"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   916
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   917
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
   918
  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
   919
     (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
   920
      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
   921
      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
   922
      )"
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
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
   925
  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
   926
        (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
   927
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   928
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
   929
  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
   930
           (\<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
   931
             (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
   932
              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
   933
                      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
   934
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   935
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
   936
  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
   937
      (\<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
   938
        (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
   939
         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
   940
        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
   941
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   942
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
   943
  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
   944
       (\<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
   945
        (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
   946
         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
   947
          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
   948
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   949
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
   950
  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
   951
       (\<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
   952
            ml + mr = m \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   953
          (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
   954
          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
   955
         ((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
   956
          (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
   957
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   958
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
   959
  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
   960
      (\<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
   961
             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
   962
                                         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
   963
        \<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
   964
           (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
   965
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   966
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
   967
  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
   968
                (\<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
   969
                     (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
   970
                      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
   971
                      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
   972
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   973
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
   974
  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
   975
       (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
   976
        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
   977
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   978
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   979
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
   980
  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
   981
                (\<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
   982
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   983
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
   984
  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
   985
              (\<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
   986
                 (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
   987
                           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
   988
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   989
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
   990
  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
   991
             (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
   992
             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
   993
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   994
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
   995
  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
   996
              (\<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
   997
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
   998
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
   999
  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
  1000
              (\<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
  1001
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1002
lemma halt_lemma2': 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1003
  "\<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
  1004
    (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
  1005
      \<Longrightarrow> \<exists> n. P (f n)"
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  1006
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1007
apply(intro exCI, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1008
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
  1009
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
  1010
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
  1011
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
  1012
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
  1013
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
  1014
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
  1015
apply(rule_tac allI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1016
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
  1017
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
  1018
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1019
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1020
lemma halt_lemma2'': 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1021
  "\<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
  1022
         \<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
  1023
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
  1024
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1025
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1026
lemma halt_lemma2''':
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1027
 "\<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
  1028
                 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
  1029
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
  1030
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1031
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1032
lemma halt_lemma2: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1033
  "\<lbrakk>wf LE;  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1034
    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
  1035
    \<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
  1036
  \<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
  1037
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
  1038
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
  1039
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1040
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
  1041
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
  1042
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
  1043
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1044
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1045
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1046
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
  1047
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1048
  "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
  1049
              (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
  1050
               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
  1051
                  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
  1052
                  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
  1053
               else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1054
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1055
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1056
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
  1057
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1058
  "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
  1059
  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1060
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
  1061
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1062
  "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
  1063
           (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
  1064
                   (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
  1065
                    else 1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1066
            else length r)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1067
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1068
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
  1069
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1070
  "findnth_measure (c, n) = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1071
     (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
  1072
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1073
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
  1074
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1075
  "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
  1076
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1077
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
  1078
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1079
   "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
  1080
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1081
lemma wf_findnth_LE: "wf findnth_LE"
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  1082
by(auto simp: findnth_LE_def lex_pair_def)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1083
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1084
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
  1085
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1086
lemma x_is_2n_arith[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1087
  "\<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
  1088
 \<Longrightarrow> x = 2*n"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1089
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1090
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1091
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1092
lemma between_sucs:"x < Suc n \<Longrightarrow> \<not> x < n \<Longrightarrow> x = n" by auto
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1093
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1094
lemma fetch_findnth[simp]: 
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1095
  "\<lbrakk>0 < a; a < Suc (2 * n); a mod 2 = Suc 0\<rbrakk> \<Longrightarrow> fetch (findnth n) a Oc = (R, Suc a)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1096
  "\<lbrakk>0 < a; a < Suc (2 * n); a mod 2 \<noteq> Suc 0\<rbrakk> \<Longrightarrow> fetch (findnth n) a Oc = (R, a)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1097
  "\<lbrakk>0 < a; a < Suc (2 * n); a mod 2 \<noteq> Suc 0\<rbrakk> \<Longrightarrow> fetch (findnth n) a Bk = (R, Suc a)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1098
  "\<lbrakk>0 < a; a < Suc (2 * n); a mod 2 = Suc 0\<rbrakk> \<Longrightarrow> fetch (findnth n) a Bk = (W1, a)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1099
by(cases a;induct n;force simp: length_findnth nth_append dest!:between_sucs)+
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1100
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1101
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
  1102
   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
  1103
   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
  1104
   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
  1105
   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
  1106
   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
  1107
   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
  1108
   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
  1109
   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
  1110
   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
  1111
   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
  1112
   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
  1113
   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
  1114
   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
  1115
   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
  1116
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1117
lemma replicate_once[intro]: "\<exists>rn. [Bk] = Bk \<up> rn"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1118
by (metis replicate.simps)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1119
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1120
lemma at_begin_norm_Bk[intro]:  "at_begin_norm (as, am) (q, aaa, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1121
             \<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
  1122
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
  1123
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
  1124
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1125
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1126
lemma at_begin_fst_bwtn_Bk[intro]: "at_begin_fst_bwtn (as, am) (q, aaa, []) ires 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1127
            \<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
  1128
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
  1129
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
  1130
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1131
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1132
lemma at_begin_fst_awtn_Bk[intro]: "at_begin_fst_awtn (as, am) (q, aaa, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1133
           \<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
  1134
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
  1135
done 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1136
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1137
lemma inv_locate_a_Bk[intro]: "inv_locate_a (as, am) (q, aaa, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1138
            \<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
  1139
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
  1140
apply(erule disj_forward)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1141
defer
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1142
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
  1143
done
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
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
  1146
       \<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
  1147
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
  1148
                 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
  1149
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
  1150
      rule disjI2, rule disjI2)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1151
defer
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1152
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
  1153
      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
  1154
prefer 2
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1155
apply(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1156
proof-
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1157
  fix lm1 tn rn
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1158
  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
  1159
    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
  1160
  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
  1161
    (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
  1162
    (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
  1163
  proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1164
    from k have "?P lm1 tn (rn - 1)"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1165
      by (auto simp: Cons_replicate_eq)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1166
    thus ?thesis by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1167
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1168
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1169
  fix lm1 lm2 rn
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1170
  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
  1171
    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
  1172
    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
  1173
  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
  1174
    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
  1175
    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
  1176
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1177
  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
  1178
    (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
  1179
    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
  1180
    (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
  1181
  proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1182
    from h1 and h2  have "?P lm1 0 (rn - 1)"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1183
      apply(auto simp:tape_of_nat_def)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1184
      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
  1185
    thus ?thesis by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1186
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1187
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1188
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1189
lemma inv_locate_a[simp]: "inv_locate_a (as, am) (q, aaa, []) ires \<Longrightarrow> 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1190
               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
  1191
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
  1192
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
  1193
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1194
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1195
(*inv: from locate_b to locate_b*)
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1196
lemma inv_locate_b[simp]: "inv_locate_b (as, am) (q, aaa, Oc # xs) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1197
         \<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
  1198
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
  1199
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1200
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
  1201
      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
  1202
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
  1203
      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
  1204
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
  1205
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1206
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1207
lemma tape_nat[simp]:  "<[x::nat]> = Oc\<up>(Suc x)"
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1208
apply(simp add: tape_of_nat_def tape_of_list_def)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1209
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1210
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1211
lemma inv_locate[simp]: "\<lbrakk>inv_locate_b (as, am) (q, aaa, Bk # xs) ires; \<exists>n. xs = Bk\<up>n\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1212
            \<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
  1213
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
  1214
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
  1215
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
  1216
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1217
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
  1218
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
  1219
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
  1220
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
  1221
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
  1222
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
  1223
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
  1224
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
  1225
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
  1226
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
  1227
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1228
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1229
lemma repeat_Bk_no_Oc[simp]: "(Oc # r = Bk \<up> rn) = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1230
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
  1231
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1232
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1233
lemma repeat_Bk[simp]: "(\<exists>rna. Bk \<up> rn = Bk # Bk \<up> rna) \<or> rn = 0"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1234
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
  1235
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1236
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1237
lemma inv_locate_b_Oc_via_a[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1238
      "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
  1239
       \<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
  1240
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
  1241
          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
  1242
          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
  1243
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
  1244
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
  1245
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
  1246
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
  1247
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
  1248
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
  1249
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
  1250
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
  1251
      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
  1252
      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
  1253
      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
  1254
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
  1255
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
  1256
done
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 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
  1259
by auto
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1260
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1261
lemma inv_locate_a_Bk_via_b[simp]: "\<lbrakk>inv_locate_b (as, am) (q, aaa, Bk # xs) ires; 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1262
                \<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
  1263
       \<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
  1264
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
  1265
apply(rule_tac disjI1)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1266
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
  1267
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1268
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
  1269
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
  1270
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
  1271
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
  1272
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
  1273
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
  1274
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
  1275
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
  1276
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
  1277
done
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 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
  1280
       "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
  1281
    \<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
  1282
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
  1283
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1284
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1285
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1286
lemma inv_locate_b_Bk[simp]:  "inv_locate_b (as, am) (q, l, []) ires 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1287
           \<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
  1288
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
  1289
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1290
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
  1291
      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
  1292
      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
  1293
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1294
done
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
(*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
  1297
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1298
lemma div_rounding_down[simp]: "(2*q - Suc 0) div 2 = (q - 1)" "(Suc (2*q)) div 2 = q"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1299
by arith+
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1300
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1301
lemma even_plus_one_odd[simp]: "x mod 2 = 0 \<Longrightarrow> Suc x mod 2 = Suc 0"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1302
by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1303
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1304
lemma odd_plus_one_even[simp]: "x mod 2 = Suc 0 \<Longrightarrow> Suc x mod 2 = 0"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1305
by arith
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1306
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1307
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
  1308
    "\<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
  1309
   \<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
  1310
apply(insert locate_b_2_a [of as am "q - 1" aaa xs ires], simp)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1311
  done
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1312
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1313
(*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
  1314
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1315
lemma findnth_inv_layout_of_via_crsp[simp]:
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1316
  "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
  1317
  \<Longrightarrow> findnth_inv (layout_of ap) n (as, lm) (Suc 0, l, r) ires"
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1318
by(auto simp: crsp.simps findnth_inv.simps inv_locate_a.simps
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1319
               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
  1320
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1321
lemma findnth_correct_pre: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1322
  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
  1323
  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
  1324
  and not0: "n > 0"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1325
  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
  1326
  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
  1327
  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
  1328
  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
  1329
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
  1330
  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
  1331
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1332
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1333
    using crsp layout
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1334
    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
  1335
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1336
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1337
  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
  1338
    using not0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1339
    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
  1340
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1341
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1342
  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
  1343
        \<in> findnth_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1344
  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
  1345
      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
  1346
    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
  1347
    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
  1348
    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
  1349
        ((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
  1350
      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
  1351
      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
  1352
      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
  1353
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1354
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1355
qed
291
93db7414931d More naming of lemmas, cleanup of Abacus and NatBijection
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 290
diff changeset
  1356
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1357
lemma inv_locate_a_via_crsp[simp]:
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1358
 "crsp ly (as, lm) (s, l, r) ires \<Longrightarrow> inv_locate_a (as, lm) (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
  1359
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
  1360
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1361
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1362
lemma findnth_correct: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1363
  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
  1364
  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
  1365
  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
  1366
              \<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
  1367
  using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1368
  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
  1369
  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
  1370
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1371
  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
  1372
  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
  1373
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1374
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1375
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1376
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
  1377
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1378
  "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
  1379
              (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
  1380
                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
  1381
                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
  1382
                   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
  1383
                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
  1384
                   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
  1385
                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
  1386
                   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
  1387
                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
  1388
                   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
  1389
                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
  1390
                   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
  1391
                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
  1392
                   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
  1393
                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
  1394
                   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
  1395
                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
  1396
                   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
  1397
                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
  1398
                   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
  1399
                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
  1400
                   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
  1401
                else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1402
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1403
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1404
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
  1405
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1406
  "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
  1407
            (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
  1408
             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
  1409
             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
  1410
             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
  1411
             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
  1412
             else 1)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1413
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1414
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
  1415
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1416
  "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
  1417
                (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
  1418
                 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
  1419
                 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
  1420
                 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
  1421
                 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
  1422
                 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
  1423
                                  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
  1424
                                  else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1425
                 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
  1426
                 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
  1427
                 else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1428
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1429
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
  1430
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1431
  "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
  1432
              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
  1433
              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
  1434
              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
  1435
                   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
  1436
                   else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1437
              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
  1438
              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
  1439
              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
  1440
                      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
  1441
                      else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1442
              else 10 - s)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1443
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1444
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1445
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
  1446
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1447
  "inc_measure c = 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1448
    (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
  1449
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1450
definition lex_triple :: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1451
   "((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
  1452
  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
  1453
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1454
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
  1455
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1456
  "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
  1457
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1458
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
  1459
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1460
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
  1461
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
  1462
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1463
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
  1464
      "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
  1465
      \<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
  1466
          (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
  1467
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
  1468
                 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
  1469
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
  1470
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
  1471
      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
  1472
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
  1473
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
  1474
apply(subgoal_tac "lm2 = []", simp)
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1475
  apply(drule_tac length_equal, simp)
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1476
  by (metis (no_types, lifting) add_diff_inverse_nat append.assoc append_eq_append_conv length_append length_replicate list.inject)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1477
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1478
(*inv: from after_write to after_move*)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1479
lemma inv_after_move_Oc_via_write[simp]: "inv_after_write (as, lm) (x, l, Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1480
                \<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
  1481
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
  1482
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1483
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1484
lemma inv_after_write_Suc[simp]: "inv_after_write (as, abc_lm_s am n (Suc (abc_lm_v am n)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1485
                )) (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
  1486
 "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
  1487
                        (x, aaa, []) ires = False"
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1488
apply(auto simp: inv_after_write.simps )
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1489
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1490
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1491
(*inv: from after_move to after_clear*)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1492
lemma inv_after_clear_Bk_via_Oc[simp]: "inv_after_move (as, lm) (s, l, Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1493
                \<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
  1494
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
  1495
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1496
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1497
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1498
lemma inv_after_move_2_inv_on_left_moving[simp]:  
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1499
  assumes "inv_after_move (as, lm) (s, l, Bk # r) ires"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1500
  shows "(l = [] \<longrightarrow> 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1501
         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
  1502
      (l \<noteq> [] \<longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1503
         inv_on_left_moving (as, lm) (s', tl l, hd l # Bk # r) ires)"
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1504
proof (cases l)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1505
  case (Cons a list)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1506
  from assms Cons show ?thesis
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1507
    apply(simp only: inv_after_move.simps inv_on_left_moving.simps)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1508
    apply(rule conjI, force, rule impI, rule disjI1, simp only: inv_on_left_moving_norm.simps)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1509
    apply(erule exE)+
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1510
    apply(subgoal_tac "lm2 = []")
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1511
    apply(rule_tac x = lm1 in exI, rule_tac x = lm2 in exI,  
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1512
        rule_tac x = m in exI, rule_tac x = m in exI, 
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1513
        rule_tac x = 1 in exI,  
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1514
        rule_tac x = "rn - 1" in exI) apply (auto split:if_splits)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1515
    apply(case_tac [1-2] rn, simp_all)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1516
    by(case_tac [!] lm2, simp_all add: tape_of_nl_cons split: if_splits)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1517
next
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1518
  case Nil thus ?thesis using assms
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1519
    unfolding inv_after_move.simps inv_on_left_moving.simps
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1520
    by (auto split:if_splits)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1521
qed
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1522
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
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
  1525
    "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
  1526
      \<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
  1527
          (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
  1528
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
  1529
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
  1530
        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
  1531
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1532
apply(subgoal_tac "lm2 = []")
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1533
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
  1534
      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
  1535
      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
  1536
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
  1537
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
  1538
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1539
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1540
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
  1541
     "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
  1542
      \<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
  1543
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
  1544
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
  1545
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
  1546
      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
  1547
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
  1548
apply(simp, rule conjI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1549
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
  1550
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
  1551
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
  1552
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1553
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1554
(*inv: from on_right_moving to on_right_movign*)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1555
lemma inv_on_right_moving_Oc[simp]: "inv_on_right_moving (as, lm) (x, l, Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1556
      \<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
  1557
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
  1558
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
  1559
           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
  1560
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
  1561
           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
  1562
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
  1563
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
  1564
      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
  1565
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
  1566
      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
  1567
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
  1568
done
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 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
  1571
     "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
  1572
     \<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
  1573
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
  1574
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
  1575
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1576
      
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1577
lemma inv_on_right_moving_singleton_Bk[simp]: "inv_on_right_moving (as, lm) (x, l, []) ires\<Longrightarrow> 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1578
             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
  1579
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
  1580
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
  1581
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1582
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1583
(*inv: from on_left_moving to on_left_moving*)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1584
lemma no_inv_on_left_moving_in_middle_B_Oc[simp]: "inv_on_left_moving_in_middle_B (as, lm) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1585
               (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
  1586
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
  1587
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1588
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1589
lemma no_inv_on_left_moving_norm_Bk[simp]: "inv_on_left_moving_norm (as, lm) (s, l, Bk # r) ires 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1590
             = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1591
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
  1592
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
  1593
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1594
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1595
lemma inv_on_left_moving_in_middle_B_Bk[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1596
  "\<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
  1597
    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
  1598
     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
  1599
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
  1600
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
  1601
                 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
  1602
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1603
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
  1604
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
  1605
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
  1606
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
  1607
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1608
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1609
lemma inv_on_left_moving_norm_Oc_Oc[simp]: "\<lbrakk>inv_on_left_moving_norm (as, lm) (s, l, Oc # r) ires; 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1610
                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
  1611
            \<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
  1612
                                        (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
  1613
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
  1614
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1615
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
  1616
      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
  1617
      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
  1618
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
  1619
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1620
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1621
lemma inv_on_left_moving_in_middle_B_Bk_Oc[simp]: "inv_on_left_moving_norm (as, lm) (s, [], Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1622
     \<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
  1623
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
  1624
                 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
  1625
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1626
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1627
lemma inv_on_left_moving_Oc_cases[simp]:"inv_on_left_moving (as, lm) (s, l, Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1628
    \<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
  1629
 \<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
  1630
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
  1631
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
  1632
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
  1633
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1634
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1635
lemma from_on_left_moving_to_check_left_moving[simp]: "inv_on_left_moving_in_middle_B (as, lm) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1636
                                      (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
  1637
          \<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
  1638
                                      (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
  1639
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
  1640
                 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
  1641
apply(case_tac [!] "rev lm1", simp_all)
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  1642
apply(case_tac [!] lista, simp_all add: tape_of_nat_def tape_of_list_def)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1643
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1644
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1645
lemma inv_check_left_moving_in_middle_no_Bk[simp]:
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1646
    "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
  1647
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
  1648
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1649
lemma inv_check_left_moving_on_leftmost_Bk_Bk[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1650
 "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
  1651
  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
  1652
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
  1653
                 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
  1654
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1655
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1656
lemma inv_check_left_moving_on_leftmost_no_Oc[simp]: "inv_check_left_moving_on_leftmost (as, lm) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1657
                                       (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
  1658
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
  1659
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1660
lemma inv_check_left_moving_in_middle_Oc_Bk[simp]: "inv_on_left_moving_in_middle_B (as, lm) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1661
                                         (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
  1662
 \<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
  1663
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
  1664
                 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
  1665
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1666
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1667
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
  1668
 "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
  1669
 \<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
  1670
 \<and> (l \<noteq> [] \<longrightarrow> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1671
      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
  1672
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
  1673
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
  1674
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
  1675
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1676
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1677
lemma inv_on_left_moving_norm_no_empty[simp]: "inv_on_left_moving_norm (as, lm) (s, l, []) ires = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1678
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
  1679
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1680
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1681
lemma inv_on_left_moving_no_empty[simp]: "inv_on_left_moving (as, lm) (s, l, []) ires = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1682
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
  1683
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
  1684
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1685
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1686
lemma Bk_plus_one[intro]: "\<exists>rna. Bk # Bk \<up> rn = Bk \<up> rna"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1687
  apply(rule_tac x = "Suc rn" in exI, simp)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1688
  done
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1689
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1690
lemma 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1691
inv_check_left_moving_in_middle_2_on_left_moving_in_middle_B[simp]:
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1692
assumes "inv_check_left_moving_in_middle (as, lm) (s, Bk # list, Oc # r) ires"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1693
shows "inv_on_left_moving_in_middle_B (as, lm) (s', list, Bk # Oc # r) ires"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1694
  using assms
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1695
  apply(simp only: inv_check_left_moving_in_middle.simps 
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1696
                   inv_on_left_moving_in_middle_B.simps)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1697
  apply(erule_tac exE)+
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1698
  apply(rule_tac x = "rev (tl (rev lm1))" in exI, 
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1699
        rule_tac x = "[hd (rev lm1)] @ lm2" in exI, auto)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1700
  apply(case_tac [!] "rev lm1",simp_all add: tape_of_nat_def tape_of_list_def tape_of_nat_list.simps)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1701
  apply(case_tac [!] a, simp_all)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1702
  apply(case_tac [1] lm2, auto simp:tape_of_nat_def)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1703
  apply(case_tac [3] lm2, auto simp:tape_of_nat_def)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1704
  apply(case_tac [!] lista, simp_all add: tape_of_nat_def)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1705
        done
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1706
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1707
lemma inv_check_left_moving_in_middle_Bk_Oc[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1708
 "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
  1709
     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
  1710
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
  1711
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1712
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1713
lemma inv_on_left_moving_norm_Oc_Oc_via_middle[simp]: "inv_check_left_moving_in_middle (as, lm) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1714
                       (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
  1715
   \<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
  1716
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
  1717
                 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
  1718
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
  1719
      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
  1720
apply(rule_tac conjI)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1721
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
  1722
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
  1723
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
  1724
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
  1725
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
  1726
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1727
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1728
lemma inv_check_left_moving_Oc_cases[simp]: "inv_check_left_moving (as, lm) (s, l, Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1729
\<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
  1730
   (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
  1731
apply(case_tac l, 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1732
      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
  1733
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
  1734
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1735
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1736
(*inv: check_left_moving to after_left_moving*)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1737
lemma inv_after_left_moving_Bk_via_check[simp]: "inv_check_left_moving (as, lm) (s, l, Bk # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1738
                \<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
  1739
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
  1740
 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
  1741
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1742
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1743
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1744
lemma inv_after_left_moving_Bk_empty_via_check[simp]:"inv_check_left_moving (as, lm) (s, l, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1745
      \<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
  1746
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
  1747
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
  1748
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
  1749
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1750
(*inv: after_left_moving to inv_stop*)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1751
lemma inv_stop_Bk_move[simp]: "inv_after_left_moving (as, lm) (s, l, Bk # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1752
       \<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
  1753
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
  1754
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1755
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1756
lemma inv_stop_Bk_empty[simp]: "inv_after_left_moving (as, lm) (s, l, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1757
             \<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
  1758
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
  1759
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1760
(*inv: stop to stop*)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1761
lemma inv_stop_indep_fst[simp]: "inv_stop (as, lm) (x, l, r) ires \<Longrightarrow> 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1762
               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
  1763
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
  1764
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1765
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1766
lemma inv_after_clear_no_Oc[simp]: "inv_after_clear (as, lm) (s, aaa, Oc # xs) ires= False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1767
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
  1768
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1769
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1770
lemma inv_after_left_moving_no_Oc[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1771
  "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
  1772
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
  1773
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1774
lemma inv_after_clear_Suc_nonempty[simp]:
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1775
  "inv_after_clear (as, abc_lm_s lm n (Suc (abc_lm_v lm n))) (s, b, []) ires = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1776
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
  1777
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1778
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1779
lemma inv_on_left_moving_Suc_nonempty[simp]: "inv_on_left_moving (as, abc_lm_s lm n (Suc (abc_lm_v lm n))) 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1780
           (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
  1781
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
  1782
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1783
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1784
lemma inv_check_left_moving_Suc_nonempty[simp]:
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1785
  "inv_check_left_moving (as, abc_lm_s lm n (Suc (abc_lm_v lm n))) (s, b, Oc # list) ires \<Longrightarrow> b \<noteq> []"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1786
apply(auto simp: inv_check_left_moving.simps inv_check_left_moving_in_middle.simps split: if_splits)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1787
  done
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
  1788
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1789
lemma tinc_correct_pre:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1790
  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
  1791
  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
  1792
  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
  1793
  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
  1794
  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
  1795
  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
  1796
  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
  1797
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
  1798
  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
  1799
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1800
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1801
    using inv_start
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1802
    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
  1803
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1804
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1805
  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
  1806
    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
  1807
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1808
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1809
  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
  1810
        \<in> inc_LE"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1811
  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
  1812
      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
  1813
    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
  1814
    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
  1815
    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
  1816
      apply(simp add:Q)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1817
      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
  1818
      apply(case_tac c, case_tac [2] aa)
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
  1819
      apply(auto simp: Let_def step.simps tinc_b_def split: if_splits)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1820
      apply(simp_all add: inc_inv.simps inc_LE_def lex_triple_def lex_pair_def inc_measure_def 
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1821
                          numeral)         
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1822
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1823
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1824
qed
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1825
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1826
lemma tinc_correct: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1827
  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
  1828
  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
  1829
  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
  1830
  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
  1831
              \<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
  1832
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1833
  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
  1834
  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
  1835
  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
  1836
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1837
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1838
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
  1839
        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
  1840
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  1841
lemma is_even_4[simp]: "(4::nat) * n mod 2 = 0"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1842
apply(arith)
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 crsp_step_inc_pre:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1846
  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
  1847
  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
  1848
  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
  1849
  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
  1850
        = (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
  1851
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1852
  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
  1853
    \<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
  1854
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1855
    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
  1856
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1857
  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
  1858
    "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
  1859
    \<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
  1860
  moreover have
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1861
    "\<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
  1862
                        \<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
  1863
    using assms a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1864
  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
  1865
      simp, simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1866
    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
  1867
      using aexec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1868
      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
  1869
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1870
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1871
  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
  1872
    "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
  1873
    \<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
  1874
  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
  1875
    = (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
  1876
    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
  1877
    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
  1878
    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
  1879
    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
  1880
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1881
qed 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1882
     
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1883
lemma crsp_step_inc:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1884
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1885
  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
  1886
  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
  1887
  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
  1888
  (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
  1889
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
  1890
  fix a b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1891
  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
  1892
  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
  1893
        = (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
  1894
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1895
    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
  1896
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1897
  thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1898
    using assms aexec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1899
    apply(erule_tac exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1900
    apply(erule_tac exE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1901
    apply(erule_tac conjE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1902
    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
  1903
    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
  1904
    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
  1905
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1906
qed
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1907
    
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  1908
subsection{* Crsp of Dec n e*}
190
f1ecb4a68a54 renamed sete definition to adjust and old special case of adjust to adjust0
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 181
diff changeset
  1909
declare adjust.simps[simp del]
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1910
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1911
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
  1912
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1913
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
  1914
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1915
  "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
  1916
               (\<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
  1917
         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
  1918
             (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
  1919
                          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
  1920
    ((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
  1921
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1922
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
  1923
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1924
  "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
  1925
   (\<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
  1926
                             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
  1927
   (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
  1928
                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
  1929
   ((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
  1930
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1931
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
  1932
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1933
  "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
  1934
              (\<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
  1935
                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
  1936
               (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
  1937
                            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
  1938
               (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
  1939
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1940
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
  1941
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1942
  "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
  1943
         (\<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
  1944
       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
  1945
       (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
  1946
                    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
  1947
       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
  1948
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1949
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
  1950
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1951
  "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
  1952
        (\<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
  1953
            \<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
  1954
              (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
  1955
                          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
  1956
           \<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
  1957
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1958
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
  1959
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1960
  "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
  1961
        (\<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
  1962
           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
  1963
           (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
  1964
                       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
  1965
           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
  1966
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1967
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
  1968
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1969
  "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
  1970
    (\<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
  1971
    rn > 0 \<and> 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1972
   (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
  1973
    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
  1974
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1975
declare
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1976
  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
  1977
  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
  1978
  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
  1979
  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
  1980
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1981
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
  1982
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1983
  "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
  1984
    (\<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
  1985
     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
  1986
     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
  1987
     (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
  1988
      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
  1989
     (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
  1990
  )"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1991
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1992
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
  1993
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  1994
  "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
  1995
           (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
  1996
            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
  1997
            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
  1998
              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
  1999
              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
  2000
              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
  2001
                  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
  2002
              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
  2003
                  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
  2004
              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
  2005
                  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
  2006
              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
  2007
                  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
  2008
              else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2009
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2010
declare fetch.simps[simp del]
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2011
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2012
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2013
lemma x_plus_helpers:
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2014
  "x + 4 = Suc (x + 3)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2015
  "x + 5 = Suc (x + 4)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2016
  "x + 6 = Suc (x + 5)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2017
  "x + 7 = Suc (x + 6)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2018
  "x + 8 = Suc (x + 7)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2019
  "x + 9 = Suc (x + 8)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2020
  "x + 10 = Suc (x + 9)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2021
  "x + 11 = Suc (x + 10)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2022
  "x + 12 = Suc (x + 11)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2023
  "x + 13 = Suc (x + 12)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2024
  "14 + x = Suc (x + 13)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2025
  "15 + x = Suc (x + 14)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2026
  "16 + x = Suc (x + 15)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2027
  by auto
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2028
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2029
lemma fetch_Dec[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2030
  "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
  2031
  "fetch (ci ly (start_of ly as) (Dec n e)) (Suc (2 * n)) Oc = (R,  Suc (start_of ly as) + 2 *n)"
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2032
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (Suc (Suc (2 * n))) Oc
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2033
     = (R, start_of ly as + 2*n + 2)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2034
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (Suc (Suc (2 * n))) Bk
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2035
     = (L, start_of ly as + 2*n + 13)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2036
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (Suc (Suc (Suc (2 * n)))) Oc
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2037
     = (R, start_of ly as + 2*n + 2)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2038
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (Suc (Suc (Suc (2 * n)))) Bk
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2039
     = (L, start_of ly as + 2*n + 3)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2040
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 4) Oc = (W0, start_of ly as + 2*n + 3)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2041
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 4) Bk = (R, start_of ly as + 2*n + 4)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2042
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 5) Bk = (R, start_of ly as + 2*n + 5)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2043
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 6) Bk = (L, start_of ly as + 2*n + 6)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2044
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 6) Oc = (L, start_of ly as + 2*n + 7)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2045
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 7) Bk = (L, start_of ly as + 2*n + 10)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2046
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 8) Bk = (W1, start_of ly as + 2*n + 7)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2047
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 8) Oc = (R, start_of ly as + 2*n + 8)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2048
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 9) Bk = (L, start_of ly as + 2*n + 9)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2049
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 9) Oc = (R, start_of ly as + 2*n + 8)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2050
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 10) Bk = (R, start_of ly as + 2*n + 4)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2051
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 10) Oc = (W0, start_of ly as + 2*n + 9)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2052
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 11) Oc = (L, start_of ly as + 2*n + 10)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2053
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 11) Bk = (L, start_of ly as + 2*n + 11)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2054
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 12) Oc = (L, start_of ly as + 2*n + 10)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2055
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 12) Bk = (R, start_of ly as + 2*n + 12)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2056
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (2 * n + 13) Bk = (R, start_of ly as + 2*n + 16)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2057
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (14 + 2 * n) Oc = (L, start_of ly as + 2*n + 13)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2058
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (14 + 2 * n) Bk = (L, start_of ly as + 2*n + 14)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2059
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (15 + 2 * n) Oc = (L, start_of ly as + 2*n + 13)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2060
  "fetch (ci (ly) (start_of ly as) (Dec n e)) (15 + 2 * n) Bk = (R, start_of ly as + 2*n + 15)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2061
  "fetch (ci (ly) (start_of (ly) as) (Dec n e)) (16 + 2 * n) Bk = (R, start_of (ly) e)"
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2062
  unfolding x_plus_helpers fetch.simps
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2063
  by(auto simp: ci.simps findnth.simps 
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2064
                  nth_of.simps shift.simps nth_append tdec_b_def length_findnth adjust.simps)
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2065
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2066
lemma steps_start_of_invb_inv_locate_a1[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2067
  "\<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
  2068
    \<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
  2069
  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
  2070
  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
  2071
  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
  2072
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
  2073
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
  2074
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
  2075
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2076
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2077
lemma steps_start_of_invb_inv_locate_a2[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2078
  "\<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
  2079
    \<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
  2080
  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
  2081
  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
  2082
  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
  2083
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
  2084
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
  2085
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
  2086
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2087
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2088
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
  2089
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2090
  "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
  2091
       (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
  2092
        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
  2093
        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
  2094
        else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2095
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2096
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
  2097
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2098
  "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
  2099
       (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
  2100
        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
  2101
        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
  2102
        else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2103
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2104
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
  2105
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2106
  "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
  2107
        (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
  2108
             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
  2109
                         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
  2110
                         else length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2111
         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
  2112
             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
  2113
             else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2114
         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
  2115
             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
  2116
         else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2117
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2118
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
  2119
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2120
  "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
  2121
                   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
  2122
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2123
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
  2124
  "((config \<times> nat \<times>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2125
  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
  2126
  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
  2127
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2128
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
  2129
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
  2130
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2131
lemma startof_Suc2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2132
  "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
  2133
        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
  2134
            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
  2135
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
  2136
                 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
  2137
                 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
  2138
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2139
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2140
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
  2141
  "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
  2142
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
  2143
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
  2144
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2145
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2146
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
  2147
proof(induct d)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2148
  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
  2149
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2150
  case (Suc d)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2151
  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
  2152
  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
  2153
    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
  2154
  ultimately show"?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2155
    by(simp)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2156
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2157
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2158
lemma start_of_less: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2159
  assumes "e < as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2160
  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
  2161
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2162
  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
  2163
    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
  2164
  thus "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2165
    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
  2166
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2167
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2168
lemma start_of_ge: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2169
  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
  2170
  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
  2171
  and great: "e > as"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2172
  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
  2173
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
  2174
  case True
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2175
  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
  2176
  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
  2177
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2178
    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
  2179
  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
  2180
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2181
  case False
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2182
  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
  2183
  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
  2184
  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
  2185
    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
  2186
  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
  2187
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2188
    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
  2189
  ultimately show "?thesis"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2190
    by arith
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2191
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2192
    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2193
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
  2194
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2195
lemma start_of_ineq1[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2196
 "\<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
  2197
   \<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
  2198
        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
  2199
        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
  2200
        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
  2201
        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
  2202
        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
  2203
        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
  2204
        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
  2205
        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
  2206
        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
  2207
        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
  2208
        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
  2209
        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
  2210
        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
  2211
        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
  2212
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
  2213
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
  2214
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
  2215
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2216
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2217
lemma start_of_ineq2[simp]: "\<lbrakk>abc_fetch as aprog = Some (Dec n e); ly = layout_of aprog\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2218
      \<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
  2219
          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
  2220
          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
  2221
          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
  2222
          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
  2223
          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
  2224
          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
  2225
          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
  2226
          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
  2227
          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
  2228
          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
  2229
          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
  2230
          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
  2231
          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
  2232
          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
  2233
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
  2234
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
  2235
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
  2236
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2237
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2238
lemma inv_locate_b_nonempty[simp]: "inv_locate_b (as, lm) (n, [], []) ires = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2239
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
  2240
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2241
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2242
lemma inv_locate_b_no_Bk[simp]: "inv_locate_b (as, lm) (n, [], Bk # list) ires = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2243
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
  2244
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2245
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2246
lemma dec_first_on_right_moving_Oc[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2247
 "\<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
  2248
   \<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
  2249
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
  2250
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2251
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
  2252
      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
  2253
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
  2254
      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
  2255
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
  2256
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2257
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2258
lemma dec_first_on_right_moving_Bk_nonempty[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2259
  "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
  2260
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
  2261
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2262
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2263
lemma replicateE[elim]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2264
  "\<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
  2265
    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
  2266
                                                lm1 @ m # lm2;
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2267
    0 < m\<rbrakk>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2268
   \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2269
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
  2270
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
  2271
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2272
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2273
lemma dec_after_clear_Bk_strip_hd[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2274
 "\<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
  2275
                   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
  2276
\<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
  2277
                 (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
  2278
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
  2279
                 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
  2280
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2281
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
  2282
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
  2283
      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
  2284
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
  2285
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2286
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2287
lemma dec_first_on_right_moving_dec_after_clear_cases[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2288
 "\<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
  2289
                   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
  2290
\<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
  2291
             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
  2292
    (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
  2293
                      (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
  2294
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
  2295
      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
  2296
                 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
  2297
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2298
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
  2299
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
  2300
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
  2301
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
  2302
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2303
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2304
lemma dec_after_clear_Bk_via_Oc[simp]: "\<lbrakk>dec_after_clear (as, am) (s, l, Oc # r) ires\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2305
                \<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
  2306
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
  2307
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2308
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2309
lemma dec_right_move_Bk_via_clear_Bk[simp]: "\<lbrakk>dec_after_clear (as, am) (s, l, Bk # r) ires\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2310
                \<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
  2311
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
  2312
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2313
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2314
lemma dec_right_move_Bk_Bk_via_clear[simp]: "\<lbrakk>dec_after_clear (as, am) (s, l, []) ires\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2315
             \<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
  2316
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
  2317
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2318
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2319
lemma dec_right_move_no_Oc[simp]:"dec_right_move (as, am) (s, l, Oc # r) ires = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2320
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
  2321
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2322
              
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2323
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
  2324
     "\<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
  2325
      \<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
  2326
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
  2327
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2328
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2329
lemma lm_iff_empty[simp]: "(<lm::nat list> = []) = (lm = [])"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2330
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
  2331
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2332
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2333
lemma dec_right_move_asif_Bk_singleton[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2334
 "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
  2335
  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
  2336
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
  2337
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2338
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2339
lemma dec_check_right_move_nonempty[simp]: "dec_check_right_move (as, am) (s, l, r) ires\<Longrightarrow> l \<noteq> []"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2340
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
  2341
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2342
 
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2343
lemma dec_check_right_move_Oc_tail[simp]: "\<lbrakk>dec_check_right_move (as, am) (s, l, Oc # r) ires\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2344
             \<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
  2345
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
  2346
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
  2347
      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
  2348
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2349
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2350
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2351
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2352
lemma dec_left_move_Bk_tail[simp]: "\<lbrakk>dec_check_right_move (as, am) (s, l, Bk # r) ires\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2353
                \<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
  2354
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
  2355
                 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
  2356
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
  2357
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
  2358
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
  2359
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2360
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2361
lemma dec_left_move_tail[simp]: "\<lbrakk>dec_check_right_move (as, am) (s, l, []) ires\<rbrakk>
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2362
             \<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
  2363
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
  2364
                 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
  2365
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
  2366
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2367
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2368
lemma dec_left_move_no_Oc[simp]: "dec_left_move (as, am) (s, aaa, Oc # xs) ires = False"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2369
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
  2370
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2371
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2372
lemma dec_left_move_nonempty[simp]: "dec_left_move (as, am) (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
  2373
             \<Longrightarrow> l \<noteq> []"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2374
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
  2375
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2376
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2377
lemma inv_on_left_moving_in_middle_B_Oc_Bk_Bks[simp]: "inv_on_left_moving_in_middle_B (as, [m])
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2378
  (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
  2379
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
  2380
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
  2381
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2382
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2383
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2384
lemma inv_on_left_moving_in_middle_B_Oc_Bk_Bks_rev[simp]: "lm1 \<noteq> [] \<Longrightarrow> 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2385
  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
  2386
  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
  2387
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
  2388
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
  2389
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
  2390
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2391
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2392
lemma inv_on_left_moving_Bk_tail[simp]: "dec_left_move (as, am) (s, l, Bk # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2393
       \<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
  2394
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
  2395
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2396
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2397
lemma inv_on_left_moving_tail[simp]: "dec_left_move (as, am) (s, l, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2398
             \<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
  2399
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
  2400
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2401
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2402
lemma dec_on_right_moving_Oc_mv[simp]: "dec_after_write (as, am) (s, l, Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2403
       \<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
  2404
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
  2405
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
  2406
      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
  2407
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
  2408
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
  2409
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2410
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2411
lemma dec_after_write_Oc_via_Bk[simp]: "dec_after_write (as, am) (s, l, Bk # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2412
       \<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
  2413
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
  2414
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2415
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2416
lemma dec_after_write_Oc_empty[simp]: "dec_after_write (as, am) (s, aaa, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2417
             \<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
  2418
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
  2419
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2420
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2421
lemma dec_on_right_moving_Oc_move[simp]: "dec_on_right_moving (as, am) (s, l, Oc # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2422
       \<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
  2423
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
  2424
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2425
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2426
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
  2427
      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
  2428
      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
  2429
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
  2430
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2431
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2432
lemma dec_on_right_moving_nonempty[simp]: "dec_on_right_moving (as, am) (s, l, r) ires\<Longrightarrow>  l \<noteq> []"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2433
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
  2434
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2435
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2436
lemma dec_after_clear_Bk_tail[simp]: "dec_on_right_moving (as, am) (s, l, Bk # r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2437
      \<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
  2438
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
  2439
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
  2440
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2441
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2442
lemma dec_after_clear_tail[simp]: "dec_on_right_moving (as, am) (s, l, []) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2443
             \<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
  2444
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
  2445
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
  2446
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
  2447
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2448
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2449
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
  2450
 "\<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
  2451
  \<Longrightarrow> False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2452
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
  2453
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
  2454
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
  2455
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
  2456
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
  2457
                   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
  2458
      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
  2459
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
  2460
                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
  2461
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
  2462
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
  2463
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
  2464
                       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
  2465
      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
  2466
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2467
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2468
lemma inv_on_left_moving_Bk_tl[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2469
 "\<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
  2470
   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
  2471
   \<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
  2472
                         (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
  2473
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
  2474
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
  2475
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2476
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
  2477
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
  2478
         (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
  2479
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
  2480
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2481
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
  2482
      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
  2483
      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
  2484
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
  2485
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
  2486
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
  2487
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2488
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2489
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2490
lemma inv_on_left_moving_tl[simp]:
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2491
 "\<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
  2492
   \<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
  2493
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
  2494
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
  2495
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2496
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
  2497
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
  2498
         (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
  2499
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
  2500
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2501
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
  2502
      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
  2503
      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
  2504
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
  2505
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
  2506
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
  2507
apply(case_tac [!] m, simp_all)
291
93db7414931d More naming of lemmas, cleanup of Abacus and NatBijection
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 290
diff changeset
  2508
  done
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2509
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2510
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
  2511
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2512
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
  2513
 
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2514
lemma dec_first_on_right_moving_Oc_via_inv_locate_n_b[simp]:
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2515
 "\<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
  2516
 \<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
  2517
                                      (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
  2518
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
  2519
                 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
  2520
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
  2521
      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
  2522
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
  2523
      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
  2524
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
  2525
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
  2526
      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
  2527
      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
  2528
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
  2529
      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
  2530
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
  2531
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
  2532
      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
  2533
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
  2534
      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
  2535
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
  2536
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
  2537
      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
  2538
      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
  2539
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2540
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2541
lemma inv_on_left_moving_nonempty[simp]: "inv_on_left_moving (as, am) (s, [], r) ires 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2542
  = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2543
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
  2544
                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
  2545
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2546
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2547
lemma inv_check_left_moving_startof_nonempty[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2548
  "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
  2549
  (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
  2550
 = False"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2551
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
  2552
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2553
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2554
lemma start_of_lessE[elim]: "\<lbrakk>abc_fetch as ap = Some (Dec n e);
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2555
                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
  2556
                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
  2557
       \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2558
  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
  2559
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
  2560
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
  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
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
  2564
  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
  2565
  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
  2566
  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
  2567
  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
  2568
  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
  2569
            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
  2570
  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
  2571
  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
  2572
  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
  2573
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
  2574
  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
  2575
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2576
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2577
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2578
    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
  2579
    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
  2580
    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
  2581
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2582
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2583
  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
  2584
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2585
    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
  2586
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2587
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2588
  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
  2589
    using fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2590
  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
  2591
    fix na
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2592
    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
  2593
    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
  2594
      apply(simp add: f)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2595
      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
  2596
        (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
  2597
    proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2598
      fix a b c 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2599
      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
  2600
      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
  2601
               ((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
  2602
                   (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
  2603
        apply(simp add: Q)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2604
        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
  2605
        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
  2606
        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
  2607
        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
  2608
        using dec_0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2609
        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
  2610
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2611
    qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2612
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2613
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2614
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2615
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
  2616
  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
  2617
  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
  2618
  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
  2619
  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
  2620
  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
  2621
       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
  2622
       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
  2623
       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
  2624
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2625
  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
  2626
  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
  2627
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2628
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2629
lemma crsp_abc_step_via_stop[simp]:
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2630
  "\<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
  2631
  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
  2632
  \<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
  2633
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
  2634
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2635
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2636
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
  2637
  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
  2638
  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
  2639
  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
  2640
  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
  2641
  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
  2642
  (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
  2643
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2644
  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
  2645
  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
  2646
  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
  2647
             \<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
  2648
    using inv_start
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2649
    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
  2650
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2651
  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
  2652
    "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
  2653
             \<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
  2654
  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
  2655
             \<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
  2656
    using assms a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2657
    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
  2658
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2659
  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
  2660
    "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
  2661
             \<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
  2662
  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
  2663
    (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
  2664
    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
  2665
    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
  2666
    using dec_0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2667
    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
  2668
    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
  2669
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2670
qed    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2671
  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2672
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
  2673
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2674
  "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
  2675
           (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
  2676
            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
  2677
            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
  2678
              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
  2679
              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
  2680
                      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
  2681
              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
  2682
                      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
  2683
              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
  2684
                      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
  2685
              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
  2686
                      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
  2687
              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
  2688
                      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
  2689
              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
  2690
                      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
  2691
              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
  2692
                      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
  2693
              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
  2694
                      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
  2695
              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
  2696
                      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
  2697
              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
  2698
                      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
  2699
              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
  2700
                      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
  2701
              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
  2702
                      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
  2703
              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
  2704
                      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
  2705
              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
  2706
                      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
  2707
              else False)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2708
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2709
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
  2710
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
  2711
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2712
  "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
  2713
              (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
  2714
               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
  2715
               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
  2716
               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
  2717
               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
  2718
               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
  2719
               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
  2720
               else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2721
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2722
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
  2723
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2724
  "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
  2725
       (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
  2726
        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
  2727
        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
  2728
        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
  2729
        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
  2730
        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
  2731
        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
  2732
              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
  2733
        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
  2734
              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
  2735
        else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2736
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2737
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
  2738
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2739
  "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
  2740
        (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
  2741
            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
  2742
                                          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
  2743
            else length r
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2744
         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
  2745
             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
  2746
             else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2747
         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
  2748
             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
  2749
             else 0 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2750
         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
  2751
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2752
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
  2753
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2754
  "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
  2755
          (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
  2756
           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
  2757
           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
  2758
               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
  2759
               else 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2760
           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
  2761
               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
  2762
               else 1
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2763
           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
  2764
               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
  2765
               else 0 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2766
           else 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2767
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2768
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
  2769
  where
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2770
  "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
  2771
  (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
  2772
  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
  2773
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2774
definition lex_square:: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2775
   "((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
  2776
  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
  2777
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2778
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
  2779
  "((config \<times> nat \<times>
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2780
  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
  2781
  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
  2782
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2783
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
  2784
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
  2785
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2786
lemma fix_add: "fetch ap ((x::nat) + 2*n) b = fetch ap (2*n + x) b"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  2787
  using Suc_1 add.commute by metis
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2788
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2789
lemma inv_locate_n_b_Bk_elim[elim]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2790
 "\<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
  2791
 \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2792
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
  2793
apply(case_tac [!] m, auto)
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2794
  done
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2795
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2796
lemma inv_locate_n_b_nonemptyE[elim]:
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2797
 "\<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
  2798
                                (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
  2799
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
  2800
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2801
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2802
lemma no_Ocs_dec_after_write[simp]: "dec_after_write (as, am) (s, aa, r) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2803
           \<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
  2804
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
  2805
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2806
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2807
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
  2808
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
  2809
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2810
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2811
lemma fewer_Ocs_dec_on_right_moving[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2812
     "\<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
  2813
       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
  2814
           \<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
  2815
    \<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
  2816
                       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
  2817
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
  2818
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2819
apply(erule_tac conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2820
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
  2821
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2822
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2823
lemma more_Ocs_dec_after_clear[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2824
  "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
  2825
             (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
  2826
 \<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
  2827
                             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
  2828
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
  2829
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2830
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2831
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
  2832
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2833
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2834
lemma more_Ocs_dec_after_clear2[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2835
 "\<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
  2836
       (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
  2837
    \<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
  2838
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
  2839
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2840
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2841
lemma inv_check_left_moving_nonemptyE[elim]: 
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2842
  "inv_check_left_moving (as, lm) (s, [], Oc # xs) ires
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2843
 \<Longrightarrow> RR"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2844
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
  2845
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2846
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2847
lemma inv_locate_n_b_Oc_via_at_begin_norm[simp]:
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2848
"\<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
  2849
  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
  2850
  \<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
  2851
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
  2852
apply(erule_tac exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2853
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
  2854
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
  2855
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
  2856
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
  2857
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2858
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2859
lemma inv_locate_n_b_Oc_via_at_begin_fst_awtn[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2860
 "\<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
  2861
   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
  2862
 \<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
  2863
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
  2864
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2865
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2866
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
  2867
      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
  2868
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
  2869
apply(rule conjI)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2870
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2871
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2872
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2873
lemma inv_locate_n_b_Oc_via_inv_locate_n_a[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2874
 "\<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
  2875
 \<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
  2876
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
  2877
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2878
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2879
lemma more_Oc_dec_on_right_moving[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2880
 "\<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
  2881
   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
  2882
   \<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
  2883
  \<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
  2884
    < 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
  2885
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
  2886
apply(erule exE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2887
apply(erule conjE)+
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2888
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
  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 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
  2892
  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
  2893
  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
  2894
  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
  2895
  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
  2896
  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
  2897
  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
  2898
            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
  2899
  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
  2900
  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
  2901
  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
  2902
  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
  2903
  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
  2904
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2905
  show "Q (f 0)"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2906
    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
  2907
    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
  2908
    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
  2909
    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
  2910
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2911
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2912
  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
  2913
    using layout fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2914
    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
  2915
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2916
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2917
  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
  2918
    using fetch
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2919
  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
  2920
    fix na
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2921
    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
  2922
    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
  2923
      apply(simp add: f)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2924
      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
  2925
        (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
  2926
    proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2927
      fix a b c 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2928
      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
  2929
      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
  2930
               ((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
  2931
                   (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
  2932
        apply(simp add: Q)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2933
        apply(erule_tac conjE)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2934
        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
  2935
        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
  2936
        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
  2937
        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
  2938
        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
  2939
                         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
  2940
        done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2941
    qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2942
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2943
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2944
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  2945
lemma crsp_abc_step_l_start_of[simp]: 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2946
  "\<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
  2947
  (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
  2948
   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
  2949
   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
  2950
  \<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
  2951
  (start_of (layout_of ap) as + 2 * n + 16, a, b) ires"
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  2952
  by(auto simp: inv_stop.simps crsp.simps  abc_step_l.simps startof_Suc2)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2953
  
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2954
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
  2955
  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
  2956
  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
  2957
  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
  2958
  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
  2959
  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
  2960
  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
  2961
              (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
  2962
                  (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
  2963
  using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2964
  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
  2965
  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
  2966
  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
  2967
  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
  2968
  done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2969
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2970
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
  2971
  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
  2972
  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
  2973
  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
  2974
  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
  2975
  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
  2976
  (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
  2977
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2978
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
  2979
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
  2980
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
  2981
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2982
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2983
lemma crsp_step_dec: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2984
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  2985
  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
  2986
  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
  2987
  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
  2988
  (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
  2989
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
  2990
  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
  2991
  let ?A = "findnth n"
190
f1ecb4a68a54 renamed sete definition to adjust and old special case of adjust to adjust0
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 181
diff changeset
  2992
  let ?B = "adjust (shift (shift tdec_b (2 * n)) ?off) (start_of ly e)"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2993
  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
  2994
                    \<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
  2995
  proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2996
    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
  2997
                     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
  2998
      using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  2999
      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
  3000
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3001
    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
  3002
      "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
  3003
      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
  3004
    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
  3005
      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
  3006
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3007
    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
  3008
      using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3009
      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
  3010
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3011
    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
  3012
                    \<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
  3013
      using a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3014
      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
  3015
      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
  3016
      done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3017
  qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3018
  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
  3019
    "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
  3020
                    \<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
  3021
  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
  3022
           (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
  3023
    using assms a
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3024
    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
  3025
    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
  3026
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3027
  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
  3028
    "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
  3029
    (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
  3030
  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
  3031
    (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
  3032
    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
  3033
    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
  3034
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3035
qed    
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3036
  
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3037
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
  3038
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3039
lemma crsp_step_goto:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3040
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3041
  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
  3042
  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
  3043
  (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
  3044
            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
  3045
using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3046
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
  3047
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
  3048
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
  3049
  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
  3050
done
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3051
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3052
lemma crsp_step_in:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3053
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3054
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3055
  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
  3056
  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
  3057
  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
  3058
                      (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
  3059
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3060
  apply(case_tac ins, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3061
  apply(rule crsp_step_inc, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3062
  apply(rule crsp_step_dec, simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3063
  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
  3064
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3065
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3066
lemma crsp_step:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3067
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3068
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3069
  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
  3070
  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
  3071
  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
  3072
                      (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
  3073
proof -
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3074
  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
  3075
                      (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
  3076
    using assms
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3077
    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
  3078
    done
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3079
  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
  3080
                      (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
  3081
  obtain s' l' r' where e:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3082
    "(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
  3083
    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
  3084
    by blast
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3085
  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
  3086
    using assms d
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3087
    apply(rule_tac steps_eq_in)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3088
    apply(simp_all)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3089
    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
  3090
    done    
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3091
  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
  3092
    using d e
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3093
    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
  3094
    done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3095
qed
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3096
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3097
lemma crsp_steps:
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3098
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3099
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3100
  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
  3101
  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
  3102
                      (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
  3103
  using crsp
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3104
  apply(induct n)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3105
  apply(rule_tac x = 0 in exI) 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3106
  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
  3107
  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
  3108
  apply(frule_tac abc_step_red, simp)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3109
  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
  3110
  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
  3111
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3112
  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
  3113
  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
  3114
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3115
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3116
lemma tp_correct': 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3117
  assumes layout: "ly = layout_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3118
  and compile: "tp = tm_of ap"
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3119
  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
  3120
  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
  3121
  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
  3122
  using assms
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3123
  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
  3124
  apply(rule_tac x = stpa in exI)
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3125
  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
  3126
  done
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3127
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3128
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
  3129
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3130
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
  3131
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
  3132
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3133
290
6e1c03614d36 Gave lemmas names in Abacus.ty
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 288
diff changeset
  3134
lemma map_start_of_layout[simp]:  
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3135
  "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
  3136
apply(auto)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3137
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
  3138
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3139
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3140
lemma tpairs_id_cons: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3141
  "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
  3142
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
  3143
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3144
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3145
lemma map_length_ci:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3146
  "(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
  3147
  (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
  3148
apply(auto)
190
f1ecb4a68a54 renamed sete definition to adjust and old special case of adjust to adjust0
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 181
diff changeset
  3149
apply(case_tac b, auto simp: ci.simps adjust.simps)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3150
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3151
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3152
lemma length_tp'[simp]: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3153
  "\<lbrakk>ly = layout_of ap; tp = tm_of ap\<rbrakk> \<Longrightarrow>
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  3154
       length tp = 2 * sum_list (take (length ap) (layout_of ap))"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3155
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
  3156
  case Nil
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3157
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3158
    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
  3159
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3160
  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
  3161
  assume ind: "\<And>ly tp. \<lbrakk>ly = layout_of xs; tp = tm_of xs\<rbrakk> \<Longrightarrow> 
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  3162
    length tp = 2 * sum_list (take (length xs) (layout_of xs))"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3163
  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
  3164
  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
  3165
  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
  3166
    by metis
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3167
  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
  3168
    by metis
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  3169
  have c: "length tp' = 2 * sum_list (take (length xs) (layout_of xs))"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3170
    using a b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3171
    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
  3172
  thus "length tp = 2 * 
288
a9003e6d0463 Up to date for Isabelle 2018. Gave names to simp rules in UF and UTM
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 285
diff changeset
  3173
    sum_list (take (length (xs @ [x])) (layout_of (xs @ [x])))"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3174
    using tp b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3175
    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
  3176
    apply(case_tac x)
190
f1ecb4a68a54 renamed sete definition to adjust and old special case of adjust to adjust0
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 181
diff changeset
  3177
    apply(auto simp: ci.simps tinc_b_def tdec_b_def length_findnth adjust.simps length_of.simps
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3178
                 split: abc_inst.splits)
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3179
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3180
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3181
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3182
lemma length_tp:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3183
  "\<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
  3184
  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
  3185
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
  3186
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
  3187
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3188
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3189
lemma compile_correct_halt: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3190
  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
  3191
  and compile: "tp = tm_of ap"
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3192
  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
  3193
  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
  3194
  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
  3195
  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
  3196
  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
  3197
  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
  3198
proof -
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3199
  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
  3200
    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
  3201
    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
  3202
  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
  3203
    by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3204
  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
  3205
    using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3206
    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
  3207
  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
  3208
    = (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
  3209
    using assms
173
b51cb9aef3ae split Mopup TM into a separate file
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 170
diff changeset
  3210
    by(rule_tac mopup_correct, auto simp: abc_lm_v.simps)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3211
  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
  3212
    "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
  3213
    = (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
  3214
  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
  3215
    = (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
  3216
    using assms wf_mopup
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3217
    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
  3218
    done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3219
  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
  3220
    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
  3221
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3222
 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3223
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
  3224
lemma abc_step_red2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3225
  "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
  3226
                                    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
  3227
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
  3228
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
  3229
done
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3230
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3231
lemma crsp_steps2:
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3232
  assumes 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3233
  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
  3234
  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
  3235
  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
  3236
  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
  3237
  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
  3238
  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
  3239
using nothalt aexec
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3240
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
  3241
  case 0
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3242
  thus "?case"
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3243
    using crsp
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3244
    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
  3245
next
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3246
  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
  3247
  have ind: 
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3248
    "\<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
  3249
    \<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
  3250
  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
  3251
  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
  3252
  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
  3253
    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
  3254
  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
  3255
    using a b
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3256
    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
  3257
      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
  3258
  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
  3259
    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
  3260
  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
  3261
    "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
  3262
    by blast
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3263
  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
  3264
    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
  3265
  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
  3266
    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
  3267
  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
  3268
    (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
  3269
    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
  3270
    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
  3271
  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
  3272
    (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
  3273
  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
  3274
    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
  3275
qed
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3276
    
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3277
lemma compile_correct_unhalt: 
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3278
  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
  3279
  and compile: "tp = tm_of ap"
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3280
  and crsp: "crsp ly (0, lm) (1, l, r) ires"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3281
  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
  3282
  and abc_unhalt: "\<forall> stp. (\<lambda> (as, am). as < length ap) (abc_steps_l (0, lm) ap stp)"
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3283
  shows "\<forall> stp.\<not> is_final (steps (1, l, r) (tp @ shift (mopup n) off, 0) stp)"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3284
using assms
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3285
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
  3286
  fix stp
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3287
  assume h: "is_final (steps (1, l, r) (tp @ shift (mopup n) off, 0) stp)"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3288
  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
  3289
    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
  3290
  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
  3291
    using abc_unhalt
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3292
    by(erule_tac x = stp in allE, simp)
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3293
  have "\<exists> stpa\<ge>stp. crsp ly (as, am) (steps (1, l, r) (tp, 0) stpa) ires "
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3294
    using assms b a
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3295
    apply(simp add: numeral)
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3296
    apply(rule_tac crsp_steps2)
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3297
    apply(simp_all)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3298
    done
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3299
  then obtain stpa where 
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3300
    "stpa\<ge>stp \<and> crsp ly (as, am) (steps (1, l, r) (tp, 0) stpa) ires" ..
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3301
  then obtain s' l' r' where b: "(steps (1, l, r) (tp, 0) stpa) = (s', l', r') \<and> 
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3302
       stpa\<ge>stp \<and> crsp ly (as, am) (s', l', r') ires"
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3303
    by(case_tac "steps (1, l, r) (tp, 0) stpa", auto)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3304
  hence c:
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3305
    "(steps (1, l, r) (tp @ shift (mopup n) off, 0) stpa) = (s', l', r')"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3306
    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
  3307
  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
  3308
    by(simp add: crsp.simps)
291
93db7414931d More naming of lemmas, cleanup of Abacus and NatBijection
Sebastiaan Joosten <sebastiaan.joosten@uibk.ac.at>
parents: 290
diff changeset
  3309
  then obtain diff where e: "stpa = stp + diff" by (metis le_iff_add)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3310
  obtain s'' l'' r'' where f:
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3311
    "steps (1, l, r) (tp @ shift (mopup n) off, 0) stp = (s'', l'', r'') \<and> is_final (s'', l'', r'')"
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3312
    using h
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3313
    by(case_tac "steps (1, l, r) (tp @ shift (mopup n) off, 0) stp", auto)
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3314
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3315
  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
  3316
    by(auto intro: after_is_final)
170
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3317
  then have "is_final (steps (1, l, r) (tp @ shift (mopup n) off, 0) stpa)"
eccd79a974ae updated some files
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 166
diff changeset
  3318
    using e f by simp
60
c8ff97d9f8da new version of abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 48
diff changeset
  3319
  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
  3320
qed
47
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3321
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3322
end
251e192339b7 added abacus
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
diff changeset
  3323