| 
69145
 | 
     1  | 
theory Array_Specs
  | 
| 
 | 
     2  | 
imports Main
  | 
| 
 | 
     3  | 
begin
  | 
| 
 | 
     4  | 
  | 
| 
 | 
     5  | 
text \<open>Array Specifications\<close>
  | 
| 
 | 
     6  | 
  | 
| 
 | 
     7  | 
locale Array =
  | 
| 
 | 
     8  | 
fixes lookup :: "'ar \<Rightarrow> nat \<Rightarrow> 'a"
  | 
| 
 | 
     9  | 
fixes update :: "nat \<Rightarrow> 'a \<Rightarrow> 'ar \<Rightarrow> 'ar"
  | 
| 
 | 
    10  | 
fixes len :: "'ar \<Rightarrow> nat"
  | 
| 
 | 
    11  | 
fixes array :: "'a list \<Rightarrow> 'ar"
  | 
| 
 | 
    12  | 
  | 
| 
 | 
    13  | 
fixes list :: "'ar \<Rightarrow> 'a list"
  | 
| 
 | 
    14  | 
fixes invar :: "'ar \<Rightarrow> bool"
  | 
| 
 | 
    15  | 
  | 
| 
 | 
    16  | 
assumes lookup: "invar ar \<Longrightarrow> n < len ar \<Longrightarrow> lookup ar n = list ar ! n"
  | 
| 
 | 
    17  | 
assumes update: "invar ar \<Longrightarrow> n < len ar \<Longrightarrow> list(update n x ar) = (list ar)[n:=x]"
  | 
| 
 | 
    18  | 
assumes len_array: "invar ar \<Longrightarrow> len ar = length (list ar)"
  | 
| 
 | 
    19  | 
assumes array: "list (array xs) = xs"
  | 
| 
 | 
    20  | 
  | 
| 
 | 
    21  | 
assumes invar_update: "invar ar \<Longrightarrow> n < len ar \<Longrightarrow> invar(update n x ar)"
  | 
| 
 | 
    22  | 
assumes invar_array: "invar(array xs)"
  | 
| 
 | 
    23  | 
  | 
| 
 | 
    24  | 
locale Array_Flex = Array +
  | 
| 
 | 
    25  | 
fixes add_lo :: "'a \<Rightarrow> 'ar \<Rightarrow> 'ar"
  | 
| 
 | 
    26  | 
fixes del_lo :: "'ar \<Rightarrow> 'ar"
  | 
| 
 | 
    27  | 
fixes add_hi :: "'a \<Rightarrow> 'ar \<Rightarrow> 'ar"
  | 
| 
 | 
    28  | 
fixes del_hi :: "'ar \<Rightarrow> 'ar"
  | 
| 
 | 
    29  | 
  | 
| 
 | 
    30  | 
assumes add_lo: "invar ar \<Longrightarrow> list(add_lo a ar) = a # list ar"
  | 
| 
 | 
    31  | 
assumes del_lo: "invar ar \<Longrightarrow> list(del_lo ar) = tl (list ar)"
  | 
| 
 | 
    32  | 
assumes add_hi: "invar ar \<Longrightarrow> list(add_hi a ar) = list ar @ [a]"
  | 
| 
 | 
    33  | 
assumes del_hi: "invar ar \<Longrightarrow> list(del_hi ar) = butlast (list ar)"
  | 
| 
 | 
    34  | 
  | 
| 
 | 
    35  | 
assumes invar_add_lo: "invar ar \<Longrightarrow> invar (add_lo a ar)"
  | 
| 
 | 
    36  | 
assumes invar_del_lo: "invar ar \<Longrightarrow> invar (del_lo ar)"
  | 
| 
 | 
    37  | 
assumes invar_add_hi: "invar ar \<Longrightarrow> invar (add_hi a ar)"
  | 
| 
 | 
    38  | 
assumes invar_del_hi: "invar ar \<Longrightarrow> invar (del_hi ar)"
  | 
| 
 | 
    39  | 
  | 
| 
 | 
    40  | 
end  |