src/HOL/Import/HOL/HOL4Vec.thy
author haftmann
Fri, 17 Jun 2005 16:12:49 +0200
changeset 16417 9bc16273c2d4
parent 15647 b1f486a9c56b
child 17188 a26a4fc323ed
permissions -rw-r--r--
migrated theory headers to new format
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15647
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
     1
(* AUTOMATICALLY GENERATED, DO NOT EDIT! *)
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
     2
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 15647
diff changeset
     3
theory HOL4Vec imports HOL4Base begin
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
     4
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
     5
;setup_theory res_quan
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
     6
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
     7
lemma RES_FORALL_CONJ_DIST: "ALL P Q R. RES_FORALL P (%i. Q i & R i) = (RES_FORALL P Q & RES_FORALL P R)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
     8
  by (import res_quan RES_FORALL_CONJ_DIST)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
     9
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    10
lemma RES_FORALL_DISJ_DIST: "ALL P Q R. RES_FORALL (%j. P j | Q j) R = (RES_FORALL P R & RES_FORALL Q R)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    11
  by (import res_quan RES_FORALL_DISJ_DIST)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    12
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    13
lemma RES_FORALL_UNIQUE: "ALL x xa. RES_FORALL (op = xa) x = x xa"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    14
  by (import res_quan RES_FORALL_UNIQUE)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    15
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    16
lemma RES_FORALL_FORALL: "ALL (P::'a => bool) (R::'a => 'b => bool) x::'b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    17
   (ALL x::'b. RES_FORALL P (%i::'a. R i x)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    18
   RES_FORALL P (%i::'a. All (R i))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    19
  by (import res_quan RES_FORALL_FORALL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    20
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    21
lemma RES_FORALL_REORDER: "ALL P Q R.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    22
   RES_FORALL P (%i. RES_FORALL Q (R i)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    23
   RES_FORALL Q (%j. RES_FORALL P (%i. R i j))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    24
  by (import res_quan RES_FORALL_REORDER)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    25
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    26
lemma RES_FORALL_EMPTY: "All (RES_FORALL EMPTY)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    27
  by (import res_quan RES_FORALL_EMPTY)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    28
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    29
lemma RES_FORALL_UNIV: "ALL p. RES_FORALL pred_set.UNIV p = All p"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    30
  by (import res_quan RES_FORALL_UNIV)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    31
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    32
lemma RES_FORALL_NULL: "ALL p m. RES_FORALL p (%x. m) = (p = EMPTY | m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    33
  by (import res_quan RES_FORALL_NULL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    34
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    35
lemma RES_EXISTS_DISJ_DIST: "(All::(('a => bool) => bool) => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    36
 (%P::'a => bool.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    37
     (All::(('a => bool) => bool) => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    38
      (%Q::'a => bool.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    39
          (All::(('a => bool) => bool) => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    40
           (%R::'a => bool.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    41
               (op =::bool => bool => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    42
                ((RES_EXISTS::('a => bool) => ('a => bool) => bool) P
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    43
                  (%i::'a. (op |::bool => bool => bool) (Q i) (R i)))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    44
                ((op |::bool => bool => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    45
                  ((RES_EXISTS::('a => bool) => ('a => bool) => bool) P Q)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    46
                  ((RES_EXISTS::('a => bool) => ('a => bool) => bool) P
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    47
                    R)))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    48
  by (import res_quan RES_EXISTS_DISJ_DIST)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    49
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    50
lemma RES_DISJ_EXISTS_DIST: "ALL P Q R. RES_EXISTS (%i. P i | Q i) R = (RES_EXISTS P R | RES_EXISTS Q R)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    51
  by (import res_quan RES_DISJ_EXISTS_DIST)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    52
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    53
lemma RES_EXISTS_EQUAL: "ALL x xa. RES_EXISTS (op = xa) x = x xa"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    54
  by (import res_quan RES_EXISTS_EQUAL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    55
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    56
lemma RES_EXISTS_REORDER: "ALL P Q R.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    57
   RES_EXISTS P (%i. RES_EXISTS Q (R i)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    58
   RES_EXISTS Q (%j. RES_EXISTS P (%i. R i j))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    59
  by (import res_quan RES_EXISTS_REORDER)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    60
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    61
lemma RES_EXISTS_EMPTY: "ALL p. ~ RES_EXISTS EMPTY p"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    62
  by (import res_quan RES_EXISTS_EMPTY)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    63
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    64
lemma RES_EXISTS_UNIV: "ALL p. RES_EXISTS pred_set.UNIV p = Ex p"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    65
  by (import res_quan RES_EXISTS_UNIV)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    66
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    67
lemma RES_EXISTS_NULL: "ALL p m. RES_EXISTS p (%x. m) = (p ~= EMPTY & m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    68
  by (import res_quan RES_EXISTS_NULL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    69
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    70
lemma RES_EXISTS_ALT: "ALL p m. RES_EXISTS p m = (IN (RES_SELECT p m) p & m (RES_SELECT p m))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    71
  by (import res_quan RES_EXISTS_ALT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    72
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    73
lemma RES_EXISTS_UNIQUE_EMPTY: "ALL p. ~ RES_EXISTS_UNIQUE EMPTY p"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    74
  by (import res_quan RES_EXISTS_UNIQUE_EMPTY)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    75
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    76
lemma RES_EXISTS_UNIQUE_UNIV: "ALL p. RES_EXISTS_UNIQUE pred_set.UNIV p = Ex1 p"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    77
  by (import res_quan RES_EXISTS_UNIQUE_UNIV)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    78
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    79
lemma RES_EXISTS_UNIQUE_NULL: "ALL p m. RES_EXISTS_UNIQUE p (%x. m) = ((EX x. p = INSERT x EMPTY) & m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    80
  by (import res_quan RES_EXISTS_UNIQUE_NULL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    81
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    82
lemma RES_EXISTS_UNIQUE_ALT: "ALL p m.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    83
   RES_EXISTS_UNIQUE p m =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    84
   RES_EXISTS p (%x. m x & RES_FORALL p (%y. m y --> y = x))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    85
  by (import res_quan RES_EXISTS_UNIQUE_ALT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    86
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    87
lemma RES_SELECT_EMPTY: "ALL p. RES_SELECT EMPTY p = (SOME x. False)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    88
  by (import res_quan RES_SELECT_EMPTY)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    89
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    90
lemma RES_SELECT_UNIV: "ALL p. RES_SELECT pred_set.UNIV p = Eps p"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    91
  by (import res_quan RES_SELECT_UNIV)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    92
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    93
lemma RES_ABSTRACT: "ALL p m x. IN x p --> RES_ABSTRACT p m x = m x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    94
  by (import res_quan RES_ABSTRACT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    95
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    96
lemma RES_ABSTRACT_EQUAL: "ALL p m1 m2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    97
   (ALL x. IN x p --> m1 x = m2 x) --> RES_ABSTRACT p m1 = RES_ABSTRACT p m2"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    98
  by (import res_quan RES_ABSTRACT_EQUAL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    99
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   100
lemma RES_ABSTRACT_IDEMPOT: "ALL p m. RES_ABSTRACT p (RES_ABSTRACT p m) = RES_ABSTRACT p m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   101
  by (import res_quan RES_ABSTRACT_IDEMPOT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   102
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   103
lemma RES_ABSTRACT_EQUAL_EQ: "ALL p m1 m2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   104
   (RES_ABSTRACT p m1 = RES_ABSTRACT p m2) = (ALL x. IN x p --> m1 x = m2 x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   105
  by (import res_quan RES_ABSTRACT_EQUAL_EQ)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   106
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   107
;end_setup
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   108
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   109
;setup_theory word_base
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   110
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   111
typedef (open) ('a) word = "(Collect::('a list recspace => bool) => 'a list recspace set)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   112
 (%x::'a list recspace.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   113
     (All::(('a list recspace => bool) => bool) => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   114
      (%word::'a list recspace => bool.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   115
          (op -->::bool => bool => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   116
           ((All::('a list recspace => bool) => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   117
             (%a0::'a list recspace.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   118
                 (op -->::bool => bool => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   119
                  ((Ex::('a list => bool) => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   120
                    (%a::'a list.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   121
                        (op =::'a list recspace => 'a list recspace => bool)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   122
                         a0 ((CONSTR::nat
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   123
=> 'a list => (nat => 'a list recspace) => 'a list recspace)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   124
                              (0::nat) a
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   125
                              (%n::nat. BOTTOM::'a list recspace))))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   126
                  (word a0)))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   127
           (word x)))" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   128
  by (rule typedef_helper,import word_base word_TY_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   129
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   130
lemmas word_TY_DEF = typedef_hol2hol4 [OF type_definition_word]
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   131
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   132
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   133
  mk_word :: "'a list recspace => 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   134
  dest_word :: "'a word => 'a list recspace" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   135
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   136
specification (dest_word mk_word) word_repfns: "(ALL a::'a word. mk_word (dest_word a) = a) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   137
(ALL r::'a list recspace.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   138
    (ALL word::'a list recspace => bool.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   139
        (ALL a0::'a list recspace.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   140
            (EX a::'a list. a0 = CONSTR (0::nat) a (%n::nat. BOTTOM)) -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   141
            word a0) -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   142
        word r) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   143
    (dest_word (mk_word r) = r))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   144
  by (import word_base word_repfns)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   145
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   146
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   147
  word_base0 :: "'a list => 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   148
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   149
defs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   150
  word_base0_primdef: "word_base0 == %a. mk_word (CONSTR 0 a (%n. BOTTOM))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   151
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   152
lemma word_base0_def: "word_base0 = (%a. mk_word (CONSTR 0 a (%n. BOTTOM)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   153
  by (import word_base word_base0_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   154
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   155
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   156
  WORD :: "'a list => 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   157
  "WORD == word_base0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   158
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   159
lemma WORD: "WORD = word_base0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   160
  by (import word_base WORD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   161
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   162
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   163
  word_case :: "('a list => 'b) => 'a word => 'b" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   164
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   165
specification (word_case_primdef: word_case) word_case_def: "ALL f a. word_case f (WORD a) = f a"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   166
  by (import word_base word_case_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   167
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   168
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   169
  word_size :: "('a => nat) => 'a word => nat" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   170
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   171
specification (word_size_primdef: word_size) word_size_def: "ALL f a. word_size f (WORD a) = 1 + list_size f a"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   172
  by (import word_base word_size_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   173
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   174
lemma word_11: "ALL a a'. (WORD a = WORD a') = (a = a')"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   175
  by (import word_base word_11)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   176
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   177
lemma word_case_cong: "ALL M M' f.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   178
   M = M' & (ALL a. M' = WORD a --> f a = f' a) -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   179
   word_case f M = word_case f' M'"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   180
  by (import word_base word_case_cong)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   181
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   182
lemma word_nchotomy: "ALL x. EX l. x = WORD l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   183
  by (import word_base word_nchotomy)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   184
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   185
lemma word_Axiom: "ALL f. EX fn. ALL a. fn (WORD a) = f a"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   186
  by (import word_base word_Axiom)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   187
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   188
lemma word_induction: "ALL P. (ALL a. P (WORD a)) --> All P"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   189
  by (import word_base word_induction)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   190
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   191
lemma word_Ax: "ALL f. EX fn. ALL a. fn (WORD a) = f a"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   192
  by (import word_base word_Ax)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   193
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   194
lemma WORD_11: "ALL x xa. (WORD x = WORD xa) = (x = xa)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   195
  by (import word_base WORD_11)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   196
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   197
lemma word_induct: "ALL x. (ALL l. x (WORD l)) --> All x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   198
  by (import word_base word_induct)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   199
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   200
lemma word_cases: "ALL x. EX l. x = WORD l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   201
  by (import word_base word_cases)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   202
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   203
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   204
  WORDLEN :: "'a word => nat" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   205
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   206
specification (WORDLEN) WORDLEN_DEF: "ALL l. WORDLEN (WORD l) = length l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   207
  by (import word_base WORDLEN_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   208
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   209
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   210
  PWORDLEN :: "nat => 'a word => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   211
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   212
defs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   213
  PWORDLEN_primdef: "PWORDLEN == %n. GSPEC (%w. (w, WORDLEN w = n))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   214
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   215
lemma PWORDLEN_def: "ALL n. PWORDLEN n = GSPEC (%w. (w, WORDLEN w = n))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   216
  by (import word_base PWORDLEN_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   217
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   218
lemma IN_PWORDLEN: "ALL n l. IN (WORD l) (PWORDLEN n) = (length l = n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   219
  by (import word_base IN_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   220
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   221
lemma PWORDLEN: "ALL n w. IN w (PWORDLEN n) = (WORDLEN w = n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   222
  by (import word_base PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   223
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   224
lemma PWORDLEN0: "ALL w. IN w (PWORDLEN 0) --> w = WORD []"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   225
  by (import word_base PWORDLEN0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   226
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   227
lemma PWORDLEN1: "ALL x. IN (WORD [x]) (PWORDLEN 1)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   228
  by (import word_base PWORDLEN1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   229
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   230
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   231
  WSEG :: "nat => nat => 'a word => 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   232
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   233
specification (WSEG) WSEG_DEF: "ALL m k l. WSEG m k (WORD l) = WORD (LASTN m (BUTLASTN k l))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   234
  by (import word_base WSEG_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   235
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   236
lemma WSEG0: "ALL k w. WSEG 0 k w = WORD []"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   237
  by (import word_base WSEG0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   238
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   239
lemma WSEG_PWORDLEN: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   240
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   241
    (%w. ALL m k. m + k <= n --> IN (WSEG m k w) (PWORDLEN m))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   242
  by (import word_base WSEG_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   243
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   244
lemma WSEG_WORDLEN: "ALL x.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   245
   RES_FORALL (PWORDLEN x)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   246
    (%xa. ALL xb xc. xb + xc <= x --> WORDLEN (WSEG xb xc xa) = xb)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   247
  by (import word_base WSEG_WORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   248
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   249
lemma WSEG_WORD_LENGTH: "ALL n. RES_FORALL (PWORDLEN n) (%w. WSEG n 0 w = w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   250
  by (import word_base WSEG_WORD_LENGTH)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   251
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   252
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   253
  bit :: "nat => 'a word => 'a" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   254
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   255
specification (bit) BIT_DEF: "ALL k l. bit k (WORD l) = ELL k l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   256
  by (import word_base BIT_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   257
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   258
lemma BIT0: "ALL x. bit 0 (WORD [x]) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   259
  by (import word_base BIT0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   260
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   261
lemma WSEG_BIT: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   262
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   263
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   264
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   265
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   266
          (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   267
           (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   268
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   269
                ((op <::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   270
                ((op =::'a word => 'a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   271
                  ((WSEG::nat => nat => 'a word => 'a word) (1::nat) k w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   272
                  ((WORD::'a list => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   273
                    ((op #::'a => 'a list => 'a list)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   274
                      ((bit::nat => 'a word => 'a) k w) ([]::'a list)))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   275
  by (import word_base WSEG_BIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   276
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   277
lemma BIT_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   278
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   279
    (%w. ALL m k j.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   280
            m + k <= n --> j < m --> bit j (WSEG m k w) = bit (j + k) w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   281
  by (import word_base BIT_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   282
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   283
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   284
  MSB :: "'a word => 'a" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   285
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   286
specification (MSB) MSB_DEF: "ALL l. MSB (WORD l) = hd l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   287
  by (import word_base MSB_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   288
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   289
lemma MSB: "ALL n. RES_FORALL (PWORDLEN n) (%w. 0 < n --> MSB w = bit (PRE n) w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   290
  by (import word_base MSB)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   291
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   292
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   293
  LSB :: "'a word => 'a" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   294
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   295
specification (LSB) LSB_DEF: "ALL l. LSB (WORD l) = last l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   296
  by (import word_base LSB_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   297
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   298
lemma LSB: "ALL n. RES_FORALL (PWORDLEN n) (%w. 0 < n --> LSB w = bit 0 w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   299
  by (import word_base LSB)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   300
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   301
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   302
  WSPLIT :: "nat => 'a word => 'a word * 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   303
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   304
specification (WSPLIT) WSPLIT_DEF: "ALL m l. WSPLIT m (WORD l) = (WORD (BUTLASTN m l), WORD (LASTN m l))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   305
  by (import word_base WSPLIT_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   306
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   307
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   308
  WCAT :: "'a word * 'a word => 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   309
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   310
specification (WCAT) WCAT_DEF: "ALL l1 l2. WCAT (WORD l1, WORD l2) = WORD (l1 @ l2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   311
  by (import word_base WCAT_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   312
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   313
lemma WORD_PARTITION: "(op &::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   314
 ((All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   315
   (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   316
       (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   317
        ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   318
        (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   319
            (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   320
             (%m::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   321
                 (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   322
                  ((op <=::nat => nat => bool) m n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   323
                  ((op =::'a word => 'a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   324
                    ((WCAT::'a word * 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   325
                      ((WSPLIT::nat => 'a word => 'a word * 'a word) m w))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   326
                    w)))))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   327
 ((All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   328
   (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   329
       (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   330
        (%m::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   331
            (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   332
             ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   333
             (%w1::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   334
                 (RES_FORALL::('a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   335
                              => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   336
                  ((PWORDLEN::nat => 'a word => bool) m)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   337
                  (%w2::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   338
                      (op =::'a word * 'a word => 'a word * 'a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   339
                       ((WSPLIT::nat => 'a word => 'a word * 'a word) m
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   340
                         ((WCAT::'a word * 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   341
                           ((Pair::'a word => 'a word => 'a word * 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   342
                             w1 w2)))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   343
                       ((Pair::'a word => 'a word => 'a word * 'a word) w1
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   344
                         w2))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   345
  by (import word_base WORD_PARTITION)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   346
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   347
lemma WCAT_ASSOC: "ALL w1 w2 w3. WCAT (w1, WCAT (w2, w3)) = WCAT (WCAT (w1, w2), w3)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   348
  by (import word_base WCAT_ASSOC)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   349
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   350
lemma WCAT0: "ALL w. WCAT (WORD [], w) = w & WCAT (w, WORD []) = w"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   351
  by (import word_base WCAT0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   352
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   353
lemma WCAT_11: "ALL m n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   354
   RES_FORALL (PWORDLEN m)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   355
    (%wm1. RES_FORALL (PWORDLEN m)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   356
            (%wm2. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   357
                    (%wn1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   358
                            (%wn2. (WCAT (wm1, wn1) = WCAT (wm2, wn2)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   359
                                   (wm1 = wm2 & wn1 = wn2)))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   360
  by (import word_base WCAT_11)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   361
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   362
lemma WSPLIT_PWORDLEN: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   363
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   364
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   365
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   366
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   367
          (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   368
           (%m::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   369
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   370
                ((op <=::nat => nat => bool) m n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   371
                ((op &::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   372
                  ((IN::'a word => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   373
                    ((fst::'a word * 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   374
                      ((WSPLIT::nat => 'a word => 'a word * 'a word) m w))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   375
                    ((PWORDLEN::nat => 'a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   376
                      ((op -::nat => nat => nat) n m)))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   377
                  ((IN::'a word => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   378
                    ((snd::'a word * 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   379
                      ((WSPLIT::nat => 'a word => 'a word * 'a word) m w))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   380
                    ((PWORDLEN::nat => 'a word => bool) m))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   381
  by (import word_base WSPLIT_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   382
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   383
lemma WCAT_PWORDLEN: "ALL n1.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   384
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   385
    (%w1. ALL n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   386
             RES_FORALL (PWORDLEN n2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   387
              (%w2. IN (WCAT (w1, w2)) (PWORDLEN (n1 + n2))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   388
  by (import word_base WCAT_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   389
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   390
lemma WORDLEN_SUC_WCAT: "ALL n w.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   391
   IN w (PWORDLEN (Suc n)) -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   392
   RES_EXISTS (PWORDLEN 1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   393
    (%b. RES_EXISTS (PWORDLEN n) (%w'. w = WCAT (b, w')))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   394
  by (import word_base WORDLEN_SUC_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   395
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   396
lemma WSEG_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   397
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   398
    (%w. ALL m1 k1 m2 k2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   399
            m1 + k1 <= n & m2 + k2 <= m1 -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   400
            WSEG m2 k2 (WSEG m1 k1 w) = WSEG m2 (k1 + k2) w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   401
  by (import word_base WSEG_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   402
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   403
lemma WSPLIT_WSEG: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   404
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   405
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   406
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   407
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   408
          (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   409
           (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   410
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   411
                ((op <=::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   412
                ((op =::'a word * 'a word => 'a word * 'a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   413
                  ((WSPLIT::nat => 'a word => 'a word * 'a word) k w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   414
                  ((Pair::'a word => 'a word => 'a word * 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   415
                    ((WSEG::nat => nat => 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   416
                      ((op -::nat => nat => nat) n k) k w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   417
                    ((WSEG::nat => nat => 'a word => 'a word) k (0::nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   418
                      w))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   419
  by (import word_base WSPLIT_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   420
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   421
lemma WSPLIT_WSEG1: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   422
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   423
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   424
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   425
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   426
          (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   427
           (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   428
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   429
                ((op <=::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   430
                ((op =::'a word => 'a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   431
                  ((fst::'a word * 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   432
                    ((WSPLIT::nat => 'a word => 'a word * 'a word) k w))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   433
                  ((WSEG::nat => nat => 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   434
                    ((op -::nat => nat => nat) n k) k w)))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   435
  by (import word_base WSPLIT_WSEG1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   436
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   437
lemma WSPLIT_WSEG2: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   438
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   439
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   440
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   441
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   442
          (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   443
           (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   444
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   445
                ((op <=::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   446
                ((op =::'a word => 'a word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   447
                  ((snd::'a word * 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   448
                    ((WSPLIT::nat => 'a word => 'a word * 'a word) k w))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   449
                  ((WSEG::nat => nat => 'a word => 'a word) k (0::nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   450
                    w)))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   451
  by (import word_base WSPLIT_WSEG2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   452
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   453
lemma WCAT_WSEG_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   454
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   455
    (%w. ALL m1 m2 k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   456
            m1 + (m2 + k) <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   457
            WCAT (WSEG m2 (m1 + k) w, WSEG m1 k w) = WSEG (m1 + m2) k w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   458
  by (import word_base WCAT_WSEG_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   459
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   460
lemma WORD_SPLIT: "ALL x xa.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   461
   RES_FORALL (PWORDLEN (x + xa)) (%w. w = WCAT (WSEG x xa w, WSEG xa 0 w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   462
  by (import word_base WORD_SPLIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   463
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   464
lemma WORDLEN_SUC_WCAT_WSEG_WSEG: "RES_FORALL (PWORDLEN (Suc n)) (%w. w = WCAT (WSEG 1 n w, WSEG n 0 w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   465
  by (import word_base WORDLEN_SUC_WCAT_WSEG_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   466
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   467
lemma WORDLEN_SUC_WCAT_WSEG_WSEG_RIGHT: "RES_FORALL (PWORDLEN (Suc n)) (%w. w = WCAT (WSEG n 1 w, WSEG 1 0 w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   468
  by (import word_base WORDLEN_SUC_WCAT_WSEG_WSEG_RIGHT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   469
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   470
lemma WORDLEN_SUC_WCAT_BIT_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   471
   RES_FORALL (PWORDLEN (Suc n)) (%w. w = WCAT (WORD [bit n w], WSEG n 0 w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   472
  by (import word_base WORDLEN_SUC_WCAT_BIT_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   473
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   474
lemma WORDLEN_SUC_WCAT_BIT_WSEG_RIGHT: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   475
   RES_FORALL (PWORDLEN (Suc n)) (%w. w = WCAT (WSEG n 1 w, WORD [bit 0 w]))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   476
  by (import word_base WORDLEN_SUC_WCAT_BIT_WSEG_RIGHT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   477
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   478
lemma WSEG_WCAT1: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   479
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   480
    (%w1. RES_FORALL (PWORDLEN n2) (%w2. WSEG n1 n2 (WCAT (w1, w2)) = w1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   481
  by (import word_base WSEG_WCAT1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   482
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   483
lemma WSEG_WCAT2: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   484
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   485
    (%w1. RES_FORALL (PWORDLEN n2) (%w2. WSEG n2 0 (WCAT (w1, w2)) = w2))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   486
  by (import word_base WSEG_WCAT2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   487
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   488
lemma WSEG_SUC: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   489
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   490
    (%w. ALL k m1.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   491
            k + Suc m1 < n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   492
            WSEG (Suc m1) k w = WCAT (WSEG 1 (k + m1) w, WSEG m1 k w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   493
  by (import word_base WSEG_SUC)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   494
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   495
lemma WORD_CONS_WCAT: "ALL x l. WORD (x # l) = WCAT (WORD [x], WORD l)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   496
  by (import word_base WORD_CONS_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   497
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   498
lemma WORD_SNOC_WCAT: "ALL l x. WORD (SNOC x l) = WCAT (WORD l, WORD [x])"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   499
  by (import word_base WORD_SNOC_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   500
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   501
lemma BIT_WCAT_FST: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   502
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   503
    (%w1. RES_FORALL (PWORDLEN n2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   504
           (%w2. ALL k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   505
                    n2 <= k & k < n1 + n2 -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   506
                    bit k (WCAT (w1, w2)) = bit (k - n2) w1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   507
  by (import word_base BIT_WCAT_FST)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   508
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   509
lemma BIT_WCAT_SND: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   510
 (%n1::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   511
     (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   512
      (%n2::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   513
          (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   514
           ((PWORDLEN::nat => 'a word => bool) n1)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   515
           (%w1::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   516
               (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   517
                ((PWORDLEN::nat => 'a word => bool) n2)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   518
                (%w2::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   519
                    (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   520
                     (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   521
                         (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   522
                          ((op <::nat => nat => bool) k n2)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   523
                          ((op =::'a => 'a => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   524
                            ((bit::nat => 'a word => 'a) k
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   525
                              ((WCAT::'a word * 'a word => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   526
                                ((Pair::'a word
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   527
  => 'a word => 'a word * 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   528
                                  w1 w2)))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   529
                            ((bit::nat => 'a word => 'a) k w2)))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   530
  by (import word_base BIT_WCAT_SND)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   531
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   532
lemma BIT_WCAT1: "ALL n. RES_FORALL (PWORDLEN n) (%w. ALL b. bit n (WCAT (WORD [b], w)) = b)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   533
  by (import word_base BIT_WCAT1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   534
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   535
lemma WSEG_WCAT_WSEG1: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   536
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   537
    (%w1. RES_FORALL (PWORDLEN n2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   538
           (%w2. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   539
                    m <= n1 & n2 <= k -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   540
                    WSEG m k (WCAT (w1, w2)) = WSEG m (k - n2) w1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   541
  by (import word_base WSEG_WCAT_WSEG1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   542
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   543
lemma WSEG_WCAT_WSEG2: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   544
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   545
    (%w1. RES_FORALL (PWORDLEN n2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   546
           (%w2. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   547
                    m + k <= n2 --> WSEG m k (WCAT (w1, w2)) = WSEG m k w2))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   548
  by (import word_base WSEG_WCAT_WSEG2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   549
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   550
lemma WSEG_WCAT_WSEG: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   551
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   552
    (%w1. RES_FORALL (PWORDLEN n2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   553
           (%w2. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   554
                    m + k <= n1 + n2 & k < n2 & n2 <= m + k -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   555
                    WSEG m k (WCAT (w1, w2)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   556
                    WCAT (WSEG (m + k - n2) 0 w1, WSEG (n2 - k) k w2)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   557
  by (import word_base WSEG_WCAT_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   558
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   559
lemma BIT_EQ_IMP_WORD_EQ: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   560
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   561
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   562
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   563
      (%w1::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   564
          (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   565
           ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   566
           (%w2::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   567
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   568
                ((All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   569
                  (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   570
                      (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   571
                       ((op <::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   572
                       ((op =::'a => 'a => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   573
                         ((bit::nat => 'a word => 'a) k w1)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   574
                         ((bit::nat => 'a word => 'a) k w2))))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   575
                ((op =::'a word => 'a word => bool) w1 w2))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   576
  by (import word_base BIT_EQ_IMP_WORD_EQ)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   577
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   578
;end_setup
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   579
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   580
;setup_theory word_num
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   581
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   582
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   583
  LVAL :: "('a => nat) => nat => 'a list => nat" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   584
  "LVAL == %f b. foldl (%e x. b * e + f x) 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   585
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   586
lemma LVAL_DEF: "ALL f b l. LVAL f b l = foldl (%e x. b * e + f x) 0 l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   587
  by (import word_num LVAL_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   588
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   589
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   590
  NVAL :: "('a => nat) => nat => 'a word => nat" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   591
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   592
specification (NVAL) NVAL_DEF: "ALL f b l. NVAL f b (WORD l) = LVAL f b l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   593
  by (import word_num NVAL_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   594
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   595
lemma LVAL: "(ALL (x::'a => nat) xa::nat. LVAL x xa [] = (0::nat)) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   596
(ALL (x::'a list) (xa::'a => nat) (xb::nat) xc::'a.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   597
    LVAL xa xb (xc # x) = xa xc * xb ^ length x + LVAL xa xb x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   598
  by (import word_num LVAL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   599
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   600
lemma LVAL_SNOC: "ALL l h f b. LVAL f b (SNOC h l) = LVAL f b l * b + f h"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   601
  by (import word_num LVAL_SNOC)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   602
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   603
lemma LVAL_MAX: "ALL l f b. (ALL x. f x < b) --> LVAL f b l < b ^ length l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   604
  by (import word_num LVAL_MAX)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   605
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   606
lemma NVAL_MAX: "ALL f b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   607
   (ALL x. f x < b) -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   608
   (ALL n. RES_FORALL (PWORDLEN n) (%w. NVAL f b w < b ^ n))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   609
  by (import word_num NVAL_MAX)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   610
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   611
lemma NVAL0: "ALL x xa. NVAL x xa (WORD []) = 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   612
  by (import word_num NVAL0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   613
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   614
lemma NVAL1: "ALL x xa xb. NVAL x xa (WORD [xb]) = x xb"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   615
  by (import word_num NVAL1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   616
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   617
lemma NVAL_WORDLEN_0: "RES_FORALL (PWORDLEN 0) (%w. ALL fv r. NVAL fv r w = 0)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   618
  by (import word_num NVAL_WORDLEN_0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   619
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   620
lemma NVAL_WCAT1: "ALL w f b x. NVAL f b (WCAT (w, WORD [x])) = NVAL f b w * b + f x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   621
  by (import word_num NVAL_WCAT1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   622
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   623
lemma NVAL_WCAT2: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   624
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   625
    (%w. ALL f b x.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   626
            NVAL f b (WCAT (WORD [x], w)) = f x * b ^ n + NVAL f b w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   627
  by (import word_num NVAL_WCAT2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   628
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   629
lemma NVAL_WCAT: "ALL n m.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   630
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   631
    (%w1. RES_FORALL (PWORDLEN m)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   632
           (%w2. ALL f b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   633
                    NVAL f b (WCAT (w1, w2)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   634
                    NVAL f b w1 * b ^ m + NVAL f b w2))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   635
  by (import word_num NVAL_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   636
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   637
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   638
  NLIST :: "nat => (nat => 'a) => nat => nat => 'a list" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   639
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   640
specification (NLIST) NLIST_DEF: "(ALL (frep::nat => 'a) (b::nat) m::nat. NLIST (0::nat) frep b m = []) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   641
(ALL (n::nat) (frep::nat => 'a) (b::nat) m::nat.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   642
    NLIST (Suc n) frep b m =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   643
    SNOC (frep (m mod b)) (NLIST n frep b (m div b)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   644
  by (import word_num NLIST_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   645
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   646
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   647
  NWORD :: "nat => (nat => 'a) => nat => nat => 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   648
  "NWORD == %n frep b m. WORD (NLIST n frep b m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   649
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   650
lemma NWORD_DEF: "ALL n frep b m. NWORD n frep b m = WORD (NLIST n frep b m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   651
  by (import word_num NWORD_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   652
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   653
lemma NWORD_LENGTH: "ALL x xa xb xc. WORDLEN (NWORD x xa xb xc) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   654
  by (import word_num NWORD_LENGTH)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   655
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   656
lemma NWORD_PWORDLEN: "ALL x xa xb xc. IN (NWORD x xa xb xc) (PWORDLEN x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   657
  by (import word_num NWORD_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   658
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   659
;end_setup
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   660
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   661
;setup_theory word_bitop
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   662
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   663
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   664
  PBITOP :: "('a word => 'b word) => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   665
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   666
defs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   667
  PBITOP_primdef: "PBITOP ==
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   668
GSPEC
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   669
 (%oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   670
     (oper,
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   671
      ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   672
         RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   673
          (%w. IN (oper w) (PWORDLEN n) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   674
               (ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   675
                   m + k <= n --> oper (WSEG m k w) = WSEG m k (oper w)))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   676
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   677
lemma PBITOP_def: "PBITOP =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   678
GSPEC
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   679
 (%oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   680
     (oper,
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   681
      ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   682
         RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   683
          (%w. IN (oper w) (PWORDLEN n) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   684
               (ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   685
                   m + k <= n --> oper (WSEG m k w) = WSEG m k (oper w)))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   686
  by (import word_bitop PBITOP_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   687
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   688
lemma IN_PBITOP: "ALL oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   689
   IN oper PBITOP =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   690
   (ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   691
       RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   692
        (%w. IN (oper w) (PWORDLEN n) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   693
             (ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   694
                 m + k <= n --> oper (WSEG m k w) = WSEG m k (oper w))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   695
  by (import word_bitop IN_PBITOP)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   696
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   697
lemma PBITOP_PWORDLEN: "RES_FORALL PBITOP
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   698
 (%oper. ALL n. RES_FORALL (PWORDLEN n) (%w. IN (oper w) (PWORDLEN n)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   699
  by (import word_bitop PBITOP_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   700
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   701
lemma PBITOP_WSEG: "RES_FORALL PBITOP
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   702
 (%oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   703
     ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   704
        RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   705
         (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   706
                 m + k <= n --> oper (WSEG m k w) = WSEG m k (oper w)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   707
  by (import word_bitop PBITOP_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   708
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   709
lemma PBITOP_BIT: "(RES_FORALL::(('a word => 'b word) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   710
             => (('a word => 'b word) => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   711
 (PBITOP::('a word => 'b word) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   712
 (%oper::'a word => 'b word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   713
     (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   714
      (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   715
          (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   716
           ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   717
           (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   718
               (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   719
                (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   720
                    (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   721
                     ((op <::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   722
                     ((op =::'b word => 'b word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   723
                       (oper
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   724
                         ((WORD::'a list => 'a word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   725
                           ((op #::'a => 'a list => 'a list)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   726
                             ((bit::nat => 'a word => 'a) k w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   727
                             ([]::'a list))))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   728
                       ((WORD::'b list => 'b word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   729
                         ((op #::'b => 'b list => 'b list)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   730
                           ((bit::nat => 'b word => 'b) k (oper w))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   731
                           ([]::'b list))))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   732
  by (import word_bitop PBITOP_BIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   733
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   734
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   735
  PBITBOP :: "('a word => 'b word => 'c word) => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   736
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   737
defs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   738
  PBITBOP_primdef: "PBITBOP ==
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   739
GSPEC
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   740
 (%oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   741
     (oper,
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   742
      ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   743
         RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   744
          (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   745
                 (%w2. IN (oper w1 w2) (PWORDLEN n) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   746
                       (ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   747
                           m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   748
                           oper (WSEG m k w1) (WSEG m k w2) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   749
                           WSEG m k (oper w1 w2))))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   750
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   751
lemma PBITBOP_def: "PBITBOP =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   752
GSPEC
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   753
 (%oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   754
     (oper,
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   755
      ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   756
         RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   757
          (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   758
                 (%w2. IN (oper w1 w2) (PWORDLEN n) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   759
                       (ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   760
                           m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   761
                           oper (WSEG m k w1) (WSEG m k w2) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   762
                           WSEG m k (oper w1 w2))))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   763
  by (import word_bitop PBITBOP_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   764
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   765
lemma IN_PBITBOP: "ALL oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   766
   IN oper PBITBOP =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   767
   (ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   768
       RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   769
        (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   770
               (%w2. IN (oper w1 w2) (PWORDLEN n) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   771
                     (ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   772
                         m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   773
                         oper (WSEG m k w1) (WSEG m k w2) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   774
                         WSEG m k (oper w1 w2)))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   775
  by (import word_bitop IN_PBITBOP)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   776
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   777
lemma PBITBOP_PWORDLEN: "RES_FORALL PBITBOP
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   778
 (%oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   779
     ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   780
        RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   781
         (%w1. RES_FORALL (PWORDLEN n) (%w2. IN (oper w1 w2) (PWORDLEN n))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   782
  by (import word_bitop PBITBOP_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   783
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   784
lemma PBITBOP_WSEG: "RES_FORALL PBITBOP
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   785
 (%oper.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   786
     ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   787
        RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   788
         (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   789
                (%w2. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   790
                         m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   791
                         oper (WSEG m k w1) (WSEG m k w2) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   792
                         WSEG m k (oper w1 w2))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   793
  by (import word_bitop PBITBOP_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   794
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   795
lemma PBITBOP_EXISTS: "ALL f. EX x. ALL l1 l2. x (WORD l1) (WORD l2) = WORD (map2 f l1 l2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   796
  by (import word_bitop PBITBOP_EXISTS)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   797
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   798
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   799
  WMAP :: "('a => 'b) => 'a word => 'b word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   800
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   801
specification (WMAP) WMAP_DEF: "ALL f l. WMAP f (WORD l) = WORD (map f l)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   802
  by (import word_bitop WMAP_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   803
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   804
lemma WMAP_PWORDLEN: "RES_FORALL (PWORDLEN n) (%w. ALL f. IN (WMAP f w) (PWORDLEN n))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   805
  by (import word_bitop WMAP_PWORDLEN)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   806
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   807
lemma WMAP_0: "ALL x. WMAP x (WORD []) = WORD []"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   808
  by (import word_bitop WMAP_0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   809
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   810
lemma WMAP_BIT: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   811
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   812
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   813
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   814
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   815
          (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   816
           (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   817
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   818
                ((op <::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   819
                ((All::(('a => 'b) => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   820
                  (%f::'a => 'b.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   821
                      (op =::'b => 'b => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   822
                       ((bit::nat => 'b word => 'b) k
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   823
                         ((WMAP::('a => 'b) => 'a word => 'b word) f w))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   824
                       (f ((bit::nat => 'a word => 'a) k w)))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   825
  by (import word_bitop WMAP_BIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   826
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   827
lemma WMAP_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   828
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   829
    (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   830
            m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   831
            (ALL f. WMAP f (WSEG m k w) = WSEG m k (WMAP f w)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   832
  by (import word_bitop WMAP_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   833
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   834
lemma WMAP_PBITOP: "ALL f. IN (WMAP f) PBITOP"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   835
  by (import word_bitop WMAP_PBITOP)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   836
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   837
lemma WMAP_WCAT: "ALL w1 w2 f. WMAP f (WCAT (w1, w2)) = WCAT (WMAP f w1, WMAP f w2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   838
  by (import word_bitop WMAP_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   839
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   840
lemma WMAP_o: "ALL w f g. WMAP g (WMAP f w) = WMAP (g o f) w"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   841
  by (import word_bitop WMAP_o)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   842
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   843
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   844
  FORALLBITS :: "('a => bool) => 'a word => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   845
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   846
specification (FORALLBITS) FORALLBITS_DEF: "ALL P l. FORALLBITS P (WORD l) = list_all P l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   847
  by (import word_bitop FORALLBITS_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   848
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   849
lemma FORALLBITS: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   850
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   851
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   852
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   853
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   854
          (All::(('a => bool) => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   855
           (%P::'a => bool.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   856
               (op =::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   857
                ((FORALLBITS::('a => bool) => 'a word => bool) P w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   858
                ((All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   859
                  (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   860
                      (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   861
                       ((op <::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   862
                       (P ((bit::nat => 'a word => 'a) k w)))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   863
  by (import word_bitop FORALLBITS)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   864
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   865
lemma FORALLBITS_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   866
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   867
    (%w. ALL P.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   868
            FORALLBITS P w -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   869
            (ALL m k. m + k <= n --> FORALLBITS P (WSEG m k w)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   870
  by (import word_bitop FORALLBITS_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   871
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   872
lemma FORALLBITS_WCAT: "ALL w1 w2 P.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   873
   FORALLBITS P (WCAT (w1, w2)) = (FORALLBITS P w1 & FORALLBITS P w2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   874
  by (import word_bitop FORALLBITS_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   875
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   876
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   877
  EXISTSABIT :: "('a => bool) => 'a word => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   878
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   879
specification (EXISTSABIT) EXISTSABIT_DEF: "ALL P l. EXISTSABIT P (WORD l) = list_exists P l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   880
  by (import word_bitop EXISTSABIT_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   881
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   882
lemma NOT_EXISTSABIT: "ALL P w. (~ EXISTSABIT P w) = FORALLBITS (Not o P) w"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   883
  by (import word_bitop NOT_EXISTSABIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   884
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   885
lemma NOT_FORALLBITS: "ALL P w. (~ FORALLBITS P w) = EXISTSABIT (Not o P) w"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   886
  by (import word_bitop NOT_FORALLBITS)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   887
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   888
lemma EXISTSABIT: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   889
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   890
     (RES_FORALL::('a word => bool) => ('a word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   891
      ((PWORDLEN::nat => 'a word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   892
      (%w::'a word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   893
          (All::(('a => bool) => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   894
           (%P::'a => bool.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   895
               (op =::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   896
                ((EXISTSABIT::('a => bool) => 'a word => bool) P w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   897
                ((Ex::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   898
                  (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   899
                      (op &::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   900
                       ((op <::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
   901
                       (P ((bit::nat => 'a word => 'a) k w)))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   902
  by (import word_bitop EXISTSABIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   903
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   904
lemma EXISTSABIT_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   905
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   906
    (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   907
            m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   908
            (ALL P. EXISTSABIT P (WSEG m k w) --> EXISTSABIT P w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   909
  by (import word_bitop EXISTSABIT_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   910
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   911
lemma EXISTSABIT_WCAT: "ALL w1 w2 P.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   912
   EXISTSABIT P (WCAT (w1, w2)) = (EXISTSABIT P w1 | EXISTSABIT P w2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   913
  by (import word_bitop EXISTSABIT_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   914
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   915
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   916
  SHR :: "bool => 'a => 'a word => 'a word * 'a" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   917
  "SHR ==
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   918
%f b w.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   919
   (WCAT
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   920
     (if f then WSEG 1 (PRE (WORDLEN w)) w else WORD [b],
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   921
      WSEG (PRE (WORDLEN w)) 1 w),
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   922
    bit 0 w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   923
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   924
lemma SHR_DEF: "ALL f b w.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   925
   SHR f b w =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   926
   (WCAT
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   927
     (if f then WSEG 1 (PRE (WORDLEN w)) w else WORD [b],
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   928
      WSEG (PRE (WORDLEN w)) 1 w),
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   929
    bit 0 w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   930
  by (import word_bitop SHR_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   931
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   932
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   933
  SHL :: "bool => 'a word => 'a => 'a * 'a word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   934
  "SHL ==
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   935
%f w b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   936
   (bit (PRE (WORDLEN w)) w,
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   937
    WCAT (WSEG (PRE (WORDLEN w)) 0 w, if f then WSEG 1 0 w else WORD [b]))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   938
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   939
lemma SHL_DEF: "ALL f w b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   940
   SHL f w b =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   941
   (bit (PRE (WORDLEN w)) w,
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   942
    WCAT (WSEG (PRE (WORDLEN w)) 0 w, if f then WSEG 1 0 w else WORD [b]))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   943
  by (import word_bitop SHL_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   944
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   945
lemma SHR_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   946
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   947
    (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   948
            m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   949
            0 < m -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   950
            (ALL f b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   951
                SHR f b (WSEG m k w) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   952
                (if f
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   953
                 then WCAT (WSEG 1 (k + (m - 1)) w, WSEG (m - 1) (k + 1) w)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   954
                 else WCAT (WORD [b], WSEG (m - 1) (k + 1) w),
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   955
                 bit k w)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   956
  by (import word_bitop SHR_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   957
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   958
lemma SHR_WSEG_1F: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   959
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   960
    (%w. ALL b m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   961
            m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   962
            0 < m -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   963
            SHR False b (WSEG m k w) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   964
            (WCAT (WORD [b], WSEG (m - 1) (k + 1) w), bit k w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   965
  by (import word_bitop SHR_WSEG_1F)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   966
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   967
lemma SHR_WSEG_NF: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   968
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   969
    (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   970
            m + k < n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   971
            0 < m -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   972
            SHR False (bit (m + k) w) (WSEG m k w) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   973
            (WSEG m (k + 1) w, bit k w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   974
  by (import word_bitop SHR_WSEG_NF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   975
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   976
lemma SHL_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   977
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   978
    (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   979
            m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   980
            0 < m -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   981
            (ALL f b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   982
                SHL f (WSEG m k w) b =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   983
                (bit (k + (m - 1)) w,
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   984
                 if f then WCAT (WSEG (m - 1) k w, WSEG 1 k w)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   985
                 else WCAT (WSEG (m - 1) k w, WORD [b]))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   986
  by (import word_bitop SHL_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   987
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   988
lemma SHL_WSEG_1F: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   989
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   990
    (%w. ALL b m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   991
            m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   992
            0 < m -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   993
            SHL False (WSEG m k w) b =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   994
            (bit (k + (m - 1)) w, WCAT (WSEG (m - 1) k w, WORD [b])))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   995
  by (import word_bitop SHL_WSEG_1F)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   996
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   997
lemma SHL_WSEG_NF: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   998
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   999
    (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1000
            m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1001
            0 < m -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1002
            0 < k -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1003
            SHL False (WSEG m k w) (bit (k - 1) w) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1004
            (bit (k + (m - 1)) w, WSEG m (k - 1) w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1005
  by (import word_bitop SHL_WSEG_NF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1006
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1007
lemma WSEG_SHL: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1008
   RES_FORALL (PWORDLEN (Suc n))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1009
    (%w. ALL m k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1010
            0 < k & m + k <= Suc n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1011
            (ALL b. WSEG m k (snd (SHL f w b)) = WSEG m (k - 1) w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1012
  by (import word_bitop WSEG_SHL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1013
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1014
lemma WSEG_SHL_0: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1015
   RES_FORALL (PWORDLEN (Suc n))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1016
    (%w. ALL m b.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1017
            0 < m & m <= Suc n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1018
            WSEG m 0 (snd (SHL f w b)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1019
            WCAT (WSEG (m - 1) 0 w, if f then WSEG 1 0 w else WORD [b]))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1020
  by (import word_bitop WSEG_SHL_0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1021
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1022
;end_setup
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1023
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1024
;setup_theory bword_num
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1025
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1026
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1027
  BV :: "bool => nat" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1028
  "BV == %b. if b then Suc 0 else 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1029
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1030
lemma BV_DEF: "ALL b. BV b = (if b then Suc 0 else 0)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1031
  by (import bword_num BV_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1032
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1033
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1034
  BNVAL :: "bool word => nat" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1035
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1036
specification (BNVAL) BNVAL_DEF: "ALL l. BNVAL (WORD l) = LVAL BV 2 l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1037
  by (import bword_num BNVAL_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1038
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1039
lemma BV_LESS_2: "ALL x. BV x < 2"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1040
  by (import bword_num BV_LESS_2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1041
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1042
lemma BNVAL_NVAL: "ALL w. BNVAL w = NVAL BV 2 w"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1043
  by (import bword_num BNVAL_NVAL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1044
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1045
lemma BNVAL0: "BNVAL (WORD []) = 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1046
  by (import bword_num BNVAL0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1047
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1048
lemma BNVAL_11: "ALL w1 w2. WORDLEN w1 = WORDLEN w2 --> BNVAL w1 = BNVAL w2 --> w1 = w2"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1049
  by (import bword_num BNVAL_11)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1050
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1051
lemma BNVAL_ONTO: "ALL w. Ex (op = (BNVAL w))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1052
  by (import bword_num BNVAL_ONTO)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1053
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1054
lemma BNVAL_MAX: "ALL n. RES_FORALL (PWORDLEN n) (%w. BNVAL w < 2 ^ n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1055
  by (import bword_num BNVAL_MAX)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1056
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1057
lemma BNVAL_WCAT1: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1058
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1059
    (%w. ALL x. BNVAL (WCAT (w, WORD [x])) = BNVAL w * 2 + BV x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1060
  by (import bword_num BNVAL_WCAT1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1061
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1062
lemma BNVAL_WCAT2: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1063
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1064
    (%w. ALL x. BNVAL (WCAT (WORD [x], w)) = BV x * 2 ^ n + BNVAL w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1065
  by (import bword_num BNVAL_WCAT2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1066
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1067
lemma BNVAL_WCAT: "ALL n m.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1068
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1069
    (%w1. RES_FORALL (PWORDLEN m)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1070
           (%w2. BNVAL (WCAT (w1, w2)) = BNVAL w1 * 2 ^ m + BNVAL w2))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1071
  by (import bword_num BNVAL_WCAT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1072
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1073
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1074
  VB :: "nat => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1075
  "VB == %n. n mod 2 ~= 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1076
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1077
lemma VB_DEF: "ALL n. VB n = (n mod 2 ~= 0)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1078
  by (import bword_num VB_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1079
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1080
constdefs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1081
  NBWORD :: "nat => nat => bool word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1082
  "NBWORD == %n m. WORD (NLIST n VB 2 m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1083
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1084
lemma NBWORD_DEF: "ALL n m. NBWORD n m = WORD (NLIST n VB 2 m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1085
  by (import bword_num NBWORD_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1086
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1087
lemma NBWORD0: "ALL x. NBWORD 0 x = WORD []"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1088
  by (import bword_num NBWORD0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1089
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1090
lemma WORDLEN_NBWORD: "ALL x xa. WORDLEN (NBWORD x xa) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1091
  by (import bword_num WORDLEN_NBWORD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1092
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1093
lemma PWORDLEN_NBWORD: "ALL x xa. IN (NBWORD x xa) (PWORDLEN x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1094
  by (import bword_num PWORDLEN_NBWORD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1095
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1096
lemma NBWORD_SUC: "ALL n m. NBWORD (Suc n) m = WCAT (NBWORD n (m div 2), WORD [VB (m mod 2)])"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1097
  by (import bword_num NBWORD_SUC)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1098
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1099
lemma VB_BV: "ALL x. VB (BV x) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1100
  by (import bword_num VB_BV)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1101
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1102
lemma BV_VB: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1103
 (%x::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1104
     (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1105
      ((op <::nat => nat => bool) x
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1106
        ((number_of::bin => nat)
15647
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1107
          ((op BIT::bin => bit => bin)
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1108
            ((op BIT::bin => bit => bin) (Numeral.Pls::bin) (bit.B1::bit))
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1109
            (bit.B0::bit))))
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1110
      ((op =::nat => nat => bool) ((BV::bool => nat) ((VB::nat => bool) x))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1111
        x))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1112
  by (import bword_num BV_VB)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1113
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1114
lemma NBWORD_BNVAL: "ALL n. RES_FORALL (PWORDLEN n) (%w. NBWORD n (BNVAL w) = w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1115
  by (import bword_num NBWORD_BNVAL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1116
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1117
lemma BNVAL_NBWORD: "ALL n m. m < 2 ^ n --> BNVAL (NBWORD n m) = m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1118
  by (import bword_num BNVAL_NBWORD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1119
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1120
lemma ZERO_WORD_VAL: "RES_FORALL (PWORDLEN n) (%w. (w = NBWORD n 0) = (BNVAL w = 0))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1121
  by (import bword_num ZERO_WORD_VAL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1122
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1123
lemma WCAT_NBWORD_0: "ALL n1 n2. WCAT (NBWORD n1 0, NBWORD n2 0) = NBWORD (n1 + n2) 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1124
  by (import bword_num WCAT_NBWORD_0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1125
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1126
lemma WSPLIT_NBWORD_0: "ALL n m. m <= n --> WSPLIT m (NBWORD n 0) = (NBWORD (n - m) 0, NBWORD m 0)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1127
  by (import bword_num WSPLIT_NBWORD_0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1128
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1129
lemma EQ_NBWORD0_SPLIT: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1130
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1131
     (RES_FORALL::(bool word => bool) => (bool word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1132
      ((PWORDLEN::nat => bool word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1133
      (%w::bool word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1134
          (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1135
           (%m::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1136
               (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1137
                ((op <=::nat => nat => bool) m n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1138
                ((op =::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1139
                  ((op =::bool word => bool word => bool) w
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1140
                    ((NBWORD::nat => nat => bool word) n (0::nat)))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1141
                  ((op &::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1142
                    ((op =::bool word => bool word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1143
                      ((WSEG::nat => nat => bool word => bool word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1144
                        ((op -::nat => nat => nat) n m) m w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1145
                      ((NBWORD::nat => nat => bool word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1146
                        ((op -::nat => nat => nat) n m) (0::nat)))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1147
                    ((op =::bool word => bool word => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1148
                      ((WSEG::nat => nat => bool word => bool word) m
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1149
                        (0::nat) w)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1150
                      ((NBWORD::nat => nat => bool word) m (0::nat))))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1151
  by (import bword_num EQ_NBWORD0_SPLIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1152
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1153
lemma NBWORD_MOD: "ALL n m. NBWORD n (m mod 2 ^ n) = NBWORD n m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1154
  by (import bword_num NBWORD_MOD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1155
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1156
lemma WSEG_NBWORD_SUC: "ALL n m. WSEG n 0 (NBWORD (Suc n) m) = NBWORD n m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1157
  by (import bword_num WSEG_NBWORD_SUC)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1158
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1159
lemma NBWORD_SUC_WSEG: "ALL n. RES_FORALL (PWORDLEN (Suc n)) (%w. NBWORD n (BNVAL w) = WSEG n 0 w)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1160
  by (import bword_num NBWORD_SUC_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1161
15647
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1162
lemma DOUBL_EQ_SHL: "ALL x>0.
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1163
   RES_FORALL (PWORDLEN x)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1164
    (%xa. ALL xb.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1165
             NBWORD x (BNVAL xa + BNVAL xa + BV xb) = snd (SHL False xa xb))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1166
  by (import bword_num DOUBL_EQ_SHL)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1167
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1168
lemma MSB_NBWORD: "ALL n m. bit n (NBWORD (Suc n) m) = VB (m div 2 ^ n mod 2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1169
  by (import bword_num MSB_NBWORD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1170
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1171
lemma NBWORD_SPLIT: "ALL n1 n2 m.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1172
   NBWORD (n1 + n2) m = WCAT (NBWORD n1 (m div 2 ^ n2), NBWORD n2 m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1173
  by (import bword_num NBWORD_SPLIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1174
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1175
lemma WSEG_NBWORD: "ALL m k n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1176
   m + k <= n --> (ALL l. WSEG m k (NBWORD n l) = NBWORD m (l div 2 ^ k))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1177
  by (import bword_num WSEG_NBWORD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1178
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1179
lemma NBWORD_SUC_FST: "ALL n x. NBWORD (Suc n) x = WCAT (WORD [VB (x div 2 ^ n mod 2)], NBWORD n x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1180
  by (import bword_num NBWORD_SUC_FST)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1181
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1182
lemma BIT_NBWORD0: "ALL k n. k < n --> bit k (NBWORD n 0) = False"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1183
  by (import bword_num BIT_NBWORD0)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1184
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1185
lemma ADD_BNVAL_LEFT: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1186
   RES_FORALL (PWORDLEN (Suc n))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1187
    (%w1. RES_FORALL (PWORDLEN (Suc n))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1188
           (%w2. BNVAL w1 + BNVAL w2 =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1189
                 (BV (bit n w1) + BV (bit n w2)) * 2 ^ n +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1190
                 (BNVAL (WSEG n 0 w1) + BNVAL (WSEG n 0 w2))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1191
  by (import bword_num ADD_BNVAL_LEFT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1192
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1193
lemma ADD_BNVAL_RIGHT: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1194
   RES_FORALL (PWORDLEN (Suc n))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1195
    (%w1. RES_FORALL (PWORDLEN (Suc n))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1196
           (%w2. BNVAL w1 + BNVAL w2 =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1197
                 (BNVAL (WSEG n 1 w1) + BNVAL (WSEG n 1 w2)) * 2 +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1198
                 (BV (bit 0 w1) + BV (bit 0 w2))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1199
  by (import bword_num ADD_BNVAL_RIGHT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1200
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1201
lemma ADD_BNVAL_SPLIT: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1202
   RES_FORALL (PWORDLEN (n1 + n2))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1203
    (%w1. RES_FORALL (PWORDLEN (n1 + n2))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1204
           (%w2. BNVAL w1 + BNVAL w2 =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1205
                 (BNVAL (WSEG n1 n2 w1) + BNVAL (WSEG n1 n2 w2)) * 2 ^ n2 +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1206
                 (BNVAL (WSEG n2 0 w1) + BNVAL (WSEG n2 0 w2))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1207
  by (import bword_num ADD_BNVAL_SPLIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1208
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1209
;end_setup
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1210
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1211
;setup_theory bword_arith
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1212
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1213
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1214
  ACARRY :: "nat => bool word => bool word => bool => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1215
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1216
specification (ACARRY) ACARRY_DEF: "(ALL w1 w2 cin. ACARRY 0 w1 w2 cin = cin) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1217
(ALL n w1 w2 cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1218
    ACARRY (Suc n) w1 w2 cin =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1219
    VB ((BV (bit n w1) + BV (bit n w2) + BV (ACARRY n w1 w2 cin)) div 2))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1220
  by (import bword_arith ACARRY_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1221
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1222
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1223
  ICARRY :: "nat => bool word => bool word => bool => bool" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1224
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1225
specification (ICARRY) ICARRY_DEF: "(ALL w1 w2 cin. ICARRY 0 w1 w2 cin = cin) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1226
(ALL n w1 w2 cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1227
    ICARRY (Suc n) w1 w2 cin =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1228
    (bit n w1 & bit n w2 | (bit n w1 | bit n w2) & ICARRY n w1 w2 cin))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1229
  by (import bword_arith ICARRY_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1230
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1231
lemma ACARRY_EQ_ICARRY: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1232
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1233
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1234
           (%w2. ALL cin k.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1235
                    k <= n --> ACARRY k w1 w2 cin = ICARRY k w1 w2 cin))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1236
  by (import bword_arith ACARRY_EQ_ICARRY)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1237
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1238
lemma BNVAL_LESS_EQ: "ALL n. RES_FORALL (PWORDLEN n) (%w. BNVAL w <= 2 ^ n - 1)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1239
  by (import bword_arith BNVAL_LESS_EQ)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1240
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1241
lemma ADD_BNVAL_LESS_EQ1: "ALL n cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1242
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1243
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1244
           (%w2. (BNVAL w1 + (BNVAL w2 + BV cin)) div 2 ^ n <= Suc 0))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1245
  by (import bword_arith ADD_BNVAL_LESS_EQ1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1246
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1247
lemma ADD_BV_BNVAL_DIV_LESS_EQ1: "ALL n x1 x2 cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1248
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1249
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1250
           (%w2. (BV x1 + BV x2 +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1251
                  (BNVAL w1 + (BNVAL w2 + BV cin)) div 2 ^ n) div
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1252
                 2
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1253
                 <= 1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1254
  by (import bword_arith ADD_BV_BNVAL_DIV_LESS_EQ1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1255
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1256
lemma ADD_BV_BNVAL_LESS_EQ: "ALL n x1 x2 cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1257
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1258
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1259
           (%w2. BV x1 + BV x2 + (BNVAL w1 + (BNVAL w2 + BV cin))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1260
                 <= Suc (2 ^ Suc n)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1261
  by (import bword_arith ADD_BV_BNVAL_LESS_EQ)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1262
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1263
lemma ADD_BV_BNVAL_LESS_EQ1: "ALL n x1 x2 cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1264
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1265
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1266
           (%w2. (BV x1 + BV x2 + (BNVAL w1 + (BNVAL w2 + BV cin))) div
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1267
                 2 ^ Suc n
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1268
                 <= 1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1269
  by (import bword_arith ADD_BV_BNVAL_LESS_EQ1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1270
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1271
lemma ACARRY_EQ_ADD_DIV: "(All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1272
 (%n::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1273
     (RES_FORALL::(bool word => bool) => (bool word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1274
      ((PWORDLEN::nat => bool word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1275
      (%w1::bool word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1276
          (RES_FORALL::(bool word => bool) => (bool word => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1277
           ((PWORDLEN::nat => bool word => bool) n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1278
           (%w2::bool word.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1279
               (All::(nat => bool) => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1280
                (%k::nat.
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1281
                    (op -->::bool => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1282
                     ((op <::nat => nat => bool) k n)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1283
                     ((op =::nat => nat => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1284
                       ((BV::bool => nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1285
                         ((ACARRY::nat
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1286
                                   => bool word
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1287
=> bool word => bool => bool)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1288
                           k w1 w2 (cin::bool)))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1289
                       ((op div::nat => nat => nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1290
                         ((op +::nat => nat => nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1291
                           ((op +::nat => nat => nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1292
                             ((BNVAL::bool word => nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1293
                               ((WSEG::nat => nat => bool word => bool word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1294
                                 k (0::nat) w1))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1295
                             ((BNVAL::bool word => nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1296
                               ((WSEG::nat => nat => bool word => bool word)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1297
                                 k (0::nat) w2)))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1298
                           ((BV::bool => nat) cin))
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1299
                         ((op ^::nat => nat => nat)
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1300
                           ((number_of::bin => nat)
15647
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1301
                             ((op BIT::bin => bit => bin)
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1302
                               ((op BIT::bin => bit => bin)
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1303
                                 (Numeral.Pls::bin) (bit.B1::bit))
b1f486a9c56b Updated import configuration.
skalberg
parents: 15071
diff changeset
  1304
                               (bit.B0::bit)))
14847
44d92c12b255 updated;
wenzelm
parents: 14516
diff changeset
  1305
                           k)))))))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1306
  by (import bword_arith ACARRY_EQ_ADD_DIV)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1307
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1308
lemma ADD_WORD_SPLIT: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1309
   RES_FORALL (PWORDLEN (n1 + n2))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1310
    (%w1. RES_FORALL (PWORDLEN (n1 + n2))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1311
           (%w2. ALL cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1312
                    NBWORD (n1 + n2) (BNVAL w1 + BNVAL w2 + BV cin) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1313
                    WCAT
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1314
                     (NBWORD n1
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1315
                       (BNVAL (WSEG n1 n2 w1) + BNVAL (WSEG n1 n2 w2) +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1316
                        BV (ACARRY n2 w1 w2 cin)),
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1317
                      NBWORD n2
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1318
                       (BNVAL (WSEG n2 0 w1) + BNVAL (WSEG n2 0 w2) +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1319
                        BV cin))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1320
  by (import bword_arith ADD_WORD_SPLIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1321
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1322
lemma WSEG_NBWORD_ADD: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1323
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1324
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1325
           (%w2. ALL m k cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1326
                    m + k <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1327
                    WSEG m k (NBWORD n (BNVAL w1 + BNVAL w2 + BV cin)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1328
                    NBWORD m
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1329
                     (BNVAL (WSEG m k w1) + BNVAL (WSEG m k w2) +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1330
                      BV (ACARRY k w1 w2 cin))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1331
  by (import bword_arith WSEG_NBWORD_ADD)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1332
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1333
lemma ADD_NBWORD_EQ0_SPLIT: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1334
   RES_FORALL (PWORDLEN (n1 + n2))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1335
    (%w1. RES_FORALL (PWORDLEN (n1 + n2))
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1336
           (%w2. ALL cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1337
                    (NBWORD (n1 + n2) (BNVAL w1 + BNVAL w2 + BV cin) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1338
                     NBWORD (n1 + n2) 0) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1339
                    (NBWORD n1
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1340
                      (BNVAL (WSEG n1 n2 w1) + BNVAL (WSEG n1 n2 w2) +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1341
                       BV (ACARRY n2 w1 w2 cin)) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1342
                     NBWORD n1 0 &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1343
                     NBWORD n2
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1344
                      (BNVAL (WSEG n2 0 w1) + BNVAL (WSEG n2 0 w2) +
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1345
                       BV cin) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1346
                     NBWORD n2 0)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1347
  by (import bword_arith ADD_NBWORD_EQ0_SPLIT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1348
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1349
lemma ACARRY_MSB: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1350
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1351
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1352
           (%w2. ALL cin.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1353
                    ACARRY n w1 w2 cin =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1354
                    bit n (NBWORD (Suc n) (BNVAL w1 + BNVAL w2 + BV cin))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1355
  by (import bword_arith ACARRY_MSB)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1356
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1357
lemma ACARRY_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1358
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1359
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1360
           (%w2. ALL cin k m.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1361
                    k < m & m <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1362
                    ACARRY k (WSEG m 0 w1) (WSEG m 0 w2) cin =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1363
                    ACARRY k w1 w2 cin))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1364
  by (import bword_arith ACARRY_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1365
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1366
lemma ICARRY_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1367
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1368
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1369
           (%w2. ALL cin k m.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1370
                    k < m & m <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1371
                    ICARRY k (WSEG m 0 w1) (WSEG m 0 w2) cin =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1372
                    ICARRY k w1 w2 cin))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1373
  by (import bword_arith ICARRY_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1374
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1375
lemma ACARRY_ACARRY_WSEG: "ALL n.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1376
   RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1377
    (%w1. RES_FORALL (PWORDLEN n)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1378
           (%w2. ALL cin m k1 k2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1379
                    k1 < m & k2 < n & m + k2 <= n -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1380
                    ACARRY k1 (WSEG m k2 w1) (WSEG m k2 w2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1381
                     (ACARRY k2 w1 w2 cin) =
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1382
                    ACARRY (k1 + k2) w1 w2 cin))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1383
  by (import bword_arith ACARRY_ACARRY_WSEG)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1384
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1385
;end_setup
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1386
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1387
;setup_theory bword_bitop
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1388
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1389
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1390
  WNOT :: "bool word => bool word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1391
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1392
specification (WNOT) WNOT_DEF: "ALL l. WNOT (WORD l) = WORD (map Not l)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1393
  by (import bword_bitop WNOT_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1394
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1395
lemma PBITOP_WNOT: "IN WNOT PBITOP"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1396
  by (import bword_bitop PBITOP_WNOT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1397
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1398
lemma WNOT_WNOT: "ALL w. WNOT (WNOT w) = w"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1399
  by (import bword_bitop WNOT_WNOT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1400
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1401
lemma WCAT_WNOT: "ALL n1 n2.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1402
   RES_FORALL (PWORDLEN n1)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1403
    (%w1. RES_FORALL (PWORDLEN n2)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1404
           (%w2. WCAT (WNOT w1, WNOT w2) = WNOT (WCAT (w1, w2))))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1405
  by (import bword_bitop WCAT_WNOT)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1406
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1407
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1408
  WAND :: "bool word => bool word => bool word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1409
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1410
specification (WAND) WAND_DEF: "ALL l1 l2. WAND (WORD l1) (WORD l2) = WORD (map2 op & l1 l2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1411
  by (import bword_bitop WAND_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1412
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1413
lemma PBITBOP_WAND: "IN WAND PBITBOP"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1414
  by (import bword_bitop PBITBOP_WAND)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1415
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1416
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1417
  WOR :: "bool word => bool word => bool word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1418
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1419
specification (WOR) WOR_DEF: "ALL l1 l2. WOR (WORD l1) (WORD l2) = WORD (map2 op | l1 l2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1420
  by (import bword_bitop WOR_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1421
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1422
lemma PBITBOP_WOR: "IN WOR PBITBOP"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1423
  by (import bword_bitop PBITBOP_WOR)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1424
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1425
consts
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1426
  WXOR :: "bool word => bool word => bool word" 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1427
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1428
specification (WXOR) WXOR_DEF: "ALL l1 l2. WXOR (WORD l1) (WORD l2) = WORD (map2 (%x y. x ~= y) l1 l2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1429
  by (import bword_bitop WXOR_DEF)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1430
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1431
lemma PBITBOP_WXOR: "IN WXOR PBITBOP"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1432
  by (import bword_bitop PBITBOP_WXOR)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1433
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1434
;end_setup
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1435
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1436
end
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
  1437