src/HOL/Import/HOL4Compat.thy
author haftmann
Thu, 18 Nov 2010 17:01:16 +0100
changeset 40607 30d512bf47a7
parent 39246 9e58f0499f57
child 41413 64cd30d6b0b8
permissions -rw-r--r--
map_pair replaces prod_fun
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14620
1be590fd2422 Minor cleanup of headers and some speedup of the HOL4 import.
skalberg
parents: 14516
diff changeset
     1
(*  Title:      HOL/Import/HOL4Compat.thy
1be590fd2422 Minor cleanup of headers and some speedup of the HOL4 import.
skalberg
parents: 14516
diff changeset
     2
    Author:     Sebastian Skalberg (TU Muenchen)
1be590fd2422 Minor cleanup of headers and some speedup of the HOL4 import.
skalberg
parents: 14516
diff changeset
     3
*)
1be590fd2422 Minor cleanup of headers and some speedup of the HOL4 import.
skalberg
parents: 14516
diff changeset
     4
30660
53e1b1641f09 more canonical import, syntax fix
haftmann
parents: 30235
diff changeset
     5
theory HOL4Compat
32479
521cc9bf2958 some reorganization of number theory
haftmann
parents: 30971
diff changeset
     6
imports HOL4Setup Complex_Main "~~/src/HOL/Old_Number_Theory/Primes" ContNotDenum
19064
bf19cc5a7899 fixed bugs, added caching
obua
parents: 17188
diff changeset
     7
begin
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
     8
37596
248db70c9bcf dropped ancient infix mem
haftmann
parents: 35416
diff changeset
     9
abbreviation (input) mem (infixl "mem" 55) where "x mem xs \<equiv> List.member xs x"
30660
53e1b1641f09 more canonical import, syntax fix
haftmann
parents: 30235
diff changeset
    10
no_notation differentiable (infixl "differentiable" 60)
53e1b1641f09 more canonical import, syntax fix
haftmann
parents: 30235
diff changeset
    11
no_notation sums (infixr "sums" 80)
53e1b1641f09 more canonical import, syntax fix
haftmann
parents: 30235
diff changeset
    12
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    13
lemma EXISTS_UNIQUE_DEF: "(Ex1 P) = (Ex P & (ALL x y. P x & P y --> (x = y)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    14
  by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    15
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    16
lemma COND_DEF:"(If b t f) = (@x. ((b = True) --> (x = t)) & ((b = False) --> (x = f)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    17
  by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    18
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
    19
definition LET :: "['a \<Rightarrow> 'b,'a] \<Rightarrow> 'b" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    20
  "LET f s == f s"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    21
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    22
lemma [hol4rew]: "LET f s = Let s f"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    23
  by (simp add: LET_def Let_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    24
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    25
lemmas [hol4rew] = ONE_ONE_rew
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    26
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    27
lemma bool_case_DEF: "(bool_case x y b) = (if b then x else y)"
30660
53e1b1641f09 more canonical import, syntax fix
haftmann
parents: 30235
diff changeset
    28
  by simp
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    29
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    30
lemma INR_INL_11: "(ALL y x. (Inl x = Inl y) = (x = y)) & (ALL y x. (Inr x = Inr y) = (x = y))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    31
  by safe
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    32
17188
a26a4fc323ed Updated import.
obua
parents: 16417
diff changeset
    33
(*lemma INL_neq_INR: "ALL v1 v2. Sum_Type.Inr v2 ~= Sum_Type.Inl v1"
a26a4fc323ed Updated import.
obua
parents: 16417
diff changeset
    34
  by simp*)
a26a4fc323ed Updated import.
obua
parents: 16417
diff changeset
    35
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    36
primrec ISL :: "'a + 'b => bool" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    37
  "ISL (Inl x) = True"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    38
| "ISL (Inr x) = False"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    39
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    40
primrec ISR :: "'a + 'b => bool" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    41
  "ISR (Inl x) = False"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    42
| "ISR (Inr x) = True"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    43
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    44
lemma ISL: "(ALL x. ISL (Inl x)) & (ALL y. ~ISL (Inr y))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    45
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    46
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    47
lemma ISR: "(ALL x. ISR (Inr x)) & (ALL y. ~ISR (Inl y))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    48
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    49
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    50
primrec OUTL :: "'a + 'b => 'a" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    51
  "OUTL (Inl x) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    52
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    53
primrec OUTR :: "'a + 'b => 'b" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    54
  "OUTR (Inr x) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    55
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    56
lemma OUTL: "OUTL (Inl x) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    57
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    58
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    59
lemma OUTR: "OUTR (Inr x) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    60
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    61
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    62
lemma sum_case_def: "(ALL f g x. sum_case f g (Inl x) = f x) & (ALL f g y. sum_case f g (Inr y) = g y)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    63
  by simp;
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    64
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    65
lemma one: "ALL v. v = ()"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    66
  by simp;
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    67
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    68
lemma option_case_def: "(!u f. option_case u f None = u) & (!u f x. option_case u f (Some x) = f x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    69
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    70
30235
58d147683393 Made Option a separate theory and renamed option_map to Option.map
nipkow
parents: 29044
diff changeset
    71
lemma OPTION_MAP_DEF: "(!f x. Option.map f (Some x) = Some (f x)) & (!f. Option.map f None = None)"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    72
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    73
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    74
primrec IS_SOME :: "'a option => bool" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    75
  "IS_SOME (Some x) = True"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    76
| "IS_SOME None = False"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    77
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    78
primrec IS_NONE :: "'a option => bool" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    79
  "IS_NONE (Some x) = False"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    80
| "IS_NONE None = True"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    81
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    82
lemma IS_NONE_DEF: "(!x. IS_NONE (Some x) = False) & (IS_NONE None = True)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    83
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    84
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    85
lemma IS_SOME_DEF: "(!x. IS_SOME (Some x) = True) & (IS_SOME None = False)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    86
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    87
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    88
primrec OPTION_JOIN :: "'a option option => 'a option" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    89
  "OPTION_JOIN None = None"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    90
| "OPTION_JOIN (Some x) = x"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    91
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    92
lemma OPTION_JOIN_DEF: "(OPTION_JOIN None = None) & (ALL x. OPTION_JOIN (Some x) = x)"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
    93
  by simp
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    94
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    95
lemma PAIR: "(fst x,snd x) = x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    96
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
    97
40607
30d512bf47a7 map_pair replaces prod_fun
haftmann
parents: 39246
diff changeset
    98
lemma PAIR_MAP: "map_pair f g p = (f (fst p),g (snd p))"
30d512bf47a7 map_pair replaces prod_fun
haftmann
parents: 39246
diff changeset
    99
  by (simp add: map_pair_def split_def)
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   100
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   101
lemma pair_case_def: "split = split"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   102
  ..;
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   103
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   104
lemma LESS_OR_EQ: "m <= (n::nat) = (m < n | m = n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   105
  by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   106
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   107
definition nat_gt :: "nat => nat => bool" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   108
  "nat_gt == %m n. n < m"
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   109
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   110
definition nat_ge :: "nat => nat => bool" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   111
  "nat_ge == %m n. nat_gt m n | m = n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   112
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   113
lemma [hol4rew]: "nat_gt m n = (n < m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   114
  by (simp add: nat_gt_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   115
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   116
lemma [hol4rew]: "nat_ge m n = (n <= m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   117
  by (auto simp add: nat_ge_def nat_gt_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   118
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   119
lemma GREATER_DEF: "ALL m n. (n < m) = (n < m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   120
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   121
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   122
lemma GREATER_OR_EQ: "ALL m n. n <= (m::nat) = (n < m | m = n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   123
  by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   124
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   125
lemma LESS_DEF: "m < n = (? P. (!n. P (Suc n) --> P n) & P m & ~P n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   126
proof safe
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   127
  assume "m < n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   128
  def P == "%n. n <= m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   129
  have "(!n. P (Suc n) \<longrightarrow> P n) & P m & ~P n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   130
  proof (auto simp add: P_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   131
    assume "n <= m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   132
    from prems
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   133
    show False
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   134
      by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   135
  qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   136
  thus "? P. (!n. P (Suc n) \<longrightarrow> P n) & P m & ~P n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   137
    by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   138
next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   139
  fix P
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   140
  assume alln: "!n. P (Suc n) \<longrightarrow> P n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   141
  assume pm: "P m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   142
  assume npn: "~P n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   143
  have "!k q. q + k = m \<longrightarrow> P q"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   144
  proof
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   145
    fix k
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   146
    show "!q. q + k = m \<longrightarrow> P q"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   147
    proof (induct k,simp_all)
23389
aaca6a8e5414 tuned proofs: avoid implicit prems;
wenzelm
parents: 20432
diff changeset
   148
      show "P m" by fact
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   149
    next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   150
      fix k
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   151
      assume ind: "!q. q + k = m \<longrightarrow> P q"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   152
      show "!q. Suc (q + k) = m \<longrightarrow> P q"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   153
      proof (rule+)
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   154
        fix q
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   155
        assume "Suc (q + k) = m"
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   156
        hence "(Suc q) + k = m"
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   157
          by simp
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   158
        with ind
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   159
        have psq: "P (Suc q)"
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   160
          by simp
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   161
        from alln
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   162
        have "P (Suc q) --> P q"
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   163
          ..
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   164
        with psq
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   165
        show "P q"
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   166
          by simp
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   167
      qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   168
    qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   169
  qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   170
  hence "!q. q + (m - n) = m \<longrightarrow> P q"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   171
    ..
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   172
  hence hehe: "n + (m - n) = m \<longrightarrow> P n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   173
    ..
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   174
  show "m < n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   175
  proof (rule classical)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   176
    assume "~(m<n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   177
    hence "n <= m"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   178
      by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   179
    with hehe
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   180
    have "P n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   181
      by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   182
    with npn
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   183
    show "m < n"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   184
      ..
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   185
  qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   186
qed;
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   187
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   188
definition FUNPOW :: "('a => 'a) => nat => 'a => 'a" where
30971
7fbebf75b3ef funpow and relpow with shared "^^" syntax
haftmann
parents: 30952
diff changeset
   189
  "FUNPOW f n == f ^^ n"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   190
30971
7fbebf75b3ef funpow and relpow with shared "^^" syntax
haftmann
parents: 30952
diff changeset
   191
lemma FUNPOW: "(ALL f x. (f ^^ 0) x = x) &
7fbebf75b3ef funpow and relpow with shared "^^" syntax
haftmann
parents: 30952
diff changeset
   192
  (ALL f n x. (f ^^ Suc n) x = (f ^^ n) (f x))"
30952
7ab2716dd93b power operation on functions with syntax o^; power operation on relations with syntax ^^
haftmann
parents: 30660
diff changeset
   193
  by (simp add: funpow_swap1)
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   194
30971
7fbebf75b3ef funpow and relpow with shared "^^" syntax
haftmann
parents: 30952
diff changeset
   195
lemma [hol4rew]: "FUNPOW f n = f ^^ n"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   196
  by (simp add: FUNPOW_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   197
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   198
lemma ADD: "(!n. (0::nat) + n = n) & (!m n. Suc m + n = Suc (m + n))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   199
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   200
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   201
lemma MULT: "(!n. (0::nat) * n = 0) & (!m n. Suc m * n = m * n + n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   202
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   203
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   204
lemma SUB: "(!m. (0::nat) - m = 0) & (!m n. (Suc m) - n = (if m < n then 0 else Suc (m - n)))"
30952
7ab2716dd93b power operation on functions with syntax o^; power operation on relations with syntax ^^
haftmann
parents: 30660
diff changeset
   205
  by (simp) arith
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   206
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   207
lemma MAX_DEF: "max (m::nat) n = (if m < n then n else m)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   208
  by (simp add: max_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   209
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   210
lemma MIN_DEF: "min (m::nat) n = (if m < n then m else n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   211
  by (simp add: min_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   212
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   213
lemma DIVISION: "(0::nat) < n --> (!k. (k = k div n * n + k mod n) & k mod n < n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   214
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   215
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   216
definition ALT_ZERO :: nat where 
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   217
  "ALT_ZERO == 0"
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   218
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   219
definition NUMERAL_BIT1 :: "nat \<Rightarrow> nat" where 
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   220
  "NUMERAL_BIT1 n == n + (n + Suc 0)"
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   221
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   222
definition NUMERAL_BIT2 :: "nat \<Rightarrow> nat" where 
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   223
  "NUMERAL_BIT2 n == n + (n + Suc (Suc 0))"
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   224
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   225
definition NUMERAL :: "nat \<Rightarrow> nat" where 
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   226
  "NUMERAL x == x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   227
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   228
lemma [hol4rew]: "NUMERAL ALT_ZERO = 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   229
  by (simp add: ALT_ZERO_def NUMERAL_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   230
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   231
lemma [hol4rew]: "NUMERAL (NUMERAL_BIT1 ALT_ZERO) = 1"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   232
  by (simp add: ALT_ZERO_def NUMERAL_BIT1_def NUMERAL_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   233
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   234
lemma [hol4rew]: "NUMERAL (NUMERAL_BIT2 ALT_ZERO) = 2"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   235
  by (simp add: ALT_ZERO_def NUMERAL_BIT2_def NUMERAL_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   236
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   237
lemma EXP: "(!m. m ^ 0 = (1::nat)) & (!m n. m ^ Suc n = m * (m::nat) ^ n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   238
  by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   239
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   240
lemma num_case_def: "(!b f. nat_case b f 0 = b) & (!b f n. nat_case b f (Suc n) = f n)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   241
  by simp;
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   242
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   243
lemma divides_def: "(a::nat) dvd b = (? q. b = q * a)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   244
  by (auto simp add: dvd_def);
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   245
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   246
lemma list_case_def: "(!v f. list_case v f [] = v) & (!v f a0 a1. list_case v f (a0#a1) = f a0 a1)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   247
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   248
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   249
primrec list_size :: "('a \<Rightarrow> nat) \<Rightarrow> 'a list \<Rightarrow> nat" where
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   250
  "list_size f [] = 0"
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   251
| "list_size f (a0#a1) = 1 + (f a0 + list_size f a1)"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   252
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   253
lemma list_size_def': "(!f. list_size f [] = 0) &
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   254
         (!f a0 a1. list_size f (a0#a1) = 1 + (f a0 + list_size f a1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   255
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   256
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   257
lemma list_case_cong: "! M M' v f. M = M' & (M' = [] \<longrightarrow>  v = v') &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   258
           (!a0 a1. (M' = a0#a1) \<longrightarrow> (f a0 a1 = f' a0 a1)) -->
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   259
           (list_case v f M = list_case v' f' M')"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   260
proof clarify
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   261
  fix M M' v f
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   262
  assume "M' = [] \<longrightarrow> v = v'"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   263
    and "!a0 a1. M' = a0 # a1 \<longrightarrow> f a0 a1 = f' a0 a1"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   264
  show "list_case v f M' = list_case v' f' M'"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   265
  proof (rule List.list.case_cong)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   266
    show "M' = M'"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   267
      ..
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   268
  next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   269
    assume "M' = []"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   270
    with prems
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   271
    show "v = v'"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   272
      by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   273
  next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   274
    fix a0 a1
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   275
    assume "M' = a0 # a1"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   276
    with prems
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   277
    show "f a0 a1 = f' a0 a1"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   278
      by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   279
  qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   280
qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   281
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   282
lemma list_Axiom: "ALL f0 f1. EX fn. (fn [] = f0) & (ALL a0 a1. fn (a0#a1) = f1 a0 a1 (fn a1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   283
proof safe
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   284
  fix f0 f1
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   285
  def fn == "list_rec f0 f1"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   286
  have "fn [] = f0 & (ALL a0 a1. fn (a0 # a1) = f1 a0 a1 (fn a1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   287
    by (simp add: fn_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   288
  thus "EX fn. fn [] = f0 & (ALL a0 a1. fn (a0 # a1) = f1 a0 a1 (fn a1))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   289
    by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   290
qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   291
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   292
lemma list_Axiom_old: "EX! fn. (fn [] = x) & (ALL h t. fn (h#t) = f (fn t) h t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   293
proof safe
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   294
  def fn == "list_rec x (%h t r. f r h t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   295
  have "fn [] = x & (ALL h t. fn (h # t) = f (fn t) h t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   296
    by (simp add: fn_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   297
  thus "EX fn. fn [] = x & (ALL h t. fn (h # t) = f (fn t) h t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   298
    by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   299
next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   300
  fix fn1 fn2
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   301
  assume "ALL h t. fn1 (h # t) = f (fn1 t) h t"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   302
  assume "ALL h t. fn2 (h # t) = f (fn2 t) h t"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   303
  assume "fn2 [] = fn1 []"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   304
  show "fn1 = fn2"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   305
  proof
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   306
    fix xs
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   307
    show "fn1 xs = fn2 xs"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   308
      by (induct xs,simp_all add: prems) 
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   309
  qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   310
qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   311
37596
248db70c9bcf dropped ancient infix mem
haftmann
parents: 35416
diff changeset
   312
lemma NULL_DEF: "(List.null [] = True) & (!h t. List.null (h # t) = False)"
248db70c9bcf dropped ancient infix mem
haftmann
parents: 35416
diff changeset
   313
  by (simp add: null_def)
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   314
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   315
definition sum :: "nat list \<Rightarrow> nat" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   316
  "sum l == foldr (op +) l 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   317
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   318
lemma SUM: "(sum [] = 0) & (!h t. sum (h#t) = h + sum t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   319
  by (simp add: sum_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   320
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   321
lemma APPEND: "(!l. [] @ l = l) & (!l1 l2 h. (h#l1) @ l2 = h# l1 @ l2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   322
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   323
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   324
lemma FLAT: "(concat [] = []) & (!h t. concat (h#t) = h @ (concat t))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   325
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   326
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   327
lemma LENGTH: "(length [] = 0) & (!h t. length (h#t) = Suc (length t))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   328
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   329
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   330
lemma MAP: "(!f. map f [] = []) & (!f h t. map f (h#t) = f h#map f t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   331
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   332
37596
248db70c9bcf dropped ancient infix mem
haftmann
parents: 35416
diff changeset
   333
lemma MEM: "(!x. List.member [] x = False) & (!x h t. List.member (h#t) x = ((x = h) | List.member t x))"
248db70c9bcf dropped ancient infix mem
haftmann
parents: 35416
diff changeset
   334
  by (simp add: member_def)
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   335
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   336
lemma FILTER: "(!P. filter P [] = []) & (!P h t.
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   337
           filter P (h#t) = (if P h then h#filter P t else filter P t))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   338
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   339
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   340
lemma REPLICATE: "(ALL x. replicate 0 x = []) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   341
  (ALL n x. replicate (Suc n) x = x # replicate n x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   342
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   343
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   344
definition FOLDR :: "[['a,'b]\<Rightarrow>'b,'b,'a list] \<Rightarrow> 'b" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   345
  "FOLDR f e l == foldr f l e"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   346
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   347
lemma [hol4rew]: "FOLDR f e l = foldr f l e"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   348
  by (simp add: FOLDR_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   349
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   350
lemma FOLDR: "(!f e. foldr f [] e = e) & (!f e x l. foldr f (x#l) e = f x (foldr f l e))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   351
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   352
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   353
lemma FOLDL: "(!f e. foldl f e [] = e) & (!f e x l. foldl f e (x#l) = foldl f (f e x) l)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   354
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   355
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   356
lemma EVERY_DEF: "(!P. list_all P [] = True) & (!P h t. list_all P (h#t) = (P h & list_all P t))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   357
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   358
37596
248db70c9bcf dropped ancient infix mem
haftmann
parents: 35416
diff changeset
   359
lemma list_exists_DEF: "(!P. list_ex P [] = False) & (!P h t. list_ex P (h#t) = (P h | list_ex P t))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   360
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   361
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   362
primrec map2 :: "[['a,'b]\<Rightarrow>'c,'a list,'b list] \<Rightarrow> 'c list" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   363
  map2_Nil: "map2 f [] l2 = []"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   364
| map2_Cons: "map2 f (x#xs) l2 = f x (hd l2) # map2 f xs (tl l2)"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   365
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   366
lemma MAP2: "(!f. map2 f [] [] = []) & (!f h1 t1 h2 t2. map2 f (h1#t1) (h2#t2) = f h1 h2#map2 f t1 t2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   367
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   368
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   369
lemma list_INDUCT: "\<lbrakk> P [] ; !t. P t \<longrightarrow> (!h. P (h#t)) \<rbrakk> \<Longrightarrow> !l. P l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   370
proof
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   371
  fix l
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   372
  assume "P []"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   373
  assume allt: "!t. P t \<longrightarrow> (!h. P (h # t))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   374
  show "P l"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   375
  proof (induct l)
23389
aaca6a8e5414 tuned proofs: avoid implicit prems;
wenzelm
parents: 20432
diff changeset
   376
    show "P []" by fact
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   377
  next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   378
    fix h t
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   379
    assume "P t"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   380
    with allt
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   381
    have "!h. P (h # t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   382
      by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   383
    thus "P (h # t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   384
      ..
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   385
  qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   386
qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   387
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   388
lemma list_CASES: "(l = []) | (? t h. l = h#t)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   389
  by (induct l,auto)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   390
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   391
definition ZIP :: "'a list * 'b list \<Rightarrow> ('a * 'b) list" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   392
  "ZIP == %(a,b). zip a b"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   393
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   394
lemma ZIP: "(zip [] [] = []) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   395
  (!x1 l1 x2 l2. zip (x1#l1) (x2#l2) = (x1,x2)#zip l1 l2)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   396
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   397
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   398
lemma [hol4rew]: "ZIP (a,b) = zip a b"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   399
  by (simp add: ZIP_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   400
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   401
primrec unzip :: "('a * 'b) list \<Rightarrow> 'a list * 'b list" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   402
  unzip_Nil: "unzip [] = ([],[])"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 37596
diff changeset
   403
| unzip_Cons: "unzip (xy#xys) = (let zs = unzip xys in (fst xy # fst zs,snd xy # snd zs))"
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   404
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   405
lemma UNZIP: "(unzip [] = ([],[])) &
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   406
         (!x l. unzip (x#l) = (fst x#fst (unzip l),snd x#snd (unzip l)))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   407
  by (simp add: Let_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   408
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   409
lemma REVERSE: "(rev [] = []) & (!h t. rev (h#t) = (rev t) @ [h])"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   410
  by simp;
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   411
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   412
lemma REAL_SUP_ALLPOS: "\<lbrakk> ALL x. P (x::real) \<longrightarrow> 0 < x ; EX x. P x; EX z. ALL x. P x \<longrightarrow> x < z \<rbrakk> \<Longrightarrow> EX s. ALL y. (EX x. P x & y < x) = (y < s)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   413
proof safe
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   414
  fix x z
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   415
  assume allx: "ALL x. P x \<longrightarrow> 0 < x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   416
  assume px: "P x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   417
  assume allx': "ALL x. P x \<longrightarrow> x < z"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   418
  have "EX s. ALL y. (EX x : Collect P. y < x) = (y < s)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   419
  proof (rule posreal_complete)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   420
    show "ALL x : Collect P. 0 < x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   421
    proof safe
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   422
      fix x
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   423
      assume "P x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   424
      from allx
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   425
      have "P x \<longrightarrow> 0 < x"
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   426
        ..
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   427
      thus "0 < x"
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
   428
        by (simp add: prems)
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   429
    qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   430
  next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   431
    from px
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   432
    show "EX x. x : Collect P"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   433
      by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   434
  next
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   435
    from allx'
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   436
    show "EX y. ALL x : Collect P. x < y"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   437
      apply simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   438
      ..
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   439
  qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   440
  thus "EX s. ALL y. (EX x. P x & y < x) = (y < s)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   441
    by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   442
qed
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   443
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   444
lemma REAL_10: "~((1::real) = 0)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   445
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   446
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   447
lemma REAL_ADD_ASSOC: "(x::real) + (y + z) = x + y + z"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   448
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   449
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   450
lemma REAL_MUL_ASSOC: "(x::real) * (y * z) = x * y * z"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   451
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   452
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   453
lemma REAL_ADD_LINV:  "-x + x = (0::real)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   454
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   455
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   456
lemma REAL_MUL_LINV: "x ~= (0::real) ==> inverse x * x = 1"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   457
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   458
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   459
lemma REAL_LT_TOTAL: "((x::real) = y) | x < y | y < x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   460
  by auto;
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   461
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   462
lemma [hol4rew]: "real (0::nat) = 0"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   463
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   464
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   465
lemma [hol4rew]: "real (1::nat) = 1"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   466
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   467
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   468
lemma [hol4rew]: "real (2::nat) = 2"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   469
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   470
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   471
lemma real_lte: "((x::real) <= y) = (~(y < x))"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   472
  by auto
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   473
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   474
lemma real_of_num: "((0::real) = 0) & (!n. real (Suc n) = real n + 1)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   475
  by (simp add: real_of_nat_Suc)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   476
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   477
lemma abs: "abs (x::real) = (if 0 <= x then x else -x)"
15003
6145dd7538d7 replaced monomorphic abs definitions by abs_if
paulson
parents: 14620
diff changeset
   478
  by (simp add: abs_if)
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   479
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   480
lemma pow: "(!x::real. x ^ 0 = 1) & (!x::real. ALL n. x ^ (Suc n) = x * x ^ n)"
15003
6145dd7538d7 replaced monomorphic abs definitions by abs_if
paulson
parents: 14620
diff changeset
   481
  by simp
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   482
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   483
definition real_gt :: "real => real => bool" where 
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   484
  "real_gt == %x y. y < x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   485
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   486
lemma [hol4rew]: "real_gt x y = (y < x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   487
  by (simp add: real_gt_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   488
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   489
lemma real_gt: "ALL x (y::real). (y < x) = (y < x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   490
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   491
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 32960
diff changeset
   492
definition real_ge :: "real => real => bool" where
14516
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   493
  "real_ge x y == y <= x"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   494
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   495
lemma [hol4rew]: "real_ge x y = (y <= x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   496
  by (simp add: real_ge_def)
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   497
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   498
lemma real_ge: "ALL x y. (y <= x) = (y <= x)"
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   499
  by simp
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   500
a183dec876ab Added HOL proof importer.
skalberg
parents:
diff changeset
   501
end