src/HOL/Decision_Procs/Ferrack.thy
author wenzelm
Thu, 05 Nov 2015 10:39:59 +0100
changeset 61586 5197a2ecb658
parent 61424 c3658c18b7bc
child 61610 4f54d2759a0b
permissions -rw-r--r--
isabelle update_cartouches -c -t;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30439
57c68b3af2ea Updated paths in Decision_Procs comments and NEWS
hoelzl
parents: 30042
diff changeset
     1
(*  Title:      HOL/Decision_Procs/Ferrack.thy
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
     2
    Author:     Amine Chaieb
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
     3
*)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
     4
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
     5
theory Ferrack
41849
1a65b780bd56 Some cleaning up
nipkow
parents: 41842
diff changeset
     6
imports Complex_Main Dense_Linear_Order DP_Library
51143
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
     7
  "~~/src/HOL/Library/Code_Target_Numeral" "~~/src/HOL/Library/Old_Recdef"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
     8
begin
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
     9
61586
5197a2ecb658 isabelle update_cartouches -c -t;
wenzelm
parents: 61424
diff changeset
    10
section \<open>Quantifier elimination for \<open>\<real> (0, 1, +, <)\<close>\<close>
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    11
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    12
  (*********************************************************************************)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    13
  (****                            SHADOW SYNTAX AND SEMANTICS                  ****)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    14
  (*********************************************************************************)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    15
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    16
datatype num = C int | Bound nat | CN nat int num | Neg num | Add num num| Sub num num
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    17
  | Mul int num
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    18
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    19
  (* A size for num to make inductive proofs simpler*)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    20
primrec num_size :: "num \<Rightarrow> nat"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    21
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    22
  "num_size (C c) = 1"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    23
| "num_size (Bound n) = 1"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    24
| "num_size (Neg a) = 1 + num_size a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    25
| "num_size (Add a b) = 1 + num_size a + num_size b"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    26
| "num_size (Sub a b) = 3 + num_size a + num_size b"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    27
| "num_size (Mul c a) = 1 + num_size a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    28
| "num_size (CN n c a) = 3 + num_size a "
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    29
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    30
  (* Semantics of numeral terms (num) *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    31
primrec Inum :: "real list \<Rightarrow> num \<Rightarrow> real"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    32
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    33
  "Inum bs (C c) = (real c)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    34
| "Inum bs (Bound n) = bs!n"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    35
| "Inum bs (CN n c a) = (real c) * (bs!n) + (Inum bs a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    36
| "Inum bs (Neg a) = -(Inum bs a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    37
| "Inum bs (Add a b) = Inum bs a + Inum bs b"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    38
| "Inum bs (Sub a b) = Inum bs a - Inum bs b"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    39
| "Inum bs (Mul c a) = (real c) * Inum bs a"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    40
    (* FORMULAE *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    41
datatype fm  =
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    42
  T| F| Lt num| Le num| Gt num| Ge num| Eq num| NEq num|
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    43
  NOT fm| And fm fm|  Or fm fm| Imp fm fm| Iff fm fm| E fm| A fm
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    44
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    45
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    46
  (* A size for fm *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    47
fun fmsize :: "fm \<Rightarrow> nat"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    48
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    49
  "fmsize (NOT p) = 1 + fmsize p"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    50
| "fmsize (And p q) = 1 + fmsize p + fmsize q"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    51
| "fmsize (Or p q) = 1 + fmsize p + fmsize q"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    52
| "fmsize (Imp p q) = 3 + fmsize p + fmsize q"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    53
| "fmsize (Iff p q) = 3 + 2*(fmsize p + fmsize q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    54
| "fmsize (E p) = 1 + fmsize p"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    55
| "fmsize (A p) = 4+ fmsize p"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    56
| "fmsize p = 1"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    57
  (* several lemmas about fmsize *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    58
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    59
lemma fmsize_pos: "fmsize p > 0"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    60
  by (induct p rule: fmsize.induct) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    61
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    62
  (* Semantics of formulae (fm) *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    63
primrec Ifm ::"real list \<Rightarrow> fm \<Rightarrow> bool"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    64
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    65
  "Ifm bs T = True"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    66
| "Ifm bs F = False"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    67
| "Ifm bs (Lt a) = (Inum bs a < 0)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    68
| "Ifm bs (Gt a) = (Inum bs a > 0)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    69
| "Ifm bs (Le a) = (Inum bs a \<le> 0)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    70
| "Ifm bs (Ge a) = (Inum bs a \<ge> 0)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    71
| "Ifm bs (Eq a) = (Inum bs a = 0)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    72
| "Ifm bs (NEq a) = (Inum bs a \<noteq> 0)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    73
| "Ifm bs (NOT p) = (\<not> (Ifm bs p))"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    74
| "Ifm bs (And p q) = (Ifm bs p \<and> Ifm bs q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    75
| "Ifm bs (Or p q) = (Ifm bs p \<or> Ifm bs q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    76
| "Ifm bs (Imp p q) = ((Ifm bs p) \<longrightarrow> (Ifm bs q))"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
    77
| "Ifm bs (Iff p q) = (Ifm bs p = Ifm bs q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    78
| "Ifm bs (E p) = (\<exists>x. Ifm (x#bs) p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    79
| "Ifm bs (A p) = (\<forall>x. Ifm (x#bs) p)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    80
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    81
lemma IfmLeSub: "\<lbrakk> Inum bs s = s' ; Inum bs t = t' \<rbrakk> \<Longrightarrow> Ifm bs (Le (Sub s t)) = (s' \<le> t')"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    82
  by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    83
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    84
lemma IfmLtSub: "\<lbrakk> Inum bs s = s' ; Inum bs t = t' \<rbrakk> \<Longrightarrow> Ifm bs (Lt (Sub s t)) = (s' < t')"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    85
  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    86
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    87
lemma IfmEqSub: "\<lbrakk> Inum bs s = s' ; Inum bs t = t' \<rbrakk> \<Longrightarrow> Ifm bs (Eq (Sub s t)) = (s' = t')"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    88
  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    89
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    90
lemma IfmNOT: " (Ifm bs p = P) \<Longrightarrow> (Ifm bs (NOT p) = (\<not>P))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    91
  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    92
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    93
lemma IfmAnd: " \<lbrakk> Ifm bs p = P ; Ifm bs q = Q\<rbrakk> \<Longrightarrow> (Ifm bs (And p q) = (P \<and> Q))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    94
  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    95
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    96
lemma IfmOr: " \<lbrakk> Ifm bs p = P ; Ifm bs q = Q\<rbrakk> \<Longrightarrow> (Ifm bs (Or p q) = (P \<or> Q))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    97
  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
    98
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
    99
lemma IfmImp: " \<lbrakk> Ifm bs p = P ; Ifm bs q = Q\<rbrakk> \<Longrightarrow> (Ifm bs (Imp p q) = (P \<longrightarrow> Q))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   100
  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   101
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   102
lemma IfmIff: " \<lbrakk> Ifm bs p = P ; Ifm bs q = Q\<rbrakk> \<Longrightarrow> (Ifm bs (Iff p q) = (P = Q))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   103
  by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   104
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   105
lemma IfmE: " (!! x. Ifm (x#bs) p = P x) \<Longrightarrow> (Ifm bs (E p) = (\<exists>x. P x))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   106
  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   107
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   108
lemma IfmA: " (!! x. Ifm (x#bs) p = P x) \<Longrightarrow> (Ifm bs (A p) = (\<forall>x. P x))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   109
  by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   110
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   111
fun not:: "fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   112
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   113
  "not (NOT p) = p"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   114
| "not T = F"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   115
| "not F = T"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   116
| "not p = NOT p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   117
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   118
lemma not[simp]: "Ifm bs (not p) = Ifm bs (NOT p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   119
  by (cases p) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   120
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   121
definition conj :: "fm \<Rightarrow> fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   122
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   123
  "conj p q =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   124
   (if p = F \<or> q = F then F
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   125
    else if p = T then q
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   126
    else if q = T then p
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   127
    else if p = q then p else And p q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   128
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   129
lemma conj[simp]: "Ifm bs (conj p q) = Ifm bs (And p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   130
  by (cases "p = F \<or> q = F", simp_all add: conj_def) (cases p, simp_all)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   131
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   132
definition disj :: "fm \<Rightarrow> fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   133
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   134
  "disj p q =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   135
   (if p = T \<or> q = T then T
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   136
    else if p = F then q
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   137
    else if q = F then p
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   138
    else if p = q then p else Or p q)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   139
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   140
lemma disj[simp]: "Ifm bs (disj p q) = Ifm bs (Or p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   141
  by (cases "p = T \<or> q = T", simp_all add: disj_def) (cases p, simp_all)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   142
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   143
definition imp :: "fm \<Rightarrow> fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   144
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   145
  "imp p q =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   146
   (if p = F \<or> q = T \<or> p = q then T
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   147
    else if p = T then q
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   148
    else if q = F then not p
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   149
    else Imp p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   150
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   151
lemma imp[simp]: "Ifm bs (imp p q) = Ifm bs (Imp p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   152
  by (cases "p = F \<or> q = T") (simp_all add: imp_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   153
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   154
definition iff :: "fm \<Rightarrow> fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   155
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   156
  "iff p q =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   157
   (if p = q then T
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   158
    else if p = NOT q \<or> NOT p = q then F
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   159
    else if p = F then not q
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   160
    else if q = F then not p
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   161
    else if p = T then q
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   162
    else if q = T then p
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   163
    else Iff p q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   164
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   165
lemma iff[simp]: "Ifm bs (iff p q) = Ifm bs (Iff p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   166
  by (unfold iff_def, cases "p = q", simp, cases "p = NOT q", simp) (cases "NOT p = q", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   167
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   168
lemma conj_simps:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   169
  "conj F Q = F"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   170
  "conj P F = F"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   171
  "conj T Q = Q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   172
  "conj P T = P"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   173
  "conj P P = P"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   174
  "P \<noteq> T \<Longrightarrow> P \<noteq> F \<Longrightarrow> Q \<noteq> T \<Longrightarrow> Q \<noteq> F \<Longrightarrow> P \<noteq> Q \<Longrightarrow> conj P Q = And P Q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   175
  by (simp_all add: conj_def)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   176
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   177
lemma disj_simps:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   178
  "disj T Q = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   179
  "disj P T = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   180
  "disj F Q = Q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   181
  "disj P F = P"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   182
  "disj P P = P"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   183
  "P \<noteq> T \<Longrightarrow> P \<noteq> F \<Longrightarrow> Q \<noteq> T \<Longrightarrow> Q \<noteq> F \<Longrightarrow> P \<noteq> Q \<Longrightarrow> disj P Q = Or P Q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   184
  by (simp_all add: disj_def)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   185
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   186
lemma imp_simps:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   187
  "imp F Q = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   188
  "imp P T = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   189
  "imp T Q = Q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   190
  "imp P F = not P"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   191
  "imp P P = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   192
  "P \<noteq> T \<Longrightarrow> P \<noteq> F \<Longrightarrow> P \<noteq> Q \<Longrightarrow> Q \<noteq> T \<Longrightarrow> Q \<noteq> F \<Longrightarrow> imp P Q = Imp P Q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   193
  by (simp_all add: imp_def)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   194
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   195
lemma trivNOT: "p \<noteq> NOT p" "NOT p \<noteq> p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   196
  by (induct p) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   197
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   198
lemma iff_simps:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   199
  "iff p p = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   200
  "iff p (NOT p) = F"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   201
  "iff (NOT p) p = F"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   202
  "iff p F = not p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   203
  "iff F p = not p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   204
  "p \<noteq> NOT T \<Longrightarrow> iff T p = p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   205
  "p\<noteq> NOT T \<Longrightarrow> iff p T = p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   206
  "p\<noteq>q \<Longrightarrow> p\<noteq> NOT q \<Longrightarrow> q\<noteq> NOT p \<Longrightarrow> p\<noteq> F \<Longrightarrow> q\<noteq> F \<Longrightarrow> p \<noteq> T \<Longrightarrow> q \<noteq> T \<Longrightarrow> iff p q = Iff p q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   207
  using trivNOT
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   208
  by (simp_all add: iff_def, cases p, auto)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   209
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   210
  (* Quantifier freeness *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   211
fun qfree:: "fm \<Rightarrow> bool"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   212
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   213
  "qfree (E p) = False"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   214
| "qfree (A p) = False"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   215
| "qfree (NOT p) = qfree p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   216
| "qfree (And p q) = (qfree p \<and> qfree q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   217
| "qfree (Or  p q) = (qfree p \<and> qfree q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   218
| "qfree (Imp p q) = (qfree p \<and> qfree q)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   219
| "qfree (Iff p q) = (qfree p \<and> qfree q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   220
| "qfree p = True"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   221
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   222
  (* Boundedness and substitution *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   223
primrec numbound0:: "num \<Rightarrow> bool" (* a num is INDEPENDENT of Bound 0 *)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   224
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   225
  "numbound0 (C c) = True"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   226
| "numbound0 (Bound n) = (n > 0)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   227
| "numbound0 (CN n c a) = (n \<noteq> 0 \<and> numbound0 a)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   228
| "numbound0 (Neg a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   229
| "numbound0 (Add a b) = (numbound0 a \<and> numbound0 b)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   230
| "numbound0 (Sub a b) = (numbound0 a \<and> numbound0 b)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   231
| "numbound0 (Mul i a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   232
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   233
lemma numbound0_I:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   234
  assumes nb: "numbound0 a"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   235
  shows "Inum (b#bs) a = Inum (b'#bs) a"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   236
  using nb by (induct a) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   237
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   238
primrec bound0:: "fm \<Rightarrow> bool" (* A Formula is independent of Bound 0 *)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   239
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   240
  "bound0 T = True"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   241
| "bound0 F = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   242
| "bound0 (Lt a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   243
| "bound0 (Le a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   244
| "bound0 (Gt a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   245
| "bound0 (Ge a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   246
| "bound0 (Eq a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   247
| "bound0 (NEq a) = numbound0 a"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   248
| "bound0 (NOT p) = bound0 p"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   249
| "bound0 (And p q) = (bound0 p \<and> bound0 q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   250
| "bound0 (Or p q) = (bound0 p \<and> bound0 q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   251
| "bound0 (Imp p q) = ((bound0 p) \<and> (bound0 q))"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   252
| "bound0 (Iff p q) = (bound0 p \<and> bound0 q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   253
| "bound0 (E p) = False"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   254
| "bound0 (A p) = False"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   255
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   256
lemma bound0_I:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   257
  assumes bp: "bound0 p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   258
  shows "Ifm (b#bs) p = Ifm (b'#bs) p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   259
  using bp numbound0_I[where b="b" and bs="bs" and b'="b'"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   260
  by (induct p) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   261
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   262
lemma not_qf[simp]: "qfree p \<Longrightarrow> qfree (not p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   263
  by (cases p) auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   264
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   265
lemma not_bn[simp]: "bound0 p \<Longrightarrow> bound0 (not p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   266
  by (cases p) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   267
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   268
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   269
lemma conj_qf[simp]: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (conj p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   270
  using conj_def by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   271
lemma conj_nb[simp]: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (conj p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   272
  using conj_def by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   273
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   274
lemma disj_qf[simp]: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (disj p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   275
  using disj_def by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   276
lemma disj_nb[simp]: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (disj p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   277
  using disj_def by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   278
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   279
lemma imp_qf[simp]: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (imp p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   280
  using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   281
lemma imp_nb[simp]: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (imp p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   282
  using imp_def by (cases "p=F \<or> q=T \<or> p=q",simp_all add: imp_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   283
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   284
lemma iff_qf[simp]: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (iff p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   285
  unfolding iff_def by (cases "p = q") auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   286
lemma iff_nb[simp]: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (iff p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   287
  using iff_def unfolding iff_def by (cases "p = q") auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   288
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   289
fun decrnum:: "num \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   290
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   291
  "decrnum (Bound n) = Bound (n - 1)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   292
| "decrnum (Neg a) = Neg (decrnum a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   293
| "decrnum (Add a b) = Add (decrnum a) (decrnum b)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   294
| "decrnum (Sub a b) = Sub (decrnum a) (decrnum b)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   295
| "decrnum (Mul c a) = Mul c (decrnum a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   296
| "decrnum (CN n c a) = CN (n - 1) c (decrnum a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   297
| "decrnum a = a"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   298
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   299
fun decr :: "fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   300
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   301
  "decr (Lt a) = Lt (decrnum a)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   302
| "decr (Le a) = Le (decrnum a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   303
| "decr (Gt a) = Gt (decrnum a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   304
| "decr (Ge a) = Ge (decrnum a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   305
| "decr (Eq a) = Eq (decrnum a)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   306
| "decr (NEq a) = NEq (decrnum a)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   307
| "decr (NOT p) = NOT (decr p)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   308
| "decr (And p q) = conj (decr p) (decr q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   309
| "decr (Or p q) = disj (decr p) (decr q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   310
| "decr (Imp p q) = imp (decr p) (decr q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   311
| "decr (Iff p q) = iff (decr p) (decr q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   312
| "decr p = p"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   313
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   314
lemma decrnum:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   315
  assumes nb: "numbound0 t"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   316
  shows "Inum (x # bs) t = Inum bs (decrnum t)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   317
  using nb by (induct t rule: decrnum.induct) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   318
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   319
lemma decr:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   320
  assumes nb: "bound0 p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   321
  shows "Ifm (x # bs) p = Ifm bs (decr p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   322
  using nb by (induct p rule: decr.induct) (simp_all add: decrnum)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   323
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   324
lemma decr_qf: "bound0 p \<Longrightarrow> qfree (decr p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   325
  by (induct p) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   326
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   327
fun isatom :: "fm \<Rightarrow> bool" (* test for atomicity *)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   328
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   329
  "isatom T = True"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   330
| "isatom F = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   331
| "isatom (Lt a) = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   332
| "isatom (Le a) = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   333
| "isatom (Gt a) = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   334
| "isatom (Ge a) = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   335
| "isatom (Eq a) = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   336
| "isatom (NEq a) = True"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   337
| "isatom p = False"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   338
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   339
lemma bound0_qf: "bound0 p \<Longrightarrow> qfree p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   340
  by (induct p) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   341
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   342
definition djf :: "('a \<Rightarrow> fm) \<Rightarrow> 'a \<Rightarrow> fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   343
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   344
  "djf f p q =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   345
   (if q = T then T
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   346
    else if q = F then f p
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   347
    else (let fp = f p in case fp of T \<Rightarrow> T | F \<Rightarrow> q | _ \<Rightarrow> Or (f p) q))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   348
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   349
definition evaldjf :: "('a \<Rightarrow> fm) \<Rightarrow> 'a list \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   350
  where "evaldjf f ps = foldr (djf f) ps F"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   351
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   352
lemma djf_Or: "Ifm bs (djf f p q) = Ifm bs (Or (f p) q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   353
  by (cases "q = T", simp add: djf_def, cases "q = F", simp add: djf_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   354
    (cases "f p", simp_all add: Let_def djf_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   355
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   356
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   357
lemma djf_simps:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   358
  "djf f p T = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   359
  "djf f p F = f p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   360
  "q \<noteq> T \<Longrightarrow> q \<noteq> F \<Longrightarrow> djf f p q = (let fp = f p in case fp of T \<Rightarrow> T | F \<Rightarrow> q | _ \<Rightarrow> Or (f p) q)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   361
  by (simp_all add: djf_def)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   362
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   363
lemma evaldjf_ex: "Ifm bs (evaldjf f ps) \<longleftrightarrow> (\<exists>p \<in> set ps. Ifm bs (f p))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   364
  by (induct ps) (simp_all add: evaldjf_def djf_Or)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   365
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   366
lemma evaldjf_bound0:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   367
  assumes nb: "\<forall>x\<in> set xs. bound0 (f x)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   368
  shows "bound0 (evaldjf f xs)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   369
  using nb by (induct xs, auto simp add: evaldjf_def djf_def Let_def) (case_tac "f a", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   370
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   371
lemma evaldjf_qf:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   372
  assumes nb: "\<forall>x\<in> set xs. qfree (f x)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   373
  shows "qfree (evaldjf f xs)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   374
  using nb by (induct xs, auto simp add: evaldjf_def djf_def Let_def) (case_tac "f a", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   375
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   376
fun disjuncts :: "fm \<Rightarrow> fm list"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   377
where
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   378
  "disjuncts (Or p q) = disjuncts p @ disjuncts q"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   379
| "disjuncts F = []"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   380
| "disjuncts p = [p]"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   381
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   382
lemma disjuncts: "(\<exists>q\<in> set (disjuncts p). Ifm bs q) = Ifm bs p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   383
  by (induct p rule: disjuncts.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   384
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   385
lemma disjuncts_nb: "bound0 p \<Longrightarrow> \<forall>q\<in> set (disjuncts p). bound0 q"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   386
proof -
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   387
  assume nb: "bound0 p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   388
  then have "list_all bound0 (disjuncts p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   389
    by (induct p rule: disjuncts.induct) auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   390
  then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   391
    by (simp only: list_all_iff)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   392
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   393
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   394
lemma disjuncts_qf: "qfree p \<Longrightarrow> \<forall>q\<in> set (disjuncts p). qfree q"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   395
proof -
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   396
  assume qf: "qfree p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   397
  then have "list_all qfree (disjuncts p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   398
    by (induct p rule: disjuncts.induct) auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   399
  then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   400
    by (simp only: list_all_iff)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   401
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   402
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   403
definition DJ :: "(fm \<Rightarrow> fm) \<Rightarrow> fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   404
  where "DJ f p = evaldjf f (disjuncts p)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   405
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   406
lemma DJ:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   407
  assumes fdj: "\<forall>p q. Ifm bs (f (Or p q)) = Ifm bs (Or (f p) (f q))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   408
    and fF: "f F = F"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   409
  shows "Ifm bs (DJ f p) = Ifm bs (f p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   410
proof -
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   411
  have "Ifm bs (DJ f p) = (\<exists>q \<in> set (disjuncts p). Ifm bs (f q))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   412
    by (simp add: DJ_def evaldjf_ex)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   413
  also have "\<dots> = Ifm bs (f p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   414
    using fdj fF by (induct p rule: disjuncts.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   415
  finally show ?thesis .
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   416
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   417
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   418
lemma DJ_qf:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   419
  assumes fqf: "\<forall>p. qfree p \<longrightarrow> qfree (f p)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   420
  shows "\<forall>p. qfree p \<longrightarrow> qfree (DJ f p) "
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   421
proof clarify
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   422
  fix p
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   423
  assume qf: "qfree p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   424
  have th: "DJ f p = evaldjf f (disjuncts p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   425
    by (simp add: DJ_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   426
  from disjuncts_qf[OF qf] have "\<forall>q\<in> set (disjuncts p). qfree q" .
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   427
  with fqf have th':"\<forall>q\<in> set (disjuncts p). qfree (f q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   428
    by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   429
  from evaldjf_qf[OF th'] th show "qfree (DJ f p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   430
    by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   431
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   432
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   433
lemma DJ_qe:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   434
  assumes qe: "\<forall>bs p. qfree p \<longrightarrow> qfree (qe p) \<and> (Ifm bs (qe p) = Ifm bs (E p))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   435
  shows "\<forall>bs p. qfree p \<longrightarrow> qfree (DJ qe p) \<and> (Ifm bs ((DJ qe p)) = Ifm bs (E p))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   436
proof clarify
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   437
  fix p :: fm
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   438
  fix bs
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   439
  assume qf: "qfree p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   440
  from qe have qth: "\<forall>p. qfree p \<longrightarrow> qfree (qe p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   441
    by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   442
  from DJ_qf[OF qth] qf have qfth: "qfree (DJ qe p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   443
    by auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   444
  have "Ifm bs (DJ qe p) \<longleftrightarrow> (\<exists>q\<in> set (disjuncts p). Ifm bs (qe q))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   445
    by (simp add: DJ_def evaldjf_ex)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   446
  also have "\<dots> \<longleftrightarrow> (\<exists>q \<in> set(disjuncts p). Ifm bs (E q))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   447
    using qe disjuncts_qf[OF qf] by auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   448
  also have "\<dots> = Ifm bs (E p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   449
    by (induct p rule: disjuncts.induct) auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   450
  finally show "qfree (DJ qe p) \<and> Ifm bs (DJ qe p) = Ifm bs (E p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   451
    using qfth by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   452
qed
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   453
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   454
  (* Simplification *)
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   455
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   456
fun maxcoeff:: "num \<Rightarrow> int"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   457
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   458
  "maxcoeff (C i) = abs i"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   459
| "maxcoeff (CN n c t) = max (abs c) (maxcoeff t)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   460
| "maxcoeff t = 1"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   461
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   462
lemma maxcoeff_pos: "maxcoeff t \<ge> 0"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   463
  by (induct t rule: maxcoeff.induct, auto)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   464
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   465
fun numgcdh:: "num \<Rightarrow> int \<Rightarrow> int"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   466
where
31706
1db0c8f235fb new GCD library, courtesy of Jeremy Avigad
huffman
parents: 30684
diff changeset
   467
  "numgcdh (C i) = (\<lambda>g. gcd i g)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   468
| "numgcdh (CN n c t) = (\<lambda>g. gcd c (numgcdh t g))"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   469
| "numgcdh t = (\<lambda>g. 1)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   470
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   471
definition numgcd :: "num \<Rightarrow> int"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   472
  where "numgcd t = numgcdh t (maxcoeff t)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   473
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   474
fun reducecoeffh:: "num \<Rightarrow> int \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   475
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   476
  "reducecoeffh (C i) = (\<lambda>g. C (i div g))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   477
| "reducecoeffh (CN n c t) = (\<lambda>g. CN n (c div g) (reducecoeffh t g))"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   478
| "reducecoeffh t = (\<lambda>g. t)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   479
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   480
definition reducecoeff :: "num \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   481
where
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   482
  "reducecoeff t =
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   483
   (let g = numgcd t
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   484
    in if g = 0 then C 0 else if g = 1 then t else reducecoeffh t g)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   485
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   486
fun dvdnumcoeff:: "num \<Rightarrow> int \<Rightarrow> bool"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   487
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   488
  "dvdnumcoeff (C i) = (\<lambda>g. g dvd i)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   489
| "dvdnumcoeff (CN n c t) = (\<lambda>g. g dvd c \<and> dvdnumcoeff t g)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   490
| "dvdnumcoeff t = (\<lambda>g. False)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   491
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   492
lemma dvdnumcoeff_trans:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   493
  assumes gdg: "g dvd g'"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   494
    and dgt':"dvdnumcoeff t g'"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   495
  shows "dvdnumcoeff t g"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   496
  using dgt' gdg
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   497
  by (induct t rule: dvdnumcoeff.induct) (simp_all add: gdg dvd_trans[OF gdg])
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   498
30042
31039ee583fa Removed subsumed lemmas
nipkow
parents: 29823
diff changeset
   499
declare dvd_trans [trans add]
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   500
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   501
lemma natabs0: "nat (abs x) = 0 \<longleftrightarrow> x = 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   502
  by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   503
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   504
lemma numgcd0:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   505
  assumes g0: "numgcd t = 0"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   506
  shows "Inum bs t = 0"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   507
  using g0[simplified numgcd_def]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   508
  by (induct t rule: numgcdh.induct) (auto simp add: natabs0 maxcoeff_pos max.absorb2)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   509
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   510
lemma numgcdh_pos:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   511
  assumes gp: "g \<ge> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   512
  shows "numgcdh t g \<ge> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   513
  using gp by (induct t rule: numgcdh.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   514
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   515
lemma numgcd_pos: "numgcd t \<ge>0"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   516
  by (simp add: numgcd_def numgcdh_pos maxcoeff_pos)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   517
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   518
lemma reducecoeffh:
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   519
  assumes gt: "dvdnumcoeff t g"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   520
    and gp: "g > 0"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   521
  shows "real g *(Inum bs (reducecoeffh t g)) = Inum bs t"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   522
  using gt
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   523
proof (induct t rule: reducecoeffh.induct)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   524
  case (1 i)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   525
  then have gd: "g dvd i"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   526
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   527
  with assms show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   528
    by (simp add: real_of_int_div[OF gd])
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   529
next
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   530
  case (2 n c t)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   531
  then have gd: "g dvd c"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   532
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   533
  from assms 2 show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   534
    by (simp add: real_of_int_div[OF gd] algebra_simps)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   535
qed (auto simp add: numgcd_def gp)
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   536
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   537
fun ismaxcoeff:: "num \<Rightarrow> int \<Rightarrow> bool"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   538
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   539
  "ismaxcoeff (C i) = (\<lambda>x. abs i \<le> x)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   540
| "ismaxcoeff (CN n c t) = (\<lambda>x. abs c \<le> x \<and> ismaxcoeff t x)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   541
| "ismaxcoeff t = (\<lambda>x. True)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   542
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   543
lemma ismaxcoeff_mono: "ismaxcoeff t c \<Longrightarrow> c \<le> c' \<Longrightarrow> ismaxcoeff t c'"
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   544
  by (induct t rule: ismaxcoeff.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   545
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   546
lemma maxcoeff_ismaxcoeff: "ismaxcoeff t (maxcoeff t)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   547
proof (induct t rule: maxcoeff.induct)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   548
  case (2 n c t)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   549
  then have H:"ismaxcoeff t (maxcoeff t)" .
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   550
  have thh: "maxcoeff t \<le> max (abs c) (maxcoeff t)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   551
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   552
  from ismaxcoeff_mono[OF H thh] show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   553
    by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   554
qed simp_all
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   555
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   556
lemma zgcd_gt1: "gcd i j > (1::int) \<Longrightarrow>
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   557
  abs i > 1 \<and> abs j > 1 \<or> abs i = 0 \<and> abs j > 1 \<or> abs i > 1 \<and> abs j = 0"
31706
1db0c8f235fb new GCD library, courtesy of Jeremy Avigad
huffman
parents: 30684
diff changeset
   558
  apply (cases "abs i = 0", simp_all add: gcd_int_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   559
  apply (cases "abs j = 0", simp_all)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   560
  apply (cases "abs i = 1", simp_all)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   561
  apply (cases "abs j = 1", simp_all)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   562
  apply auto
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   563
  done
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   564
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   565
lemma numgcdh0:"numgcdh t m = 0 \<Longrightarrow>  m =0"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   566
  by (induct t rule: numgcdh.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   567
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   568
lemma dvdnumcoeff_aux:
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   569
  assumes "ismaxcoeff t m"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   570
    and mp: "m \<ge> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   571
    and "numgcdh t m > 1"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   572
  shows "dvdnumcoeff t (numgcdh t m)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   573
  using assms
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   574
proof (induct t rule: numgcdh.induct)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   575
  case (2 n c t)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   576
  let ?g = "numgcdh t m"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   577
  from 2 have th: "gcd c ?g > 1"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   578
    by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   579
  from zgcd_gt1[OF th] numgcdh_pos[OF mp, where t="t"]
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   580
  consider "abs c > 1" "?g > 1" | "abs c = 0" "?g > 1" | "?g = 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   581
    by auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   582
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   583
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   584
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   585
    with 2 have th: "dvdnumcoeff t ?g"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   586
      by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   587
    have th': "gcd c ?g dvd ?g"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   588
      by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   589
    from dvdnumcoeff_trans[OF th' th] show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   590
      by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   591
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   592
    case "2'": 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   593
    with 2 have th: "dvdnumcoeff t ?g"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   594
      by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   595
    have th': "gcd c ?g dvd ?g"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   596
      by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   597
    from dvdnumcoeff_trans[OF th' th] show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   598
      by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   599
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   600
    case 3
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   601
    then have "m = 0" by (rule numgcdh0)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   602
    with 2 3 show ?thesis by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   603
  qed
31706
1db0c8f235fb new GCD library, courtesy of Jeremy Avigad
huffman
parents: 30684
diff changeset
   604
qed auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   605
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   606
lemma dvdnumcoeff_aux2:
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   607
  assumes "numgcd t > 1"
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   608
  shows "dvdnumcoeff t (numgcd t) \<and> numgcd t > 0"
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   609
  using assms
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   610
proof (simp add: numgcd_def)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   611
  let ?mc = "maxcoeff t"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   612
  let ?g = "numgcdh t ?mc"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   613
  have th1: "ismaxcoeff t ?mc"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   614
    by (rule maxcoeff_ismaxcoeff)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   615
  have th2: "?mc \<ge> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   616
    by (rule maxcoeff_pos)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   617
  assume H: "numgcdh t ?mc > 1"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   618
  from dvdnumcoeff_aux[OF th1 th2 H] show "dvdnumcoeff t ?g" .
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   619
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   620
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   621
lemma reducecoeff: "real (numgcd t) * (Inum bs (reducecoeff t)) = Inum bs t"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   622
proof -
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   623
  let ?g = "numgcd t"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   624
  have "?g \<ge> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   625
    by (simp add: numgcd_pos)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   626
  then consider "?g = 0" | "?g = 1" | "?g > 1" by atomize_elim auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   627
  then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   628
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   629
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   630
    then show ?thesis by (simp add: numgcd0)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   631
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   632
    case 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   633
    then show ?thesis by (simp add: reducecoeff_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   634
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   635
    case g1: 3
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   636
    from dvdnumcoeff_aux2[OF g1] have th1: "dvdnumcoeff t ?g" and g0: "?g > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   637
      by blast+
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   638
    from reducecoeffh[OF th1 g0, where bs="bs"] g1 show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   639
      by (simp add: reducecoeff_def Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   640
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   641
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   642
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   643
lemma reducecoeffh_numbound0: "numbound0 t \<Longrightarrow> numbound0 (reducecoeffh t g)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   644
  by (induct t rule: reducecoeffh.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   645
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   646
lemma reducecoeff_numbound0: "numbound0 t \<Longrightarrow> numbound0 (reducecoeff t)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   647
  using reducecoeffh_numbound0 by (simp add: reducecoeff_def Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   648
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   649
consts numadd:: "num \<times> num \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   650
recdef numadd "measure (\<lambda>(t,s). size t + size s)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   651
  "numadd (CN n1 c1 r1,CN n2 c2 r2) =
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   652
   (if n1 = n2 then
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   653
    (let c = c1 + c2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   654
     in (if c = 0 then numadd(r1,r2) else CN n1 c (numadd (r1, r2))))
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   655
    else if n1 \<le> n2 then (CN n1 c1 (numadd (r1,CN n2 c2 r2)))
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   656
    else (CN n2 c2 (numadd (CN n1 c1 r1, r2))))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   657
  "numadd (CN n1 c1 r1,t) = CN n1 c1 (numadd (r1, t))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   658
  "numadd (t,CN n2 c2 r2) = CN n2 c2 (numadd (t, r2))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   659
  "numadd (C b1, C b2) = C (b1 + b2)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   660
  "numadd (a,b) = Add a b"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   661
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   662
lemma numadd[simp]: "Inum bs (numadd (t,s)) = Inum bs (Add t s)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   663
  apply (induct t s rule: numadd.induct)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   664
  apply (simp_all add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   665
  apply (case_tac "c1 + c2 = 0")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   666
  apply (case_tac "n1 \<le> n2")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   667
  apply simp_all
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   668
  apply (case_tac "n1 = n2")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   669
  apply (simp_all add: algebra_simps)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   670
  apply (simp only: distrib_right[symmetric])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   671
  apply simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   672
  done
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   673
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   674
lemma numadd_nb[simp]: "\<lbrakk> numbound0 t ; numbound0 s\<rbrakk> \<Longrightarrow> numbound0 (numadd (t,s))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   675
  by (induct t s rule: numadd.induct) (auto simp add: Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   676
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   677
fun nummul:: "num \<Rightarrow> int \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   678
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   679
  "nummul (C j) = (\<lambda>i. C (i * j))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   680
| "nummul (CN n c a) = (\<lambda>i. CN n (i * c) (nummul a i))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   681
| "nummul t = (\<lambda>i. Mul i t)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   682
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   683
lemma nummul[simp]: "\<And>i. Inum bs (nummul t i) = Inum bs (Mul i t)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   684
  by (induct t rule: nummul.induct) (auto simp add: algebra_simps)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   685
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   686
lemma nummul_nb[simp]: "\<And>i. numbound0 t \<Longrightarrow> numbound0 (nummul t i)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   687
  by (induct t rule: nummul.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   688
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   689
definition numneg :: "num \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   690
  where "numneg t = nummul t (- 1)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   691
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   692
definition numsub :: "num \<Rightarrow> num \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   693
  where "numsub s t = (if s = t then C 0 else numadd (s, numneg t))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   694
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   695
lemma numneg[simp]: "Inum bs (numneg t) = Inum bs (Neg t)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   696
  using numneg_def by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   697
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   698
lemma numneg_nb[simp]: "numbound0 t \<Longrightarrow> numbound0 (numneg t)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   699
  using numneg_def by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   700
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   701
lemma numsub[simp]: "Inum bs (numsub a b) = Inum bs (Sub a b)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   702
  using numsub_def by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   703
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   704
lemma numsub_nb[simp]: "\<lbrakk> numbound0 t ; numbound0 s\<rbrakk> \<Longrightarrow> numbound0 (numsub t s)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   705
  using numsub_def by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   706
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   707
primrec simpnum:: "num \<Rightarrow> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   708
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   709
  "simpnum (C j) = C j"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   710
| "simpnum (Bound n) = CN n 1 (C 0)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   711
| "simpnum (Neg t) = numneg (simpnum t)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   712
| "simpnum (Add t s) = numadd (simpnum t,simpnum s)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   713
| "simpnum (Sub t s) = numsub (simpnum t) (simpnum s)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   714
| "simpnum (Mul i t) = (if i = 0 then C 0 else nummul (simpnum t) i)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   715
| "simpnum (CN n c t) = (if c = 0 then simpnum t else numadd (CN n c (C 0), simpnum t))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   716
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   717
lemma simpnum_ci[simp]: "Inum bs (simpnum t) = Inum bs t"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   718
  by (induct t) simp_all
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   719
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   720
lemma simpnum_numbound0[simp]: "numbound0 t \<Longrightarrow> numbound0 (simpnum t)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   721
  by (induct t) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   722
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   723
fun nozerocoeff:: "num \<Rightarrow> bool"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   724
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   725
  "nozerocoeff (C c) = True"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   726
| "nozerocoeff (CN n c t) = (c \<noteq> 0 \<and> nozerocoeff t)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   727
| "nozerocoeff t = True"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   728
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   729
lemma numadd_nz : "nozerocoeff a \<Longrightarrow> nozerocoeff b \<Longrightarrow> nozerocoeff (numadd (a,b))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   730
  by (induct a b rule: numadd.induct) (auto simp add: Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   731
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   732
lemma nummul_nz : "\<And>i. i\<noteq>0 \<Longrightarrow> nozerocoeff a \<Longrightarrow> nozerocoeff (nummul a i)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   733
  by (induct a rule: nummul.induct) (auto simp add: Let_def numadd_nz)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   734
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   735
lemma numneg_nz : "nozerocoeff a \<Longrightarrow> nozerocoeff (numneg a)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   736
  by (simp add: numneg_def nummul_nz)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   737
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   738
lemma numsub_nz: "nozerocoeff a \<Longrightarrow> nozerocoeff b \<Longrightarrow> nozerocoeff (numsub a b)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   739
  by (simp add: numsub_def numneg_nz numadd_nz)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   740
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   741
lemma simpnum_nz: "nozerocoeff (simpnum t)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   742
  by (induct t) (simp_all add: numadd_nz numneg_nz numsub_nz nummul_nz)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   743
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   744
lemma maxcoeff_nz: "nozerocoeff t \<Longrightarrow> maxcoeff t = 0 \<Longrightarrow> t = C 0"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   745
proof (induct t rule: maxcoeff.induct)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   746
  case (2 n c t)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   747
  then have cnz: "c \<noteq> 0" and mx: "max (abs c) (maxcoeff t) = 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   748
    by simp_all
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   749
  have "max (abs c) (maxcoeff t) \<ge> abs c"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   750
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   751
  with cnz have "max (abs c) (maxcoeff t) > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   752
    by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   753
  with 2 show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   754
    by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   755
qed auto
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   756
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   757
lemma numgcd_nz:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   758
  assumes nz: "nozerocoeff t"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   759
    and g0: "numgcd t = 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   760
  shows "t = C 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   761
proof -
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   762
  from g0 have th:"numgcdh t (maxcoeff t) = 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   763
    by (simp add: numgcd_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   764
  from numgcdh0[OF th] have th:"maxcoeff t = 0" .
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   765
  from maxcoeff_nz[OF nz th] show ?thesis .
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   766
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   767
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   768
definition simp_num_pair :: "(num \<times> int) \<Rightarrow> num \<times> int"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   769
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   770
  "simp_num_pair =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   771
    (\<lambda>(t,n).
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   772
     (if n = 0 then (C 0, 0)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   773
      else
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   774
       (let t' = simpnum t ; g = numgcd t' in
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   775
         if g > 1 then
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   776
          (let g' = gcd n g
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   777
           in if g' = 1 then (t', n) else (reducecoeffh t' g', n div g'))
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   778
         else (t', n))))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   779
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   780
lemma simp_num_pair_ci:
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   781
  shows "((\<lambda>(t,n). Inum bs t / real n) (simp_num_pair (t,n))) =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   782
    ((\<lambda>(t,n). Inum bs t / real n) (t, n))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   783
  (is "?lhs = ?rhs")
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   784
proof -
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   785
  let ?t' = "simpnum t"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   786
  let ?g = "numgcd ?t'"
31706
1db0c8f235fb new GCD library, courtesy of Jeremy Avigad
huffman
parents: 30684
diff changeset
   787
  let ?g' = "gcd n ?g"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   788
  show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   789
  proof (cases "n = 0")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   790
    case True
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   791
    then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   792
      by (simp add: Let_def simp_num_pair_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   793
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   794
    case nnz: False
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   795
    show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   796
    proof (cases "?g > 1")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   797
      case False
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   798
      then show ?thesis by (simp add: Let_def simp_num_pair_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   799
    next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   800
      case g1: True
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   801
      then have g0: "?g > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   802
        by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   803
      from g1 nnz have gp0: "?g' \<noteq> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   804
        by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   805
      then have g'p: "?g' > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   806
        using gcd_ge_0_int[where x="n" and y="numgcd ?t'"] by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   807
      then consider "?g' = 1" | "?g' > 1" by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   808
      then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   809
      proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   810
        case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   811
        then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   812
          by (simp add: Let_def simp_num_pair_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   813
      next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   814
        case g'1: 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   815
        from dvdnumcoeff_aux2[OF g1] have th1: "dvdnumcoeff ?t' ?g" ..
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   816
        let ?tt = "reducecoeffh ?t' ?g'"
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   817
        let ?t = "Inum bs ?tt"
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   818
        have gpdg: "?g' dvd ?g" by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   819
        have gpdd: "?g' dvd n" by simp
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   820
        have gpdgp: "?g' dvd ?g'" by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   821
        from reducecoeffh[OF dvdnumcoeff_trans[OF gpdg th1] g'p]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   822
        have th2:"real ?g' * ?t = Inum bs ?t'"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   823
          by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   824
        from g1 g'1 have "?lhs = ?t / real (n div ?g')"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   825
          by (simp add: simp_num_pair_def Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   826
        also have "\<dots> = (real ?g' * ?t) / (real ?g' * (real (n div ?g')))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   827
          by simp
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   828
        also have "\<dots> = (Inum bs ?t' / real n)"
46670
e9aa6d151329 removing unnecessary assumptions in RealDef;
bulwahn
parents: 45740
diff changeset
   829
          using real_of_int_div[OF gpdd] th2 gp0 by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   830
        finally have "?lhs = Inum bs t / real n"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   831
          by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   832
        then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   833
          by (simp add: simp_num_pair_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   834
      qed
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   835
    qed
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   836
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   837
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   838
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   839
lemma simp_num_pair_l:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   840
  assumes tnb: "numbound0 t"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   841
    and np: "n > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   842
    and tn: "simp_num_pair (t, n) = (t', n')"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   843
  shows "numbound0 t' \<and> n' > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   844
proof -
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   845
  let ?t' = "simpnum t"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   846
  let ?g = "numgcd ?t'"
31706
1db0c8f235fb new GCD library, courtesy of Jeremy Avigad
huffman
parents: 30684
diff changeset
   847
  let ?g' = "gcd n ?g"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   848
  show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   849
  proof (cases "n = 0")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   850
    case True
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   851
    then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   852
      using assms by (simp add: Let_def simp_num_pair_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   853
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   854
    case nnz: False
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   855
    show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   856
    proof (cases "?g > 1")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   857
      case False
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   858
      then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   859
        using assms by (auto simp add: Let_def simp_num_pair_def simpnum_numbound0)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   860
    next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   861
      case g1: True
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   862
      then have g0: "?g > 0" by simp
31706
1db0c8f235fb new GCD library, courtesy of Jeremy Avigad
huffman
parents: 30684
diff changeset
   863
      from g1 nnz have gp0: "?g' \<noteq> 0" by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   864
      then have g'p: "?g' > 0" using gcd_ge_0_int[where x="n" and y="numgcd ?t'"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   865
        by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   866
      then consider "?g'= 1" | "?g' > 1" by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   867
      then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   868
      proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   869
        case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   870
        then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   871
          using assms g1 by (auto simp add: Let_def simp_num_pair_def simpnum_numbound0)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   872
      next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   873
        case g'1: 2
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   874
        have gpdg: "?g' dvd ?g" by simp
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
   875
        have gpdd: "?g' dvd n" by simp
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   876
        have gpdgp: "?g' dvd ?g'" by simp
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
   877
        from zdvd_imp_le[OF gpdd np] have g'n: "?g' \<le> n" .
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   878
        from zdiv_mono1[OF g'n g'p, simplified div_self[OF gp0]] have "n div ?g' > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   879
          by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   880
        then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   881
          using assms g1 g'1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   882
          by (auto simp add: simp_num_pair_def Let_def reducecoeffh_numbound0 simpnum_numbound0)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   883
      qed
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   884
    qed
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   885
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   886
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   887
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   888
fun simpfm :: "fm \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   889
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   890
  "simpfm (And p q) = conj (simpfm p) (simpfm q)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   891
| "simpfm (Or p q) = disj (simpfm p) (simpfm q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   892
| "simpfm (Imp p q) = imp (simpfm p) (simpfm q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   893
| "simpfm (Iff p q) = iff (simpfm p) (simpfm q)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   894
| "simpfm (NOT p) = not (simpfm p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   895
| "simpfm (Lt a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v < 0) then T else F | _ \<Rightarrow> Lt a')"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   896
| "simpfm (Le a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v \<le> 0)  then T else F | _ \<Rightarrow> Le a')"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   897
| "simpfm (Gt a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v > 0)  then T else F | _ \<Rightarrow> Gt a')"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   898
| "simpfm (Ge a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v \<ge> 0)  then T else F | _ \<Rightarrow> Ge a')"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   899
| "simpfm (Eq a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v = 0)  then T else F | _ \<Rightarrow> Eq a')"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   900
| "simpfm (NEq a) = (let a' = simpnum a in case a' of C v \<Rightarrow> if (v \<noteq> 0)  then T else F | _ \<Rightarrow> NEq a')"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
   901
| "simpfm p = p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   902
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   903
lemma simpfm: "Ifm bs (simpfm p) = Ifm bs p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   904
proof (induct p rule: simpfm.induct)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   905
  case (6 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   906
  let ?sa = "simpnum a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   907
  from simpnum_ci have sa: "Inum bs ?sa = Inum bs a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   908
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   909
  consider v where "?sa = C v" | "\<not> (\<exists>v. ?sa = C v)" by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   910
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   911
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   912
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   913
    then show ?thesis using sa by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   914
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   915
    case 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   916
    then show ?thesis using sa by (cases ?sa) (simp_all add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   917
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   918
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   919
  case (7 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   920
  let ?sa = "simpnum a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   921
  from simpnum_ci have sa: "Inum bs ?sa = Inum bs a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   922
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   923
  consider v where "?sa = C v" | "\<not> (\<exists>v. ?sa = C v)" by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   924
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   925
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   926
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   927
    then show ?thesis using sa by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   928
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   929
    case 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   930
    then show ?thesis using sa by (cases ?sa) (simp_all add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   931
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   932
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   933
  case (8 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   934
  let ?sa = "simpnum a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   935
  from simpnum_ci have sa: "Inum bs ?sa = Inum bs a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   936
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   937
  consider v where "?sa = C v" | "\<not> (\<exists>v. ?sa = C v)" by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   938
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   939
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   940
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   941
    then show ?thesis using sa by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   942
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   943
    case 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   944
    then show ?thesis using sa by (cases ?sa) (simp_all add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   945
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   946
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   947
  case (9 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   948
  let ?sa = "simpnum a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   949
  from simpnum_ci have sa: "Inum bs ?sa = Inum bs a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   950
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   951
  consider v where "?sa = C v" | "\<not> (\<exists>v. ?sa = C v)" by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   952
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   953
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   954
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   955
    then show ?thesis using sa by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   956
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   957
    case 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   958
    then show ?thesis using sa by (cases ?sa) (simp_all add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   959
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   960
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   961
  case (10 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   962
  let ?sa = "simpnum a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   963
  from simpnum_ci have sa: "Inum bs ?sa = Inum bs a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   964
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   965
  consider v where "?sa = C v" | "\<not> (\<exists>v. ?sa = C v)" by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   966
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   967
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   968
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   969
    then show ?thesis using sa by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   970
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   971
    case 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   972
    then show ?thesis using sa by (cases ?sa) (simp_all add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   973
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   974
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   975
  case (11 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   976
  let ?sa = "simpnum a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   977
  from simpnum_ci have sa: "Inum bs ?sa = Inum bs a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   978
    by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   979
  consider v where "?sa = C v" | "\<not> (\<exists>v. ?sa = C v)" by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   980
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   981
  proof cases
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   982
    case 1
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   983
    then show ?thesis using sa by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   984
  next
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   985
    case 2
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   986
    then show ?thesis using sa by (cases ?sa) (simp_all add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   987
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   988
qed (induct p rule: simpfm.induct, simp_all add: conj disj imp iff not)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   989
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   990
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   991
lemma simpfm_bound0: "bound0 p \<Longrightarrow> bound0 (simpfm p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   992
proof (induct p rule: simpfm.induct)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   993
  case (6 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   994
  then have nb: "numbound0 a" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   995
  then have "numbound0 (simpnum a)" by (simp only: simpnum_numbound0[OF nb])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   996
  then show ?case by (cases "simpnum a") (auto simp add: Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
   997
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   998
  case (7 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
   999
  then have nb: "numbound0 a" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1000
  then have "numbound0 (simpnum a)" by (simp only: simpnum_numbound0[OF nb])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1001
  then show ?case by (cases "simpnum a") (auto simp add: Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1002
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1003
  case (8 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1004
  then have nb: "numbound0 a" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1005
  then have "numbound0 (simpnum a)" by (simp only: simpnum_numbound0[OF nb])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1006
  then show ?case by (cases "simpnum a") (auto simp add: Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1007
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1008
  case (9 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1009
  then have nb: "numbound0 a" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1010
  then have "numbound0 (simpnum a)" by (simp only: simpnum_numbound0[OF nb])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1011
  then show ?case by (cases "simpnum a") (auto simp add: Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1012
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1013
  case (10 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1014
  then have nb: "numbound0 a" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1015
  then have "numbound0 (simpnum a)" by (simp only: simpnum_numbound0[OF nb])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1016
  then show ?case by (cases "simpnum a") (auto simp add: Let_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1017
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1018
  case (11 a)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1019
  then have nb: "numbound0 a" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1020
  then have "numbound0 (simpnum a)" by (simp only: simpnum_numbound0[OF nb])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1021
  then show ?case by (cases "simpnum a") (auto simp add: Let_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1022
qed (auto simp add: disj_def imp_def iff_def conj_def not_bn)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1023
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1024
lemma simpfm_qf: "qfree p \<Longrightarrow> qfree (simpfm p)"
44779
98d597c4193d tuned proofs;
wenzelm
parents: 44013
diff changeset
  1025
  apply (induct p rule: simpfm.induct)
98d597c4193d tuned proofs;
wenzelm
parents: 44013
diff changeset
  1026
  apply (auto simp add: Let_def)
98d597c4193d tuned proofs;
wenzelm
parents: 44013
diff changeset
  1027
  apply (case_tac "simpnum a", auto)+
98d597c4193d tuned proofs;
wenzelm
parents: 44013
diff changeset
  1028
  done
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1029
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1030
consts prep :: "fm \<Rightarrow> fm"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1031
recdef prep "measure fmsize"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1032
  "prep (E T) = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1033
  "prep (E F) = F"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1034
  "prep (E (Or p q)) = disj (prep (E p)) (prep (E q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1035
  "prep (E (Imp p q)) = disj (prep (E (NOT p))) (prep (E q))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1036
  "prep (E (Iff p q)) = disj (prep (E (And p q))) (prep (E (And (NOT p) (NOT q))))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1037
  "prep (E (NOT (And p q))) = disj (prep (E (NOT p))) (prep (E(NOT q)))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1038
  "prep (E (NOT (Imp p q))) = prep (E (And p (NOT q)))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1039
  "prep (E (NOT (Iff p q))) = disj (prep (E (And p (NOT q)))) (prep (E(And (NOT p) q)))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1040
  "prep (E p) = E (prep p)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1041
  "prep (A (And p q)) = conj (prep (A p)) (prep (A q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1042
  "prep (A p) = prep (NOT (E (NOT p)))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1043
  "prep (NOT (NOT p)) = prep p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1044
  "prep (NOT (And p q)) = disj (prep (NOT p)) (prep (NOT q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1045
  "prep (NOT (A p)) = prep (E (NOT p))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1046
  "prep (NOT (Or p q)) = conj (prep (NOT p)) (prep (NOT q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1047
  "prep (NOT (Imp p q)) = conj (prep p) (prep (NOT q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1048
  "prep (NOT (Iff p q)) = disj (prep (And p (NOT q))) (prep (And (NOT p) q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1049
  "prep (NOT p) = not (prep p)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1050
  "prep (Or p q) = disj (prep p) (prep q)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1051
  "prep (And p q) = conj (prep p) (prep q)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1052
  "prep (Imp p q) = prep (Or (NOT p) q)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1053
  "prep (Iff p q) = disj (prep (And p q)) (prep (And (NOT p) (NOT q)))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1054
  "prep p = p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1055
  (hints simp add: fmsize_pos)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1056
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1057
lemma prep: "\<And>bs. Ifm bs (prep p) = Ifm bs p"
44779
98d597c4193d tuned proofs;
wenzelm
parents: 44013
diff changeset
  1058
  by (induct p rule: prep.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1059
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1060
  (* Generic quantifier elimination *)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1061
function (sequential) qelim :: "fm \<Rightarrow> (fm \<Rightarrow> fm) \<Rightarrow> fm"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1062
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1063
  "qelim (E p) = (\<lambda>qe. DJ qe (qelim p qe))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1064
| "qelim (A p) = (\<lambda>qe. not (qe ((qelim (NOT p) qe))))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1065
| "qelim (NOT p) = (\<lambda>qe. not (qelim p qe))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1066
| "qelim (And p q) = (\<lambda>qe. conj (qelim p qe) (qelim q qe))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1067
| "qelim (Or  p q) = (\<lambda>qe. disj (qelim p qe) (qelim q qe))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1068
| "qelim (Imp p q) = (\<lambda>qe. imp (qelim p qe) (qelim q qe))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1069
| "qelim (Iff p q) = (\<lambda>qe. iff (qelim p qe) (qelim q qe))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1070
| "qelim p = (\<lambda>y. simpfm p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1071
  by pat_completeness auto
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1072
termination qelim by (relation "measure fmsize") simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1073
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1074
lemma qelim_ci:
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1075
  assumes qe_inv: "\<forall>bs p. qfree p \<longrightarrow> qfree (qe p) \<and> (Ifm bs (qe p) = Ifm bs (E p))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1076
  shows "\<And>bs. qfree (qelim p qe) \<and> (Ifm bs (qelim p qe) = Ifm bs p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1077
  using qe_inv DJ_qe[OF qe_inv]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1078
  by (induct p rule: qelim.induct)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1079
    (auto simp add: not disj conj iff imp not_qf disj_qf conj_qf imp_qf iff_qf
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1080
      simpfm simpfm_qf simp del: simpfm.simps)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1081
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1082
fun minusinf:: "fm \<Rightarrow> fm" (* Virtual substitution of -\<infinity>*)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1083
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1084
  "minusinf (And p q) = conj (minusinf p) (minusinf q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1085
| "minusinf (Or p q) = disj (minusinf p) (minusinf q)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1086
| "minusinf (Eq  (CN 0 c e)) = F"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1087
| "minusinf (NEq (CN 0 c e)) = T"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1088
| "minusinf (Lt  (CN 0 c e)) = T"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1089
| "minusinf (Le  (CN 0 c e)) = T"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1090
| "minusinf (Gt  (CN 0 c e)) = F"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1091
| "minusinf (Ge  (CN 0 c e)) = F"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1092
| "minusinf p = p"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1093
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1094
fun plusinf:: "fm \<Rightarrow> fm" (* Virtual substitution of +\<infinity>*)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1095
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1096
  "plusinf (And p q) = conj (plusinf p) (plusinf q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1097
| "plusinf (Or p q) = disj (plusinf p) (plusinf q)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1098
| "plusinf (Eq  (CN 0 c e)) = F"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1099
| "plusinf (NEq (CN 0 c e)) = T"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1100
| "plusinf (Lt  (CN 0 c e)) = F"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1101
| "plusinf (Le  (CN 0 c e)) = F"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1102
| "plusinf (Gt  (CN 0 c e)) = T"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1103
| "plusinf (Ge  (CN 0 c e)) = T"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1104
| "plusinf p = p"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1105
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1106
fun isrlfm :: "fm \<Rightarrow> bool"   (* Linearity test for fm *)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1107
where
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1108
  "isrlfm (And p q) = (isrlfm p \<and> isrlfm q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1109
| "isrlfm (Or p q) = (isrlfm p \<and> isrlfm q)"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1110
| "isrlfm (Eq  (CN 0 c e)) = (c>0 \<and> numbound0 e)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1111
| "isrlfm (NEq (CN 0 c e)) = (c>0 \<and> numbound0 e)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1112
| "isrlfm (Lt  (CN 0 c e)) = (c>0 \<and> numbound0 e)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1113
| "isrlfm (Le  (CN 0 c e)) = (c>0 \<and> numbound0 e)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1114
| "isrlfm (Gt  (CN 0 c e)) = (c>0 \<and> numbound0 e)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1115
| "isrlfm (Ge  (CN 0 c e)) = (c>0 \<and> numbound0 e)"
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1116
| "isrlfm p = (isatom p \<and> (bound0 p))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1117
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1118
  (* splits the bounded from the unbounded part*)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1119
function (sequential) rsplit0 :: "num \<Rightarrow> int \<times> num"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1120
where
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1121
  "rsplit0 (Bound 0) = (1,C 0)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1122
| "rsplit0 (Add a b) = (let (ca,ta) = rsplit0 a; (cb,tb) = rsplit0 b in (ca + cb, Add ta tb))"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1123
| "rsplit0 (Sub a b) = rsplit0 (Add a (Neg b))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1124
| "rsplit0 (Neg a) = (let (c,t) = rsplit0 a in (- c, Neg t))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1125
| "rsplit0 (Mul c a) = (let (ca,ta) = rsplit0 a in (c * ca, Mul c ta))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1126
| "rsplit0 (CN 0 c a) = (let (ca,ta) = rsplit0 a in (c + ca, ta))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1127
| "rsplit0 (CN n c a) = (let (ca,ta) = rsplit0 a in (ca, CN n c ta))"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1128
| "rsplit0 t = (0,t)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1129
  by pat_completeness auto
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1130
termination rsplit0 by (relation "measure num_size") simp_all
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1131
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1132
lemma rsplit0: "Inum bs ((case_prod (CN 0)) (rsplit0 t)) = Inum bs t \<and> numbound0 (snd (rsplit0 t))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1133
proof (induct t rule: rsplit0.induct)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1134
  case (2 a b)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1135
  let ?sa = "rsplit0 a"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1136
  let ?sb = "rsplit0 b"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1137
  let ?ca = "fst ?sa"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1138
  let ?cb = "fst ?sb"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1139
  let ?ta = "snd ?sa"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1140
  let ?tb = "snd ?sb"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1141
  from 2 have nb: "numbound0 (snd(rsplit0 (Add a b)))"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  1142
    by (cases "rsplit0 a") (auto simp add: Let_def split_def)
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1143
  have "Inum bs ((case_prod (CN 0)) (rsplit0 (Add a b))) =
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1144
    Inum bs ((case_prod (CN 0)) ?sa)+Inum bs ((case_prod (CN 0)) ?sb)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1145
    by (simp add: Let_def split_def algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1146
  also have "\<dots> = Inum bs a + Inum bs b"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1147
    using 2 by (cases "rsplit0 a") auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1148
  finally show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1149
    using nb by simp
49962
a8cc904a6820 Renamed {left,right}_distrib to distrib_{right,left}.
webertj
parents: 49070
diff changeset
  1150
qed (auto simp add: Let_def split_def algebra_simps, simp add: distrib_left[symmetric])
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1151
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1152
    (* Linearize a formula*)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1153
definition lt :: "int \<Rightarrow> num \<Rightarrow> fm"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1154
where
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1155
  "lt c t = (if c = 0 then (Lt t) else if c > 0 then (Lt (CN 0 c t))
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1156
    else (Gt (CN 0 (-c) (Neg t))))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1157
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1158
definition le :: "int \<Rightarrow> num \<Rightarrow> fm"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1159
where
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1160
  "le c t = (if c = 0 then (Le t) else if c > 0 then (Le (CN 0 c t))
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1161
    else (Ge (CN 0 (-c) (Neg t))))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1162
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1163
definition gt :: "int \<Rightarrow> num \<Rightarrow> fm"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1164
where
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1165
  "gt c t = (if c = 0 then (Gt t) else if c > 0 then (Gt (CN 0 c t))
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1166
    else (Lt (CN 0 (-c) (Neg t))))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1167
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1168
definition ge :: "int \<Rightarrow> num \<Rightarrow> fm"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1169
where
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1170
  "ge c t = (if c = 0 then (Ge t) else if c > 0 then (Ge (CN 0 c t))
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1171
    else (Le (CN 0 (-c) (Neg t))))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1172
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1173
definition eq :: "int \<Rightarrow> num \<Rightarrow> fm"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1174
where
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1175
  "eq c t = (if c = 0 then (Eq t) else if c > 0 then (Eq (CN 0 c t))
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1176
    else (Eq (CN 0 (-c) (Neg t))))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1177
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1178
definition neq :: "int \<Rightarrow> num \<Rightarrow> fm"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1179
where
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1180
  "neq c t = (if c = 0 then (NEq t) else if c > 0 then (NEq (CN 0 c t))
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1181
    else (NEq (CN 0 (-c) (Neg t))))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1182
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1183
lemma lt: "numnoabs t \<Longrightarrow> Ifm bs (case_prod lt (rsplit0 t)) =
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1184
  Ifm bs (Lt t) \<and> isrlfm (case_prod lt (rsplit0 t))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1185
  using rsplit0[where bs = "bs" and t="t"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1186
  by (auto simp add: lt_def split_def, cases "snd(rsplit0 t)", auto,
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1187
    rename_tac nat a b, case_tac "nat", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1188
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1189
lemma le: "numnoabs t \<Longrightarrow> Ifm bs (case_prod le (rsplit0 t)) =
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1190
  Ifm bs (Le t) \<and> isrlfm (case_prod le (rsplit0 t))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1191
  using rsplit0[where bs = "bs" and t="t"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1192
  by (auto simp add: le_def split_def, cases "snd(rsplit0 t)", auto,
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1193
    rename_tac nat a b, case_tac "nat", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1194
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1195
lemma gt: "numnoabs t \<Longrightarrow> Ifm bs (case_prod gt (rsplit0 t)) =
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1196
  Ifm bs (Gt t) \<and> isrlfm (case_prod gt (rsplit0 t))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1197
  using rsplit0[where bs = "bs" and t="t"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1198
  by (auto simp add: gt_def split_def, cases "snd(rsplit0 t)", auto,
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1199
    rename_tac nat a b, case_tac "nat", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1200
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1201
lemma ge: "numnoabs t \<Longrightarrow> Ifm bs (case_prod ge (rsplit0 t)) =
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1202
  Ifm bs (Ge t) \<and> isrlfm (case_prod ge (rsplit0 t))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1203
  using rsplit0[where bs = "bs" and t="t"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1204
  by (auto simp add: ge_def split_def, cases "snd(rsplit0 t)", auto,
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1205
    rename_tac nat a b, case_tac "nat", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1206
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1207
lemma eq: "numnoabs t \<Longrightarrow> Ifm bs (case_prod eq (rsplit0 t)) =
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1208
  Ifm bs (Eq t) \<and> isrlfm (case_prod eq (rsplit0 t))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1209
  using rsplit0[where bs = "bs" and t="t"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1210
  by (auto simp add: eq_def split_def, cases "snd(rsplit0 t)", auto,
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1211
    rename_tac nat a b, case_tac "nat", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1212
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1213
lemma neq: "numnoabs t \<Longrightarrow> Ifm bs (case_prod neq (rsplit0 t)) =
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1214
  Ifm bs (NEq t) \<and> isrlfm (case_prod neq (rsplit0 t))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1215
  using rsplit0[where bs = "bs" and t="t"]
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1216
  by (auto simp add: neq_def split_def, cases "snd(rsplit0 t)", auto,
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1217
    rename_tac nat a b, case_tac "nat", auto)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1218
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1219
lemma conj_lin: "isrlfm p \<Longrightarrow> isrlfm q \<Longrightarrow> isrlfm (conj p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1220
  by (auto simp add: conj_def)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1221
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1222
lemma disj_lin: "isrlfm p \<Longrightarrow> isrlfm q \<Longrightarrow> isrlfm (disj p q)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1223
  by (auto simp add: disj_def)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1224
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1225
consts rlfm :: "fm \<Rightarrow> fm"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1226
recdef rlfm "measure fmsize"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1227
  "rlfm (And p q) = conj (rlfm p) (rlfm q)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1228
  "rlfm (Or p q) = disj (rlfm p) (rlfm q)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1229
  "rlfm (Imp p q) = disj (rlfm (NOT p)) (rlfm q)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1230
  "rlfm (Iff p q) = disj (conj (rlfm p) (rlfm q)) (conj (rlfm (NOT p)) (rlfm (NOT q)))"
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1231
  "rlfm (Lt a) = case_prod lt (rsplit0 a)"
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1232
  "rlfm (Le a) = case_prod le (rsplit0 a)"
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1233
  "rlfm (Gt a) = case_prod gt (rsplit0 a)"
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1234
  "rlfm (Ge a) = case_prod ge (rsplit0 a)"
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1235
  "rlfm (Eq a) = case_prod eq (rsplit0 a)"
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  1236
  "rlfm (NEq a) = case_prod neq (rsplit0 a)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1237
  "rlfm (NOT (And p q)) = disj (rlfm (NOT p)) (rlfm (NOT q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1238
  "rlfm (NOT (Or p q)) = conj (rlfm (NOT p)) (rlfm (NOT q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1239
  "rlfm (NOT (Imp p q)) = conj (rlfm p) (rlfm (NOT q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1240
  "rlfm (NOT (Iff p q)) = disj (conj(rlfm p) (rlfm(NOT q))) (conj(rlfm(NOT p)) (rlfm q))"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1241
  "rlfm (NOT (NOT p)) = rlfm p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1242
  "rlfm (NOT T) = F"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1243
  "rlfm (NOT F) = T"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1244
  "rlfm (NOT (Lt a)) = rlfm (Ge a)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1245
  "rlfm (NOT (Le a)) = rlfm (Gt a)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1246
  "rlfm (NOT (Gt a)) = rlfm (Le a)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1247
  "rlfm (NOT (Ge a)) = rlfm (Lt a)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1248
  "rlfm (NOT (Eq a)) = rlfm (NEq a)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1249
  "rlfm (NOT (NEq a)) = rlfm (Eq a)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1250
  "rlfm p = p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1251
  (hints simp add: fmsize_pos)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1252
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1253
lemma rlfm_I:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1254
  assumes qfp: "qfree p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1255
  shows "(Ifm bs (rlfm p) = Ifm bs p) \<and> isrlfm (rlfm p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1256
  using qfp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1257
  by (induct p rule: rlfm.induct) (auto simp add: lt le gt ge eq neq conj disj conj_lin disj_lin)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1258
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1259
    (* Operations needed for Ferrante and Rackoff *)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1260
lemma rminusinf_inf:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1261
  assumes lp: "isrlfm p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1262
  shows "\<exists>z. \<forall>x < z. Ifm (x#bs) (minusinf p) = Ifm (x#bs) p" (is "\<exists>z. \<forall>x. ?P z x p")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1263
  using lp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1264
proof (induct p rule: minusinf.induct)
44779
98d597c4193d tuned proofs;
wenzelm
parents: 44013
diff changeset
  1265
  case (1 p q)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1266
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1267
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1268
    apply (rule_tac x= "min z za" in exI)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1269
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1270
    done
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1271
next
44779
98d597c4193d tuned proofs;
wenzelm
parents: 44013
diff changeset
  1272
  case (2 p q)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1273
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1274
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1275
    apply (rule_tac x= "min z za" in exI)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1276
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1277
    done
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1278
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1279
  case (3 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1280
  from 3 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1281
  from 3 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1282
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1283
  let ?e = "Inum (a#bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1284
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1285
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1286
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1287
    assume xz: "x < ?z"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1288
    then have "(real c * x < - ?e)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1289
      by (simp only: pos_less_divide_eq[OF cp, where a="x" and b="- ?e"] ac_simps)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1290
    then have "real c * x + ?e < 0" by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1291
    then have "real c * x + ?e \<noteq> 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1292
    with xz have "?P ?z x (Eq (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1293
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1294
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1295
  then have "\<forall>x < ?z. ?P ?z x (Eq (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1296
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1297
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1298
  case (4 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1299
  from 4 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1300
  from 4 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1301
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1302
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1303
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1304
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1305
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1306
    assume xz: "x < ?z"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1307
    then have "(real c * x < - ?e)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1308
      by (simp only: pos_less_divide_eq[OF cp, where a="x" and b="- ?e"] ac_simps)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1309
    then have "real c * x + ?e < 0" by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1310
    then have "real c * x + ?e \<noteq> 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1311
    with xz have "?P ?z x (NEq (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1312
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1313
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1314
  then have "\<forall>x < ?z. ?P ?z x (NEq (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1315
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1316
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1317
  case (5 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1318
  from 5 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1319
  from 5 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1320
  fix a
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1321
  let ?e="Inum (a#bs) e"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1322
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1323
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1324
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1325
    assume xz: "x < ?z"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1326
    then have "(real c * x < - ?e)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1327
      by (simp only: pos_less_divide_eq[OF cp, where a="x" and b="- ?e"] ac_simps)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1328
    then have "real c * x + ?e < 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1329
    with xz have "?P ?z x (Lt (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1330
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"]  by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1331
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1332
  then have "\<forall>x < ?z. ?P ?z x (Lt (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1333
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1334
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1335
  case (6 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1336
  from 6 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1337
  from lp 6 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1338
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1339
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1340
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1341
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1342
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1343
    assume xz: "x < ?z"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1344
    then have "(real c * x < - ?e)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1345
      by (simp only: pos_less_divide_eq[OF cp, where a="x" and b="- ?e"] ac_simps)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1346
    then have "real c * x + ?e < 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1347
    with xz have "?P ?z x (Le (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1348
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1349
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1350
  then have "\<forall>x < ?z. ?P ?z x (Le (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1351
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1352
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1353
  case (7 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1354
  from 7 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1355
  from 7 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1356
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1357
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1358
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1359
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1360
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1361
    assume xz: "x < ?z"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1362
    then have "(real c * x < - ?e)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1363
      by (simp only: pos_less_divide_eq[OF cp, where a="x" and b="- ?e"] ac_simps)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1364
    then have "real c * x + ?e < 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1365
    with xz have "?P ?z x (Gt (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1366
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1367
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1368
  then have "\<forall>x < ?z. ?P ?z x (Gt (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1369
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1370
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1371
  case (8 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1372
  from 8 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1373
  from 8 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1374
  fix a
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1375
  let ?e="Inum (a#bs) e"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1376
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1377
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1378
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1379
    assume xz: "x < ?z"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1380
    then have "(real c * x < - ?e)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1381
      by (simp only: pos_less_divide_eq[OF cp, where a="x" and b="- ?e"] ac_simps)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1382
    then have "real c * x + ?e < 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1383
    with xz have "?P ?z x (Ge (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1384
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1385
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1386
  then have "\<forall>x < ?z. ?P ?z x (Ge (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1387
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1388
qed simp_all
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1389
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1390
lemma rplusinf_inf:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1391
  assumes lp: "isrlfm p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1392
  shows "\<exists>z. \<forall>x > z. Ifm (x#bs) (plusinf p) = Ifm (x#bs) p" (is "\<exists>z. \<forall>x. ?P z x p")
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1393
using lp
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1394
proof (induct p rule: isrlfm.induct)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1395
  case (1 p q)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1396
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1397
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1398
    apply (rule_tac x= "max z za" in exI)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1399
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1400
    done
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1401
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1402
  case (2 p q)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1403
  then show ?case
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1404
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1405
    apply (rule_tac x= "max z za" in exI)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1406
    apply auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1407
    done
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1408
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1409
  case (3 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1410
  from 3 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1411
  from 3 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1412
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1413
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1414
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1415
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1416
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1417
    assume xz: "x > ?z"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1418
    with mult_strict_right_mono [OF xz cp] cp
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1419
    have "(real c * x > - ?e)" by (simp add: ac_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1420
    then have "real c * x + ?e > 0" by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1421
    then have "real c * x + ?e \<noteq> 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1422
    with xz have "?P ?z x (Eq (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1423
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1424
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1425
  then have "\<forall>x > ?z. ?P ?z x (Eq (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1426
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1427
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1428
  case (4 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1429
  from 4 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1430
  from 4 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1431
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1432
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1433
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1434
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1435
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1436
    assume xz: "x > ?z"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1437
    with mult_strict_right_mono [OF xz cp] cp
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1438
    have "(real c * x > - ?e)" by (simp add: ac_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1439
    then have "real c * x + ?e > 0" by arith
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1440
    then have "real c * x + ?e \<noteq> 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1441
    with xz have "?P ?z x (NEq (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1442
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1443
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1444
  then have "\<forall>x > ?z. ?P ?z x (NEq (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1445
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1446
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1447
  case (5 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1448
  from 5 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1449
  from 5 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1450
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1451
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1452
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1453
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1454
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1455
    assume xz: "x > ?z"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1456
    with mult_strict_right_mono [OF xz cp] cp
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1457
    have "(real c * x > - ?e)" by (simp add: ac_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1458
    then have "real c * x + ?e > 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1459
    with xz have "?P ?z x (Lt (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1460
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1461
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1462
  then have "\<forall>x > ?z. ?P ?z x (Lt (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1463
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1464
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1465
  case (6 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1466
  from 6 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1467
  from 6 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1468
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1469
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1470
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1471
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1472
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1473
    assume xz: "x > ?z"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1474
    with mult_strict_right_mono [OF xz cp] cp
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1475
    have "(real c * x > - ?e)" by (simp add: ac_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1476
    then have "real c * x + ?e > 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1477
    with xz have "?P ?z x (Le (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1478
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1479
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1480
  then have "\<forall>x > ?z. ?P ?z x (Le (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1481
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1482
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1483
  case (7 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1484
  from 7 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1485
  from 7 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1486
  fix a
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1487
  let ?e = "Inum (a # bs) e"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1488
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1489
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1490
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1491
    assume xz: "x > ?z"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1492
    with mult_strict_right_mono [OF xz cp] cp
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1493
    have "(real c * x > - ?e)" by (simp add: ac_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1494
    then have "real c * x + ?e > 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1495
    with xz have "?P ?z x (Gt (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1496
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1497
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1498
  then have "\<forall>x > ?z. ?P ?z x (Gt (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1499
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1500
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1501
  case (8 c e)
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1502
  from 8 have nb: "numbound0 e" by simp
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1503
  from 8 have cp: "real c > 0" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1504
  fix a
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1505
  let ?e="Inum (a#bs) e"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1506
  let ?z = "(- ?e) / real c"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1507
  {
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1508
    fix x
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1509
    assume xz: "x > ?z"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1510
    with mult_strict_right_mono [OF xz cp] cp
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1511
    have "(real c * x > - ?e)" by (simp add: ac_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1512
    then have "real c * x + ?e > 0" by arith
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1513
    with xz have "?P ?z x (Ge (CN 0 c e))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1514
      using numbound0_I[OF nb, where b="x" and bs="bs" and b'="a"] by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1515
  }
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1516
  then have "\<forall>x > ?z. ?P ?z x (Ge (CN 0 c e))" by simp
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1517
  then show ?case by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1518
qed simp_all
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1519
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1520
lemma rminusinf_bound0:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1521
  assumes lp: "isrlfm p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1522
  shows "bound0 (minusinf p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1523
  using lp by (induct p rule: minusinf.induct) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1524
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1525
lemma rplusinf_bound0:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1526
  assumes lp: "isrlfm p"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1527
  shows "bound0 (plusinf p)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1528
  using lp by (induct p rule: plusinf.induct) simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1529
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1530
lemma rminusinf_ex:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1531
  assumes lp: "isrlfm p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1532
    and ex: "Ifm (a#bs) (minusinf p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1533
  shows "\<exists>x. Ifm (x#bs) p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1534
proof -
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1535
  from bound0_I [OF rminusinf_bound0[OF lp], where b="a" and bs ="bs"] ex
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1536
  have th: "\<forall>x. Ifm (x#bs) (minusinf p)" by auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1537
  from rminusinf_inf[OF lp, where bs="bs"]
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1538
  obtain z where z_def: "\<forall>x<z. Ifm (x # bs) (minusinf p) = Ifm (x # bs) p" by blast
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1539
  from th have "Ifm ((z - 1) # bs) (minusinf p)" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1540
  moreover have "z - 1 < z" by simp
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1541
  ultimately show ?thesis using z_def by auto
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1542
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1543
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1544
lemma rplusinf_ex:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1545
  assumes lp: "isrlfm p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1546
    and ex: "Ifm (a # bs) (plusinf p)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1547
  shows "\<exists>x. Ifm (x # bs) p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1548
proof -
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1549
  from bound0_I [OF rplusinf_bound0[OF lp], where b="a" and bs ="bs"] ex
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1550
  have th: "\<forall>x. Ifm (x # bs) (plusinf p)" by auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1551
  from rplusinf_inf[OF lp, where bs="bs"]
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1552
  obtain z where z_def: "\<forall>x>z. Ifm (x # bs) (plusinf p) = Ifm (x # bs) p" by blast
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1553
  from th have "Ifm ((z + 1) # bs) (plusinf p)" by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1554
  moreover have "z + 1 > z" by simp
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1555
  ultimately show ?thesis using z_def by auto
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1556
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1557
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1558
consts
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1559
  uset:: "fm \<Rightarrow> (num \<times> int) list"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1560
  usubst :: "fm \<Rightarrow> (num \<times> int) \<Rightarrow> fm "
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1561
recdef uset "measure size"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1562
  "uset (And p q) = (uset p @ uset q)"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1563
  "uset (Or p q) = (uset p @ uset q)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1564
  "uset (Eq  (CN 0 c e)) = [(Neg e,c)]"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1565
  "uset (NEq (CN 0 c e)) = [(Neg e,c)]"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1566
  "uset (Lt  (CN 0 c e)) = [(Neg e,c)]"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1567
  "uset (Le  (CN 0 c e)) = [(Neg e,c)]"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1568
  "uset (Gt  (CN 0 c e)) = [(Neg e,c)]"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1569
  "uset (Ge  (CN 0 c e)) = [(Neg e,c)]"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1570
  "uset p = []"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1571
recdef usubst "measure size"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1572
  "usubst (And p q) = (\<lambda>(t,n). And (usubst p (t,n)) (usubst q (t,n)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1573
  "usubst (Or p q) = (\<lambda>(t,n). Or (usubst p (t,n)) (usubst q (t,n)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1574
  "usubst (Eq (CN 0 c e)) = (\<lambda>(t,n). Eq (Add (Mul c t) (Mul n e)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1575
  "usubst (NEq (CN 0 c e)) = (\<lambda>(t,n). NEq (Add (Mul c t) (Mul n e)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1576
  "usubst (Lt (CN 0 c e)) = (\<lambda>(t,n). Lt (Add (Mul c t) (Mul n e)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1577
  "usubst (Le (CN 0 c e)) = (\<lambda>(t,n). Le (Add (Mul c t) (Mul n e)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1578
  "usubst (Gt (CN 0 c e)) = (\<lambda>(t,n). Gt (Add (Mul c t) (Mul n e)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1579
  "usubst (Ge (CN 0 c e)) = (\<lambda>(t,n). Ge (Add (Mul c t) (Mul n e)))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1580
  "usubst p = (\<lambda>(t, n). p)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1581
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1582
lemma usubst_I:
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1583
  assumes lp: "isrlfm p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1584
    and np: "real n > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1585
    and nbt: "numbound0 t"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1586
  shows "(Ifm (x # bs) (usubst p (t,n)) =
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1587
    Ifm (((Inum (x # bs) t) / (real n)) # bs) p) \<and> bound0 (usubst p (t, n))"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1588
  (is "(?I x (usubst p (t, n)) = ?I ?u p) \<and> ?B p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1589
   is "(_ = ?I (?t/?n) p) \<and> _"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1590
   is "(_ = ?I (?N x t /_) p) \<and> _")
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1591
  using lp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1592
proof (induct p rule: usubst.induct)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1593
  case (5 c e)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1594
  with assms have cp: "c > 0" and nb: "numbound0 e" by simp_all
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1595
  have "?I ?u (Lt (CN 0 c e)) \<longleftrightarrow> real c * (?t / ?n) + ?N x e < 0"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1596
    using numbound0_I[OF nb, where bs="bs" and b="?u" and b'="x"] by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1597
  also have "\<dots> \<longleftrightarrow> ?n * (real c * (?t / ?n)) + ?n*(?N x e) < 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1598
    by (simp only: pos_less_divide_eq[OF np, where a="real c *(?t/?n) + (?N x e)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1599
      and b="0", simplified divide_zero_left]) (simp only: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1600
  also have "\<dots> \<longleftrightarrow> real c * ?t + ?n * (?N x e) < 0" using np by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1601
  finally show ?case using nbt nb by (simp add: algebra_simps)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1602
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1603
  case (6 c e)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1604
  with assms have cp: "c > 0" and nb: "numbound0 e" by simp_all
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1605
  have "?I ?u (Le (CN 0 c e)) \<longleftrightarrow> real c * (?t / ?n) + ?N x e \<le> 0"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1606
    using numbound0_I[OF nb, where bs="bs" and b="?u" and b'="x"] by simp
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1607
  also have "\<dots> = (?n*(real c *(?t/?n)) + ?n*(?N x e) \<le> 0)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1608
    by (simp only: pos_le_divide_eq[OF np, where a="real c *(?t/?n) + (?N x e)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1609
      and b="0", simplified divide_zero_left]) (simp only: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1610
  also have "\<dots> = (real c *?t + ?n* (?N x e) \<le> 0)" using np by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1611
  finally show ?case using nbt nb by (simp add: algebra_simps)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1612
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1613
  case (7 c e)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1614
  with assms have cp: "c >0" and nb: "numbound0 e" by simp_all
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1615
  have "?I ?u (Gt (CN 0 c e)) \<longleftrightarrow> real c *(?t / ?n) + ?N x e > 0"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1616
    using numbound0_I[OF nb, where bs="bs" and b="?u" and b'="x"] by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1617
  also have "\<dots> \<longleftrightarrow> ?n * (real c * (?t / ?n)) + ?n * ?N x e > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1618
    by (simp only: pos_divide_less_eq[OF np, where a="real c *(?t/?n) + (?N x e)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1619
      and b="0", simplified divide_zero_left]) (simp only: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1620
  also have "\<dots> \<longleftrightarrow> real c * ?t + ?n * ?N x e > 0" using np by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1621
  finally show ?case using nbt nb by (simp add: algebra_simps)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1622
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1623
  case (8 c e)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1624
  with assms have cp: "c > 0" and nb: "numbound0 e" by simp_all
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1625
  have "?I ?u (Ge (CN 0 c e)) \<longleftrightarrow> real c * (?t / ?n) + ?N x e \<ge> 0"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1626
    using numbound0_I[OF nb, where bs="bs" and b="?u" and b'="x"] by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1627
  also have "\<dots> \<longleftrightarrow> ?n * (real c * (?t / ?n)) + ?n * ?N x e \<ge> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1628
    by (simp only: pos_divide_le_eq[OF np, where a="real c *(?t/?n) + (?N x e)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1629
      and b="0", simplified divide_zero_left]) (simp only: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1630
  also have "\<dots> \<longleftrightarrow> real c * ?t + ?n * ?N x e \<ge> 0" using np by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1631
  finally show ?case using nbt nb by (simp add: algebra_simps)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1632
next
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1633
  case (3 c e)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1634
  with assms have cp: "c > 0" and nb: "numbound0 e" by simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1635
  from np have np: "real n \<noteq> 0" by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1636
  have "?I ?u (Eq (CN 0 c e)) \<longleftrightarrow> real c * (?t / ?n) + ?N x e = 0"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1637
    using numbound0_I[OF nb, where bs="bs" and b="?u" and b'="x"] by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1638
  also have "\<dots> \<longleftrightarrow> ?n * (real c * (?t / ?n)) + ?n * ?N x e = 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1639
    by (simp only: nonzero_eq_divide_eq[OF np, where a="real c *(?t/?n) + (?N x e)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1640
      and b="0", simplified divide_zero_left]) (simp only: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1641
  also have "\<dots> \<longleftrightarrow> real c * ?t + ?n * ?N x e = 0" using np by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1642
  finally show ?case using nbt nb by (simp add: algebra_simps)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1643
next
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1644
  case (4 c e) with assms have cp: "c >0" and nb: "numbound0 e" by simp_all
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1645
  from np have np: "real n \<noteq> 0" by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1646
  have "?I ?u (NEq (CN 0 c e)) \<longleftrightarrow> real c * (?t / ?n) + ?N x e \<noteq> 0"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1647
    using numbound0_I[OF nb, where bs="bs" and b="?u" and b'="x"] by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1648
  also have "\<dots> \<longleftrightarrow> ?n * (real c * (?t / ?n)) + ?n * ?N x e \<noteq> 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1649
    by (simp only: nonzero_eq_divide_eq[OF np, where a="real c *(?t/?n) + (?N x e)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1650
      and b="0", simplified divide_zero_left]) (simp only: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1651
  also have "\<dots> \<longleftrightarrow> real c * ?t + ?n * ?N x e \<noteq> 0" using np by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1652
  finally show ?case using nbt nb by (simp add: algebra_simps)
41842
d8f76db6a207 added simp lemma nth_Cons_pos to List
nipkow
parents: 41838
diff changeset
  1653
qed(simp_all add: nbt numbound0_I[where bs ="bs" and b="(Inum (x#bs) t)/ real n" and b'="x"])
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1654
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1655
lemma uset_l:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1656
  assumes lp: "isrlfm p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1657
  shows "\<forall>(t,k) \<in> set (uset p). numbound0 t \<and> k > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1658
  using lp by (induct p rule: uset.induct) auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1659
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1660
lemma rminusinf_uset:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1661
  assumes lp: "isrlfm p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1662
    and nmi: "\<not> (Ifm (a # bs) (minusinf p))" (is "\<not> (Ifm (a # bs) (?M p))")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1663
    and ex: "Ifm (x#bs) p" (is "?I x p")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1664
  shows "\<exists>(s,m) \<in> set (uset p). x \<ge> Inum (a#bs) s / real m"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1665
    (is "\<exists>(s,m) \<in> ?U p. x \<ge> ?N a s / real m")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1666
proof -
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1667
  have "\<exists>(s,m) \<in> set (uset p). real m * x \<ge> Inum (a#bs) s"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1668
    (is "\<exists>(s,m) \<in> ?U p. real m *x \<ge> ?N a s")
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1669
    using lp nmi ex
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1670
    by (induct p rule: minusinf.induct) (auto simp add:numbound0_I[where bs="bs" and b="a" and b'="x"])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1671
  then obtain s m where smU: "(s,m) \<in> set (uset p)" and mx: "real m * x \<ge> ?N a s"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1672
    by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1673
  from uset_l[OF lp] smU have mp: "real m > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1674
    by auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1675
  from pos_divide_le_eq[OF mp, where a="x" and b="?N a s", symmetric] mx have "x \<ge> ?N a s / real m"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 56544
diff changeset
  1676
    by (auto simp add: mult.commute)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1677
  then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1678
    using smU by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1679
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1680
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1681
lemma rplusinf_uset:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1682
  assumes lp: "isrlfm p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1683
    and nmi: "\<not> (Ifm (a # bs) (plusinf p))" (is "\<not> (Ifm (a # bs) (?M p))")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1684
    and ex: "Ifm (x # bs) p" (is "?I x p")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1685
  shows "\<exists>(s,m) \<in> set (uset p). x \<le> Inum (a#bs) s / real m"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1686
    (is "\<exists>(s,m) \<in> ?U p. x \<le> ?N a s / real m")
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1687
proof -
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1688
  have "\<exists>(s,m) \<in> set (uset p). real m * x \<le> Inum (a#bs) s"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1689
    (is "\<exists>(s,m) \<in> ?U p. real m *x \<le> ?N a s")
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1690
    using lp nmi ex
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1691
    by (induct p rule: minusinf.induct)
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1692
      (auto simp add:numbound0_I[where bs="bs" and b="a" and b'="x"])
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1693
  then obtain s m where smU: "(s,m) \<in> set (uset p)" and mx: "real m * x \<le> ?N a s"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1694
    by blast
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1695
  from uset_l[OF lp] smU have mp: "real m > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1696
    by auto
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1697
  from pos_le_divide_eq[OF mp, where a="x" and b="?N a s", symmetric] mx have "x \<le> ?N a s / real m"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 56544
diff changeset
  1698
    by (auto simp add: mult.commute)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1699
  then show ?thesis
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1700
    using smU by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1701
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1702
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1703
lemma lin_dense:
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1704
  assumes lp: "isrlfm p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1705
    and noS: "\<forall>t. l < t \<and> t< u \<longrightarrow> t \<notin> (\<lambda>(t,n). Inum (x#bs) t / real n) ` set (uset p)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1706
      (is "\<forall>t. _ \<and> _ \<longrightarrow> t \<notin> (\<lambda>(t,n). ?N x t / real n ) ` (?U p)")
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1707
    and lx: "l < x"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1708
    and xu:"x < u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1709
    and px:" Ifm (x#bs) p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1710
    and ly: "l < y" and yu: "y < u"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1711
  shows "Ifm (y#bs) p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1712
  using lp px noS
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1713
proof (induct p rule: isrlfm.induct)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1714
  case (5 c e)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1715
  then have cp: "real c > 0" and nb: "numbound0 e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1716
    by simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1717
  from 5 have "x * real c + ?N x e < 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1718
    by (simp add: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1719
  then have pxc: "x < (- ?N x e) / real c"
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1720
    by (simp only: pos_less_divide_eq[OF cp, where a="x" and b="-?N x e"])
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1721
  from 5 have noSc:"\<forall>t. l < t \<and> t < u \<longrightarrow> t \<noteq> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1722
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1723
  with ly yu have yne: "y \<noteq> - ?N x e / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1724
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1725
  then consider "y < (-?N x e)/ real c" | "y > (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1726
    by atomize_elim auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1727
  then show ?case
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1728
  proof cases
60767
ad5b4771fc19 tuned proofs;
wenzelm
parents: 60711
diff changeset
  1729
    case 1
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1730
    then have "y * real c < - ?N x e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1731
      by (simp add: pos_less_divide_eq[OF cp, where a="y" and b="-?N x e", symmetric])
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1732
    then have "real c * y + ?N x e < 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1733
      by (simp add: algebra_simps)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1734
    then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1735
      using numbound0_I[OF nb, where bs="bs" and b="x" and b'="y"] by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1736
  next
60767
ad5b4771fc19 tuned proofs;
wenzelm
parents: 60711
diff changeset
  1737
    case 2
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1738
    with yu have eu: "u > (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1739
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1740
    with noSc ly yu have "(- ?N x e) / real c \<le> l"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1741
      by (cases "(- ?N x e) / real c > l") auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1742
    with lx pxc have False
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1743
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1744
    then show ?thesis ..
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1745
  qed
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1746
next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1747
  case (6 c e)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1748
  then have cp: "real c > 0" and nb: "numbound0 e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1749
    by simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1750
  from 6 have "x * real c + ?N x e \<le> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1751
    by (simp add: algebra_simps)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1752
  then have pxc: "x \<le> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1753
    by (simp only: pos_le_divide_eq[OF cp, where a="x" and b="-?N x e"])
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1754
  from 6 have noSc:"\<forall>t. l < t \<and> t < u \<longrightarrow> t \<noteq> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1755
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1756
  with ly yu have yne: "y \<noteq> - ?N x e / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1757
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1758
  then consider "y < (- ?N x e) / real c" | "y > (-?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1759
    by atomize_elim auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1760
  then show ?case
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1761
  proof cases
60767
ad5b4771fc19 tuned proofs;
wenzelm
parents: 60711
diff changeset
  1762
    case 1
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1763
    then have "y * real c < - ?N x e"
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1764
      by (simp add: pos_less_divide_eq[OF cp, where a="y" and b="-?N x e", symmetric])
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1765
    then have "real c * y + ?N x e < 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1766
      by (simp add: algebra_simps)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1767
    then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1768
      using numbound0_I[OF nb, where bs="bs" and b="x" and b'="y"] by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1769
  next
60767
ad5b4771fc19 tuned proofs;
wenzelm
parents: 60711
diff changeset
  1770
    case 2
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1771
    with yu have eu: "u > (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1772
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1773
    with noSc ly yu have "(- ?N x e) / real c \<le> l"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1774
      by (cases "(- ?N x e) / real c > l") auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1775
    with lx pxc have False
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1776
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1777
    then show ?thesis ..
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1778
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1779
next
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1780
  case (7 c e)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1781
  then have cp: "real c > 0" and nb: "numbound0 e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1782
    by simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1783
  from 7 have "x * real c + ?N x e > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1784
    by (simp add: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1785
  then have pxc: "x > (- ?N x e) / real c"
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1786
    by (simp only: pos_divide_less_eq[OF cp, where a="x" and b="-?N x e"])
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1787
  from 7 have noSc: "\<forall>t. l < t \<and> t < u \<longrightarrow> t \<noteq> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1788
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1789
  with ly yu have yne: "y \<noteq> - ?N x e / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1790
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1791
  then consider "y > (- ?N x e) / real c" | "y < (-?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1792
    by atomize_elim auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1793
  then show ?case
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1794
  proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1795
    case 1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1796
    then have "y * real c > - ?N x e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1797
      by (simp add: pos_divide_less_eq[OF cp, where a="y" and b="-?N x e", symmetric])
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1798
    then have "real c * y + ?N x e > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1799
      by (simp add: algebra_simps)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1800
    then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1801
      using numbound0_I[OF nb, where bs="bs" and b="x" and b'="y"] by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1802
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1803
    case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1804
    with ly have eu: "l < (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1805
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1806
    with noSc ly yu have "(- ?N x e) / real c \<ge> u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1807
      by (cases "(- ?N x e) / real c > l") auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1808
    with xu pxc have False by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1809
    then show ?thesis ..
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1810
  qed
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1811
next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1812
  case (8 c e)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1813
  then have cp: "real c > 0" and nb: "numbound0 e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1814
    by simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1815
  from 8 have "x * real c + ?N x e \<ge> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1816
    by (simp add: algebra_simps)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1817
  then have pxc: "x \<ge> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1818
    by (simp only: pos_divide_le_eq[OF cp, where a="x" and b="-?N x e"])
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1819
  from 8 have noSc:"\<forall>t. l < t \<and> t < u \<longrightarrow> t \<noteq> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1820
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1821
  with ly yu have yne: "y \<noteq> - ?N x e / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1822
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1823
  then consider "y > (- ?N x e) / real c" | "y < (-?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1824
    by atomize_elim auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1825
  then show ?case
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1826
  proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1827
    case 1
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1828
    then have "y * real c > - ?N x e"
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1829
      by (simp add: pos_divide_less_eq[OF cp, where a="y" and b="-?N x e", symmetric])
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1830
    then have "real c * y + ?N x e > 0" by (simp add: algebra_simps)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1831
    then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1832
      using numbound0_I[OF nb, where bs="bs" and b="x" and b'="y"] by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1833
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1834
    case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1835
    with ly have eu: "l < (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1836
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1837
    with noSc ly yu have "(- ?N x e) / real c \<ge> u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1838
      by (cases "(- ?N x e) / real c > l") auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1839
    with xu pxc have False
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1840
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1841
    then show ?thesis ..
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1842
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1843
next
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1844
  case (3 c e)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1845
  then have cp: "real c > 0" and nb: "numbound0 e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1846
    by simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1847
  from cp have cnz: "real c \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1848
    by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1849
  from 3 have "x * real c + ?N x e = 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1850
    by (simp add: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1851
  then have pxc: "x = (- ?N x e) / real c"
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1852
    by (simp only: nonzero_eq_divide_eq[OF cnz, where a="x" and b="-?N x e"])
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1853
  from 3 have noSc:"\<forall>t. l < t \<and> t < u \<longrightarrow> t \<noteq> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1854
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1855
  with lx xu have yne: "x \<noteq> - ?N x e / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1856
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1857
  with pxc show ?case
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1858
    by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1859
next
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1860
  case (4 c e)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1861
  then have cp: "real c > 0" and nb: "numbound0 e"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1862
    by simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1863
  from cp have cnz: "real c \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1864
    by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1865
  from 4 have noSc:"\<forall>t. l < t \<and> t < u \<longrightarrow> t \<noteq> (- ?N x e) / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1866
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1867
  with ly yu have yne: "y \<noteq> - ?N x e / real c"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1868
    by auto
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1869
  then have "y* real c \<noteq> -?N x e"
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1870
    by (simp only: nonzero_eq_divide_eq[OF cnz, where a="y" and b="-?N x e"]) simp
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1871
  then have "y* real c + ?N x e \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1872
    by (simp add: algebra_simps)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1873
  then show ?case using numbound0_I[OF nb, where bs="bs" and b="x" and b'="y"]
41807
ab5d2d81f9fb tuned proofs -- eliminated prems;
wenzelm
parents: 41413
diff changeset
  1874
    by (simp add: algebra_simps)
41842
d8f76db6a207 added simp lemma nth_Cons_pos to List
nipkow
parents: 41838
diff changeset
  1875
qed (auto simp add: numbound0_I[where bs="bs" and b="y" and b'="x"])
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1876
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1877
lemma finite_set_intervals:
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1878
  fixes x :: real
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1879
  assumes px: "P x"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1880
    and lx: "l \<le> x"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1881
    and xu: "x \<le> u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1882
    and linS: "l\<in> S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1883
    and uinS: "u \<in> S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1884
    and fS: "finite S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1885
    and lS: "\<forall>x\<in> S. l \<le> x"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1886
    and Su: "\<forall>x\<in> S. x \<le> u"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1887
  shows "\<exists>a \<in> S. \<exists>b \<in> S. (\<forall>y. a < y \<and> y < b \<longrightarrow> y \<notin> S) \<and> a \<le> x \<and> x \<le> b \<and> P x"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1888
proof -
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1889
  let ?Mx = "{y. y\<in> S \<and> y \<le> x}"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1890
  let ?xM = "{y. y\<in> S \<and> x \<le> y}"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1891
  let ?a = "Max ?Mx"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1892
  let ?b = "Min ?xM"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1893
  have MxS: "?Mx \<subseteq> S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1894
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1895
  then have fMx: "finite ?Mx"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1896
    using fS finite_subset by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1897
  from lx linS have linMx: "l \<in> ?Mx"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1898
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1899
  then have Mxne: "?Mx \<noteq> {}"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1900
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1901
  have xMS: "?xM \<subseteq> S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1902
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1903
  then have fxM: "finite ?xM"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1904
    using fS finite_subset by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1905
  from xu uinS have linxM: "u \<in> ?xM"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1906
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1907
  then have xMne: "?xM \<noteq> {}"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1908
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1909
  have ax:"?a \<le> x"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1910
    using Mxne fMx by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1911
  have xb:"x \<le> ?b"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1912
    using xMne fxM by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1913
  have "?a \<in> ?Mx"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1914
    using Max_in[OF fMx Mxne] by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1915
  then have ainS: "?a \<in> S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1916
    using MxS by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1917
  have "?b \<in> ?xM"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1918
    using Min_in[OF fxM xMne] by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1919
  then have binS: "?b \<in> S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1920
    using xMS by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1921
  have noy: "\<forall>y. ?a < y \<and> y < ?b \<longrightarrow> y \<notin> S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1922
  proof clarsimp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1923
    fix y
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1924
    assume ay: "?a < y" and yb: "y < ?b" and yS: "y \<in> S"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1925
    from yS consider "y \<in> ?Mx" | "y \<in> ?xM"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1926
      by atomize_elim auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1927
    then show False
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1928
    proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1929
      case 1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1930
      then have "y \<le> ?a"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1931
        using Mxne fMx by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1932
      with ay show ?thesis by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1933
    next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1934
      case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1935
      then have "y \<ge> ?b"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1936
        using xMne fxM by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1937
      with yb show ?thesis by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1938
    qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1939
  qed
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1940
  from ainS binS noy ax xb px show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1941
    by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1942
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1943
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1944
lemma rinf_uset:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1945
  assumes lp: "isrlfm p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1946
    and nmi: "\<not> (Ifm (x # bs) (minusinf p))"  (is "\<not> (Ifm (x # bs) (?M p))")
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1947
    and npi: "\<not> (Ifm (x # bs) (plusinf p))"  (is "\<not> (Ifm (x # bs) (?P p))")
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1948
    and ex: "\<exists>x. Ifm (x # bs) p"  (is "\<exists>x. ?I x p")
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1949
  shows "\<exists>(l,n) \<in> set (uset p). \<exists>(s,m) \<in> set (uset p).
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1950
    ?I ((Inum (x#bs) l / real n + Inum (x#bs) s / real m) / 2) p"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1951
proof -
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1952
  let ?N = "\<lambda>x t. Inum (x # bs) t"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1953
  let ?U = "set (uset p)"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1954
  from ex obtain a where pa: "?I a p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1955
    by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1956
  from bound0_I[OF rminusinf_bound0[OF lp], where bs="bs" and b="x" and b'="a"] nmi
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1957
  have nmi': "\<not> (?I a (?M p))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1958
    by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1959
  from bound0_I[OF rplusinf_bound0[OF lp], where bs="bs" and b="x" and b'="a"] npi
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1960
  have npi': "\<not> (?I a (?P p))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1961
    by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1962
  have "\<exists>(l,n) \<in> set (uset p). \<exists>(s,m) \<in> set (uset p). ?I ((?N a l/real n + ?N a s /real m) / 2) p"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1963
  proof -
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1964
    let ?M = "(\<lambda>(t,c). ?N a t / real c) ` ?U"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1965
    have fM: "finite ?M"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1966
      by auto
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  1967
    from rminusinf_uset[OF lp nmi pa] rplusinf_uset[OF lp npi pa]
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1968
    have "\<exists>(l,n) \<in> set (uset p). \<exists>(s,m) \<in> set (uset p). a \<le> ?N x l / real n \<and> a \<ge> ?N x s / real m"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1969
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1970
    then obtain "t" "n" "s" "m"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1971
      where tnU: "(t,n) \<in> ?U"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1972
        and smU: "(s,m) \<in> ?U"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1973
        and xs1: "a \<le> ?N x s / real m"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1974
        and tx1: "a \<ge> ?N x t / real n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1975
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1976
    from uset_l[OF lp] tnU smU numbound0_I[where bs="bs" and b="x" and b'="a"] xs1 tx1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1977
    have xs: "a \<le> ?N a s / real m" and tx: "a \<ge> ?N a t / real n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1978
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1979
    from tnU have Mne: "?M \<noteq> {}"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1980
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1981
    then have Une: "?U \<noteq> {}"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1982
      by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1983
    let ?l = "Min ?M"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  1984
    let ?u = "Max ?M"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1985
    have linM: "?l \<in> ?M"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1986
      using fM Mne by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1987
    have uinM: "?u \<in> ?M"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1988
      using fM Mne by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1989
    have tnM: "?N a t / real n \<in> ?M"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1990
      using tnU by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1991
    have smM: "?N a s / real m \<in> ?M"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1992
      using smU by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1993
    have lM: "\<forall>t\<in> ?M. ?l \<le> t"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1994
      using Mne fM by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1995
    have Mu: "\<forall>t\<in> ?M. t \<le> ?u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1996
      using Mne fM by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1997
    have "?l \<le> ?N a t / real n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1998
      using tnM Mne by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  1999
    then have lx: "?l \<le> a"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2000
      using tx by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2001
    have "?N a s / real m \<le> ?u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2002
      using smM Mne by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2003
    then have xu: "a \<le> ?u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2004
      using xs by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2005
    from finite_set_intervals2[where P="\<lambda>x. ?I x p",OF pa lx xu linM uinM fM lM Mu]
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2006
    consider u where "u \<in> ?M" "?I u p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2007
      | t1 t2 where "t1 \<in> ?M" "t2 \<in> ?M" "\<forall>y. t1 < y \<and> y < t2 \<longrightarrow> y \<notin> ?M" "t1 < a" "a < t2" "?I a p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2008
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2009
    then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2010
    proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2011
      case 1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2012
      note um = \<open>u \<in> ?M\<close> and pu = \<open>?I u p\<close>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2013
      then have "\<exists>(tu,nu) \<in> ?U. u = ?N a tu / real nu"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2014
        by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2015
      then obtain tu nu where tuU: "(tu, nu) \<in> ?U" and tuu: "u= ?N a tu / real nu"
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
  2016
        by blast
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2017
      have "(u + u) / 2 = u"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2018
        by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2019
      with pu tuu have "?I (((?N a tu / real nu) + (?N a tu / real nu)) / 2) p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2020
        by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2021
      with tuU show ?thesis by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2022
    next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2023
      case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2024
      note t1M = \<open>t1 \<in> ?M\<close> and t2M = \<open>t2\<in> ?M\<close>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2025
        and noM = \<open>\<forall>y. t1 < y \<and> y < t2 \<longrightarrow> y \<notin> ?M\<close>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2026
        and t1x = \<open>t1 < a\<close> and xt2 = \<open>a < t2\<close> and px = \<open>?I a p\<close>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2027
      from t1M have "\<exists>(t1u,t1n) \<in> ?U. t1 = ?N a t1u / real t1n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2028
        by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2029
      then obtain t1u t1n where t1uU: "(t1u, t1n) \<in> ?U" and t1u: "t1 = ?N a t1u / real t1n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2030
        by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2031
      from t2M have "\<exists>(t2u,t2n) \<in> ?U. t2 = ?N a t2u / real t2n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2032
        by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2033
      then obtain t2u t2n where t2uU: "(t2u, t2n) \<in> ?U" and t2u: "t2 = ?N a t2u / real t2n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2034
        by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2035
      from t1x xt2 have t1t2: "t1 < t2"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2036
        by simp
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2037
      let ?u = "(t1 + t2) / 2"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2038
      from less_half_sum[OF t1t2] gt_half_sum[OF t1t2] have t1lu: "t1 < ?u" and ut2: "?u < t2"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2039
        by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2040
      from lin_dense[OF lp noM t1x xt2 px t1lu ut2] have "?I ?u p" .
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2041
      with t1uU t2uU t1u t2u show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2042
        by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2043
    qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2044
  qed
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2045
  then obtain l n s m where lnU: "(l, n) \<in> ?U" and smU:"(s, m) \<in> ?U"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2046
    and pu: "?I ((?N a l / real n + ?N a s / real m) / 2) p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2047
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2048
  from lnU smU uset_l[OF lp] have nbl: "numbound0 l" and nbs: "numbound0 s"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2049
    by auto
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2050
  from numbound0_I[OF nbl, where bs="bs" and b="a" and b'="x"]
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2051
    numbound0_I[OF nbs, where bs="bs" and b="a" and b'="x"] pu
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2052
  have "?I ((?N x l / real n + ?N x s / real m) / 2) p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2053
    by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2054
  with lnU smU show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2055
    by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2056
qed
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2057
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2058
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2059
    (* The Ferrante - Rackoff Theorem *)
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2060
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2061
theorem fr_eq:
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2062
  assumes lp: "isrlfm p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2063
  shows "(\<exists>x. Ifm (x#bs) p) \<longleftrightarrow>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2064
    Ifm (x # bs) (minusinf p) \<or> Ifm (x # bs) (plusinf p) \<or>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2065
      (\<exists>(t,n) \<in> set (uset p). \<exists>(s,m) \<in> set (uset p).
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2066
        Ifm ((((Inum (x # bs) t) / real n + (Inum (x # bs) s) / real m) / 2) # bs) p)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2067
  (is "(\<exists>x. ?I x p) \<longleftrightarrow> (?M \<or> ?P \<or> ?F)" is "?E = ?D")
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2068
proof
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2069
  assume px: "\<exists>x. ?I x p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2070
  consider "?M \<or> ?P" | "\<not> ?M" "\<not> ?P" by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2071
  then show ?D
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2072
  proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2073
    case 1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2074
    then show ?thesis by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2075
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2076
    case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2077
    from rinf_uset[OF lp this] have ?F
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2078
      using px by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2079
    then show ?thesis by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2080
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2081
next
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2082
  assume ?D
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2083
  then consider ?M | ?P | ?F by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2084
  then show ?E
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2085
  proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2086
    case 1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2087
    from rminusinf_ex[OF lp this] show ?thesis .
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2088
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2089
    case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2090
    from rplusinf_ex[OF lp this] show ?thesis .
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2091
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2092
    case 3
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2093
    then show ?thesis by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2094
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2095
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2096
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2097
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2098
lemma fr_equsubst:
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2099
  assumes lp: "isrlfm p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2100
  shows "(\<exists>x. Ifm (x # bs) p) \<longleftrightarrow>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2101
    (Ifm (x # bs) (minusinf p) \<or> Ifm (x # bs) (plusinf p) \<or>
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2102
      (\<exists>(t,k) \<in> set (uset p). \<exists>(s,l) \<in> set (uset p).
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2103
        Ifm (x#bs) (usubst p (Add (Mul l t) (Mul k s), 2 * k * l))))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2104
  (is "(\<exists>x. ?I x p) \<longleftrightarrow> ?M \<or> ?P \<or> ?F" is "?E = ?D")
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2105
proof
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2106
  assume px: "\<exists>x. ?I x p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2107
  consider "?M \<or> ?P" | "\<not> ?M" "\<not> ?P" by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2108
  then show ?D
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2109
  proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2110
    case 1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2111
    then show ?thesis by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2112
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2113
    case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2114
    let ?f = "\<lambda>(t,n). Inum (x # bs) t / real n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2115
    let ?N = "\<lambda>t. Inum (x # bs) t"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2116
    {
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2117
      fix t n s m
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2118
      assume "(t, n) \<in> set (uset p)" and "(s, m) \<in> set (uset p)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2119
      with uset_l[OF lp] have tnb: "numbound0 t"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2120
        and np: "real n > 0" and snb: "numbound0 s" and mp: "real m > 0"
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
  2121
        by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2122
      let ?st = "Add (Mul m t) (Mul n s)"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2123
      from np mp have mnp: "real (2 * n * m) > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2124
        by (simp add: mult.commute)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2125
      from tnb snb have st_nb: "numbound0 ?st"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2126
        by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2127
      have st: "(?N t / real n + ?N s / real m) / 2 = ?N ?st / real (2 * n * m)"
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32642
diff changeset
  2128
        using mnp mp np by (simp add: algebra_simps add_divide_distrib)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2129
      from usubst_I[OF lp mnp st_nb, where x="x" and bs="bs"]
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2130
      have "?I x (usubst p (?st, 2 * n * m)) = ?I ((?N t / real n + ?N s / real m) / 2) p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2131
        by (simp only: st[symmetric])
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2132
    }
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2133
    with rinf_uset[OF lp 2 px] have ?F
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2134
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2135
    then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2136
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2137
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2138
next
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2139
  assume ?D
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2140
  then consider ?M | ?P | t k s l where "(t, k) \<in> set (uset p)" "(s, l) \<in> set (uset p)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2141
    "?I x (usubst p (Add (Mul l t) (Mul k s), 2 * k * l))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2142
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2143
  then show ?E
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2144
  proof cases
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2145
    case 1
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2146
    from rminusinf_ex[OF lp this] show ?thesis .
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2147
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2148
    case 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2149
    from rplusinf_ex[OF lp this] show ?thesis .
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2150
  next
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2151
    case 3
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2152
    with uset_l[OF lp] have tnb: "numbound0 t" and np: "real k > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2153
      and snb: "numbound0 s" and mp: "real l > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2154
      by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2155
    let ?st = "Add (Mul l t) (Mul k s)"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2156
    from np mp have mnp: "real (2 * k * l) > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2157
      by (simp add: mult.commute)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2158
    from tnb snb have st_nb: "numbound0 ?st"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2159
      by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2160
    from usubst_I[OF lp mnp st_nb, where bs="bs"]
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2161
      \<open>?I x (usubst p (Add (Mul l t) (Mul k s), 2 * k * l))\<close> show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2162
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2163
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2164
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2165
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2166
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2167
    (* Implement the right hand side of Ferrante and Rackoff's Theorem. *)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2168
definition ferrack :: "fm \<Rightarrow> fm"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2169
where
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2170
  "ferrack p =
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2171
   (let
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2172
      p' = rlfm (simpfm p);
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2173
      mp = minusinf p';
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2174
      pp = plusinf p'
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2175
    in
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2176
      if mp = T \<or> pp = T then T
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2177
      else
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2178
       (let U = remdups (map simp_num_pair
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2179
         (map (\<lambda>((t,n),(s,m)). (Add (Mul m t) (Mul n s) , 2 * n * m))
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2180
               (alluopairs (uset p'))))
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2181
        in decr (disj mp (disj pp (evaldjf (simpfm \<circ> usubst p') U)))))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2182
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2183
lemma uset_cong_aux:
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2184
  assumes Ul: "\<forall>(t,n) \<in> set U. numbound0 t \<and> n > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2185
  shows "((\<lambda>(t,n). Inum (x # bs) t / real n) `
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2186
    (set (map (\<lambda>((t,n),(s,m)). (Add (Mul m t) (Mul n s), 2 * n * m)) (alluopairs U)))) =
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2187
    ((\<lambda>((t,n),(s,m)). (Inum (x # bs) t / real n + Inum (x # bs) s / real m) / 2) ` (set U \<times> set U))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2188
  (is "?lhs = ?rhs")
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2189
proof auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2190
  fix t n s m
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2191
  assume "((t, n), (s, m)) \<in> set (alluopairs U)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2192
  then have th: "((t, n), (s, m)) \<in> set U \<times> set U"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2193
    using alluopairs_set1[where xs="U"] by blast
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2194
  let ?N = "\<lambda>t. Inum (x # bs) t"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2195
  let ?st = "Add (Mul m t) (Mul n s)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2196
  from Ul th have mnz: "m \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2197
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2198
  from Ul th have nnz: "n \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2199
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2200
  have st: "(?N t / real n + ?N s / real m) / 2 = ?N ?st / real (2 * n * m)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2201
    using mnz nnz by (simp add: algebra_simps add_divide_distrib)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2202
  then show "(real m *  Inum (x # bs) t + real n * Inum (x # bs) s) / (2 * real n * real m)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2203
      \<in> (\<lambda>((t, n), s, m). (Inum (x # bs) t / real n + Inum (x # bs) s / real m) / 2) `
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2204
         (set U \<times> set U)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2205
    using mnz nnz th
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2206
    apply (auto simp add: th add_divide_distrib algebra_simps split_def image_def)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2207
    apply (rule_tac x="(s,m)" in bexI)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2208
    apply simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2209
    apply (rule_tac x="(t,n)" in bexI)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2210
    apply (simp_all add: mult.commute)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2211
    done
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2212
next
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2213
  fix t n s m
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2214
  assume tnU: "(t, n) \<in> set U" and smU: "(s, m) \<in> set U"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2215
  let ?N = "\<lambda>t. Inum (x # bs) t"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2216
  let ?st = "Add (Mul m t) (Mul n s)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2217
  from Ul smU have mnz: "m \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2218
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2219
  from Ul tnU have nnz: "n \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2220
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2221
  have st: "(?N t / real n + ?N s / real m) / 2 = ?N ?st / real (2 * n * m)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2222
    using mnz nnz by (simp add: algebra_simps add_divide_distrib)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2223
  let ?P = "\<lambda>(t',n') (s',m'). (Inum (x # bs) t / real n + Inum (x # bs) s / real m)/2 =
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2224
    (Inum (x # bs) t' / real n' + Inum (x # bs) s' / real m') / 2"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2225
  have Pc:"\<forall>a b. ?P a b = ?P b a"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2226
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2227
  from Ul alluopairs_set1 have Up:"\<forall>((t,n),(s,m)) \<in> set (alluopairs U). n \<noteq> 0 \<and> m \<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2228
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2229
  from alluopairs_ex[OF Pc, where xs="U"] tnU smU
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2230
  have th':"\<exists>((t',n'),(s',m')) \<in> set (alluopairs U). ?P (t',n') (s',m')"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2231
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2232
  then obtain t' n' s' m' where ts'_U: "((t',n'),(s',m')) \<in> set (alluopairs U)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2233
    and Pts': "?P (t', n') (s', m')"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2234
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2235
  from ts'_U Up have mnz': "m' \<noteq> 0" and nnz': "n'\<noteq> 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2236
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2237
  let ?st' = "Add (Mul m' t') (Mul n' s')"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2238
  have st': "(?N t' / real n' + ?N s' / real m') / 2 = ?N ?st' / real (2 * n' * m')"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2239
    using mnz' nnz' by (simp add: algebra_simps add_divide_distrib)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2240
  from Pts' have "(Inum (x # bs) t / real n + Inum (x # bs) s / real m) / 2 =
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2241
    (Inum (x # bs) t' / real n' + Inum (x # bs) s' / real m') / 2"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2242
    by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2243
  also have "\<dots> = (\<lambda>(t, n). Inum (x # bs) t / real n)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2244
      ((\<lambda>((t, n), s, m). (Add (Mul m t) (Mul n s), 2 * n * m)) ((t', n'), (s', m')))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2245
    by (simp add: st')
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2246
  finally show "(Inum (x # bs) t / real n + Inum (x # bs) s / real m) / 2
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2247
    \<in> (\<lambda>(t, n). Inum (x # bs) t / real n) `
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2248
      (\<lambda>((t, n), s, m). (Add (Mul m t) (Mul n s), 2 * n * m)) ` set (alluopairs U)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2249
    using ts'_U by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2250
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2251
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2252
lemma uset_cong:
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2253
  assumes lp: "isrlfm p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2254
    and UU': "((\<lambda>(t,n). Inum (x # bs) t / real n) ` U') =
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2255
      ((\<lambda>((t,n),(s,m)). (Inum (x # bs) t / real n + Inum (x # bs) s / real m) / 2) ` (U \<times> U))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2256
      (is "?f ` U' = ?g ` (U \<times> U)")
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2257
    and U: "\<forall>(t,n) \<in> U. numbound0 t \<and> n > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2258
    and U': "\<forall>(t,n) \<in> U'. numbound0 t \<and> n > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2259
  shows "(\<exists>(t,n) \<in> U. \<exists>(s,m) \<in> U. Ifm (x # bs) (usubst p (Add (Mul m t) (Mul n s), 2 * n * m))) =
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2260
    (\<exists>(t,n) \<in> U'. Ifm (x # bs) (usubst p (t, n)))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2261
    (is "?lhs \<longleftrightarrow> ?rhs")
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2262
proof
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2263
  show ?rhs if ?lhs
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2264
  proof -
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2265
    from that obtain t n s m where tnU: "(t, n) \<in> U" and smU: "(s, m) \<in> U"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2266
      and Pst: "Ifm (x # bs) (usubst p (Add (Mul m t) (Mul n s), 2 * n * m))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2267
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2268
    let ?N = "\<lambda>t. Inum (x#bs) t"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2269
    from tnU smU U have tnb: "numbound0 t" and np: "n > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2270
      and snb: "numbound0 s" and mp: "m > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2271
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2272
    let ?st = "Add (Mul m t) (Mul n s)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2273
    from np mp have mnp: "real (2 * n * m) > 0"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 56544
diff changeset
  2274
      by (simp add: mult.commute real_of_int_mult[symmetric] del: real_of_int_mult)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2275
    from tnb snb have stnb: "numbound0 ?st"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2276
      by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2277
    have st: "(?N t / real n + ?N s / real m) / 2 = ?N ?st / real (2 * n * m)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2278
      using mp np by (simp add: algebra_simps add_divide_distrib)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2279
    from tnU smU UU' have "?g ((t, n), (s, m)) \<in> ?f ` U'"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2280
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2281
    then have "\<exists>(t',n') \<in> U'. ?g ((t, n), (s, m)) = ?f (t', n')"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2282
      apply auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2283
      apply (rule_tac x="(a, b)" in bexI)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2284
      apply auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2285
      done
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2286
    then obtain t' n' where tnU': "(t',n') \<in> U'" and th: "?g ((t, n), (s, m)) = ?f (t', n')"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2287
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2288
    from U' tnU' have tnb': "numbound0 t'" and np': "real n' > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2289
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2290
    from usubst_I[OF lp mnp stnb, where bs="bs" and x="x"] Pst
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2291
    have Pst2: "Ifm (Inum (x # bs) (Add (Mul m t) (Mul n s)) / real (2 * n * m) # bs) p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2292
      by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2293
    from conjunct1[OF usubst_I[OF lp np' tnb', where bs="bs" and x="x"], symmetric]
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2294
      th[simplified split_def fst_conv snd_conv,symmetric] Pst2[simplified st[symmetric]]
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2295
    have "Ifm (x # bs) (usubst p (t', n'))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2296
      by (simp only: st)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2297
    then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2298
      using tnU' by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2299
  qed
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2300
  show ?lhs if ?rhs
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2301
  proof -
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2302
    from that obtain t' n' where tnU': "(t', n') \<in> U'" and Pt': "Ifm (x # bs) (usubst p (t', n'))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2303
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2304
    from tnU' UU' have "?f (t', n') \<in> ?g ` (U \<times> U)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2305
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2306
    then have "\<exists>((t,n),(s,m)) \<in> U \<times> U. ?f (t', n') = ?g ((t, n), (s, m))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2307
      apply auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2308
      apply (rule_tac x="(a,b)" in bexI)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2309
      apply auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2310
      done
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2311
    then obtain t n s m where tnU: "(t, n) \<in> U" and smU: "(s, m) \<in> U" and
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2312
      th: "?f (t', n') = ?g ((t, n), (s, m))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2313
      by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2314
    let ?N = "\<lambda>t. Inum (x # bs) t"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2315
    from tnU smU U have tnb: "numbound0 t" and np: "n > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2316
      and snb: "numbound0 s" and mp: "m > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2317
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2318
    let ?st = "Add (Mul m t) (Mul n s)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2319
    from np mp have mnp: "real (2 * n * m) > 0"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 56544
diff changeset
  2320
      by (simp add: mult.commute real_of_int_mult[symmetric] del: real_of_int_mult)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2321
    from tnb snb have stnb: "numbound0 ?st"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2322
      by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2323
    have st: "(?N t / real n + ?N s / real m) / 2 = ?N ?st / real (2 * n * m)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2324
      using mp np by (simp add: algebra_simps add_divide_distrib)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2325
    from U' tnU' have tnb': "numbound0 t'" and np': "real n' > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2326
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2327
    from usubst_I[OF lp np' tnb', where bs="bs" and x="x",simplified
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2328
      th[simplified split_def fst_conv snd_conv] st] Pt'
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2329
    have Pst2: "Ifm (Inum (x # bs) (Add (Mul m t) (Mul n s)) / real (2 * n * m) # bs) p"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2330
      by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2331
    with usubst_I[OF lp mnp stnb, where x="x" and bs="bs"] tnU smU
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2332
    show ?thesis by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2333
  qed
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2334
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2335
51143
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2336
lemma ferrack:
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2337
  assumes qf: "qfree p"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2338
  shows "qfree (ferrack p) \<and> (Ifm bs (ferrack p) \<longleftrightarrow> (\<exists>x. Ifm (x # bs) p))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2339
  (is "_ \<and> (?rhs \<longleftrightarrow> ?lhs)")
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2340
proof -
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2341
  let ?I = "\<lambda>x p. Ifm (x # bs) p"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2342
  fix x
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2343
  let ?N = "\<lambda>t. Inum (x # bs) t"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2344
  let ?q = "rlfm (simpfm p)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2345
  let ?U = "uset ?q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2346
  let ?Up = "alluopairs ?U"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2347
  let ?g = "\<lambda>((t,n),(s,m)). (Add (Mul m t) (Mul n s), 2 * n * m)"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2348
  let ?S = "map ?g ?Up"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2349
  let ?SS = "map simp_num_pair ?S"
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2350
  let ?Y = "remdups ?SS"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2351
  let ?f = "\<lambda>(t,n). ?N t / real n"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2352
  let ?h = "\<lambda>((t,n),(s,m)). (?N t / real n + ?N s / real m) / 2"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2353
  let ?F = "\<lambda>p. \<exists>a \<in> set (uset p). \<exists>b \<in> set (uset p). ?I x (usubst p (?g (a, b)))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2354
  let ?ep = "evaldjf (simpfm \<circ> (usubst ?q)) ?Y"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2355
  from rlfm_I[OF simpfm_qf[OF qf]] have lq: "isrlfm ?q"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2356
    by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2357
  from alluopairs_set1[where xs="?U"] have UpU: "set ?Up \<subseteq> set ?U \<times> set ?U"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2358
    by simp
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2359
  from uset_l[OF lq] have U_l: "\<forall>(t,n) \<in> set ?U. numbound0 t \<and> n > 0" .
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2360
  from U_l UpU
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2361
  have "\<forall>((t,n),(s,m)) \<in> set ?Up. numbound0 t \<and> n> 0 \<and> numbound0 s \<and> m > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2362
    by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2363
  then have Snb: "\<forall>(t,n) \<in> set ?S. numbound0 t \<and> n > 0 "
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2364
    by auto
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2365
  have Y_l: "\<forall>(t,n) \<in> set ?Y. numbound0 t \<and> n > 0"
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2366
  proof -
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2367
    have "numbound0 t \<and> n > 0" if tnY: "(t, n) \<in> set ?Y" for t n
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2368
    proof -
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2369
      from that have "(t,n) \<in> set ?SS"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2370
        by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2371
      then have "\<exists>(t',n') \<in> set ?S. simp_num_pair (t', n') = (t, n)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2372
        apply (auto simp add: split_def simp del: map_map)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2373
        apply (rule_tac x="((aa,ba),(ab,bb))" in bexI)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2374
        apply simp_all
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2375
        done
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2376
      then obtain t' n' where tn'S: "(t', n') \<in> set ?S" and tns: "simp_num_pair (t', n') = (t, n)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2377
        by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2378
      from tn'S Snb have tnb: "numbound0 t'" and np: "n' > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2379
        by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2380
      from simp_num_pair_l[OF tnb np tns] show ?thesis .
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2381
    qed
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2382
    then show ?thesis by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2383
  qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2384
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2385
  have YU: "(?f ` set ?Y) = (?h ` (set ?U \<times> set ?U))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2386
  proof -
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2387
    from simp_num_pair_ci[where bs="x#bs"] have "\<forall>x. (?f \<circ> simp_num_pair) x = ?f x"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2388
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2389
    then have th: "?f \<circ> simp_num_pair = ?f"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2390
      by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2391
    have "(?f ` set ?Y) = ((?f \<circ> simp_num_pair) ` set ?S)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2392
      by (simp add: comp_assoc image_comp)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2393
    also have "\<dots> = ?f ` set ?S"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2394
      by (simp add: th)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2395
    also have "\<dots> = (?f \<circ> ?g) ` set ?Up"
56154
f0a927235162 more complete set of lemmas wrt. image and composition
haftmann
parents: 55422
diff changeset
  2396
      by (simp only: set_map o_def image_comp)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2397
    also have "\<dots> = ?h ` (set ?U \<times> set ?U)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2398
      using uset_cong_aux[OF U_l, where x="x" and bs="bs", simplified set_map image_comp]
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2399
      by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2400
    finally show ?thesis .
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2401
  qed
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2402
  have "\<forall>(t,n) \<in> set ?Y. bound0 (simpfm (usubst ?q (t, n)))"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2403
  proof -
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2404
    have "bound0 (simpfm (usubst ?q (t, n)))" if tnY: "(t,n) \<in> set ?Y" for t n
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2405
    proof -
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2406
      from Y_l that have tnb: "numbound0 t" and np: "real n > 0"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2407
        by auto
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2408
      from usubst_I[OF lq np tnb] have "bound0 (usubst ?q (t, n))"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2409
        by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2410
      then show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2411
        using simpfm_bound0 by simp
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2412
    qed
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2413
    then show ?thesis by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2414
  qed
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2415
  then have ep_nb: "bound0 ?ep"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2416
    using evaldjf_bound0[where xs="?Y" and f="simpfm \<circ> (usubst ?q)"] by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2417
  let ?mp = "minusinf ?q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2418
  let ?pp = "plusinf ?q"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2419
  let ?M = "?I x ?mp"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2420
  let ?P = "?I x ?pp"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2421
  let ?res = "disj ?mp (disj ?pp ?ep)"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2422
  from rminusinf_bound0[OF lq] rplusinf_bound0[OF lq] ep_nb have nbth: "bound0 ?res"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2423
    by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2424
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2425
  from conjunct1[OF rlfm_I[OF simpfm_qf[OF qf]]] simpfm have th: "?lhs = (\<exists>x. ?I x ?q)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2426
    by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2427
  from th fr_equsubst[OF lq, where bs="bs" and x="x"] have lhfr: "?lhs = (?M \<or> ?P \<or> ?F ?q)"
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2428
    by (simp only: split_def fst_conv snd_conv)
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2429
  also have "\<dots> = (?M \<or> ?P \<or> (\<exists>(t,n) \<in> set ?Y. ?I x (simpfm (usubst ?q (t,n)))))"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2430
    using uset_cong[OF lq YU U_l Y_l] by (simp only: split_def fst_conv snd_conv simpfm)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2431
  also have "\<dots> = (Ifm (x#bs) ?res)"
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2432
    using evaldjf_ex[where ps="?Y" and bs = "x#bs" and f="simpfm \<circ> (usubst ?q)",symmetric]
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 60767
diff changeset
  2433
    by (simp add: split_def prod.collapse)
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2434
  finally have lheq: "?lhs = Ifm bs (decr ?res)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2435
    using decr[OF nbth] by blast
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2436
  then have lr: "?lhs = ?rhs"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2437
    unfolding ferrack_def Let_def
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2438
    by (cases "?mp = T \<or> ?pp = T", auto) (simp add: disj_def)+
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2439
  from decr_qf[OF nbth] have "qfree (ferrack p)"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2440
    by (auto simp add: Let_def ferrack_def)
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2441
  with lr show ?thesis
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2442
    by blast
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2443
qed
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2444
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2445
definition linrqe:: "fm \<Rightarrow> fm"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2446
  where "linrqe p = qelim (prep p) ferrack"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2447
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2448
theorem linrqe: "Ifm bs (linrqe p) = Ifm bs p \<and> qfree (linrqe p)"
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2449
  using ferrack qelim_ci prep
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2450
  unfolding linrqe_def by auto
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2451
60711
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2452
definition ferrack_test :: "unit \<Rightarrow> fm"
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2453
where
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2454
  "ferrack_test u =
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2455
    linrqe (A (A (Imp (Lt (Sub (Bound 1) (Bound 0)))
799044496769 tuned proofs;
wenzelm
parents: 60710
diff changeset
  2456
      (E (Eq (Sub (Add (Bound 0) (Bound 2)) (Bound 1)))))))"
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2457
60533
1e7ccd864b62 isabelle update_cartouches;
wenzelm
parents: 59621
diff changeset
  2458
ML_val \<open>@{code ferrack_test} ()\<close>
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2459
60533
1e7ccd864b62 isabelle update_cartouches;
wenzelm
parents: 59621
diff changeset
  2460
oracle linr_oracle = \<open>
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2461
let
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2462
51143
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2463
val mk_C = @{code C} o @{code int_of_integer};
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2464
val mk_Bound = @{code Bound} o @{code nat_of_integer};
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2465
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2466
fun num_of_term vs (Free vT) = mk_Bound (find_index (fn vT' => vT = vT') vs)
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2467
  | num_of_term vs @{term "real (0::int)"} = mk_C 0
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2468
  | num_of_term vs @{term "real (1::int)"} = mk_C 1
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2469
  | num_of_term vs @{term "0::real"} = mk_C 0
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2470
  | num_of_term vs @{term "1::real"} = mk_C 1
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2471
  | num_of_term vs (Bound i) = mk_Bound i
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2472
  | num_of_term vs (@{term "uminus :: real \<Rightarrow> real"} $ t') = @{code Neg} (num_of_term vs t')
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2473
  | num_of_term vs (@{term "op + :: real \<Rightarrow> real \<Rightarrow> real"} $ t1 $ t2) =
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2474
     @{code Add} (num_of_term vs t1, num_of_term vs t2)
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2475
  | num_of_term vs (@{term "op - :: real \<Rightarrow> real \<Rightarrow> real"} $ t1 $ t2) =
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2476
     @{code Sub} (num_of_term vs t1, num_of_term vs t2)
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2477
  | num_of_term vs (@{term "op * :: real \<Rightarrow> real \<Rightarrow> real"} $ t1 $ t2) = (case num_of_term vs t1
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2478
     of @{code C} i => @{code Mul} (i, num_of_term vs t2)
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2479
      | _ => error "num_of_term: unsupported multiplication")
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents: 46670
diff changeset
  2480
  | num_of_term vs (@{term "real :: int \<Rightarrow> real"} $ t') =
51143
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2481
     (mk_C (snd (HOLogic.dest_number t'))
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents: 46670
diff changeset
  2482
       handle TERM _ => error ("num_of_term: unknown term"))
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents: 46670
diff changeset
  2483
  | num_of_term vs t' =
51143
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2484
     (mk_C (snd (HOLogic.dest_number t'))
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents: 46670
diff changeset
  2485
       handle TERM _ => error ("num_of_term: unknown term"));
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2486
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2487
fun fm_of_term vs @{term True} = @{code T}
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2488
  | fm_of_term vs @{term False} = @{code F}
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2489
  | fm_of_term vs (@{term "op < :: real \<Rightarrow> real \<Rightarrow> bool"} $ t1 $ t2) =
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2490
      @{code Lt} (@{code Sub} (num_of_term vs t1, num_of_term vs t2))
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2491
  | fm_of_term vs (@{term "op \<le> :: real \<Rightarrow> real \<Rightarrow> bool"} $ t1 $ t2) =
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2492
      @{code Le} (@{code Sub} (num_of_term vs t1, num_of_term vs t2))
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2493
  | fm_of_term vs (@{term "op = :: real \<Rightarrow> real \<Rightarrow> bool"} $ t1 $ t2) =
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2494
      @{code Eq} (@{code Sub} (num_of_term vs t1, num_of_term vs t2))
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2495
  | fm_of_term vs (@{term "op \<longleftrightarrow> :: bool \<Rightarrow> bool \<Rightarrow> bool"} $ t1 $ t2) =
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2496
      @{code Iff} (fm_of_term vs t1, fm_of_term vs t2)
38795
848be46708dc formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
haftmann
parents: 38786
diff changeset
  2497
  | fm_of_term vs (@{term HOL.conj} $ t1 $ t2) = @{code And} (fm_of_term vs t1, fm_of_term vs t2)
848be46708dc formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
haftmann
parents: 38786
diff changeset
  2498
  | fm_of_term vs (@{term HOL.disj} $ t1 $ t2) = @{code Or} (fm_of_term vs t1, fm_of_term vs t2)
38786
e46e7a9cb622 formerly unnamed infix impliciation now named HOL.implies
haftmann
parents: 38558
diff changeset
  2499
  | fm_of_term vs (@{term HOL.implies} $ t1 $ t2) = @{code Imp} (fm_of_term vs t1, fm_of_term vs t2)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2500
  | fm_of_term vs (@{term "Not"} $ t') = @{code NOT} (fm_of_term vs t')
38558
32ad17fe2b9c tuned quotes
haftmann
parents: 38549
diff changeset
  2501
  | fm_of_term vs (Const (@{const_name Ex}, _) $ Abs (xn, xT, p)) =
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2502
      @{code E} (fm_of_term (("", dummyT) :: vs) p)
38558
32ad17fe2b9c tuned quotes
haftmann
parents: 38549
diff changeset
  2503
  | fm_of_term vs (Const (@{const_name All}, _) $ Abs (xn, xT, p)) =
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2504
      @{code A} (fm_of_term (("", dummyT) ::  vs) p)
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2505
  | fm_of_term vs t = error ("fm_of_term : unknown term " ^ Syntax.string_of_term @{context} t);
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2506
51143
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2507
fun term_of_num vs (@{code C} i) = @{term "real :: int \<Rightarrow> real"} $
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2508
      HOLogic.mk_number HOLogic.intT (@{code integer_of_int} i)
0a2371e7ced3 two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents: 49962
diff changeset
  2509
  | term_of_num vs (@{code Bound} n) = Free (nth vs (@{code integer_of_nat} n))
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2510
  | term_of_num vs (@{code Neg} t') = @{term "uminus :: real \<Rightarrow> real"} $ term_of_num vs t'
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2511
  | term_of_num vs (@{code Add} (t1, t2)) = @{term "op + :: real \<Rightarrow> real \<Rightarrow> real"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2512
      term_of_num vs t1 $ term_of_num vs t2
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2513
  | term_of_num vs (@{code Sub} (t1, t2)) = @{term "op - :: real \<Rightarrow> real \<Rightarrow> real"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2514
      term_of_num vs t1 $ term_of_num vs t2
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2515
  | term_of_num vs (@{code Mul} (i, t2)) = @{term "op * :: real \<Rightarrow> real \<Rightarrow> real"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2516
      term_of_num vs (@{code C} i) $ term_of_num vs t2
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2517
  | term_of_num vs (@{code CN} (n, i, t)) = term_of_num vs (@{code Add} (@{code Mul} (i, @{code Bound} n), t));
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2518
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2519
fun term_of_fm vs @{code T} = @{term True}
45740
132a3e1c0fe5 more antiquotations;
wenzelm
parents: 44779
diff changeset
  2520
  | term_of_fm vs @{code F} = @{term False}
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2521
  | term_of_fm vs (@{code Lt} t) = @{term "op < :: real \<Rightarrow> real \<Rightarrow> bool"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2522
      term_of_num vs t $ @{term "0::real"}
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2523
  | term_of_fm vs (@{code Le} t) = @{term "op \<le> :: real \<Rightarrow> real \<Rightarrow> bool"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2524
      term_of_num vs t $ @{term "0::real"}
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2525
  | term_of_fm vs (@{code Gt} t) = @{term "op < :: real \<Rightarrow> real \<Rightarrow> bool"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2526
      @{term "0::real"} $ term_of_num vs t
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2527
  | term_of_fm vs (@{code Ge} t) = @{term "op \<le> :: real \<Rightarrow> real \<Rightarrow> bool"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2528
      @{term "0::real"} $ term_of_num vs t
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2529
  | term_of_fm vs (@{code Eq} t) = @{term "op = :: real \<Rightarrow> real \<Rightarrow> bool"} $
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2530
      term_of_num vs t $ @{term "0::real"}
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2531
  | term_of_fm vs (@{code NEq} t) = term_of_fm vs (@{code NOT} (@{code Eq} t))
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2532
  | term_of_fm vs (@{code NOT} t') = HOLogic.Not $ term_of_fm vs t'
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2533
  | term_of_fm vs (@{code And} (t1, t2)) = HOLogic.conj $ term_of_fm vs t1 $ term_of_fm vs t2
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2534
  | term_of_fm vs (@{code Or} (t1, t2)) = HOLogic.disj $ term_of_fm vs t1 $ term_of_fm vs t2
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2535
  | term_of_fm vs (@{code Imp}  (t1, t2)) = HOLogic.imp $ term_of_fm vs t1 $ term_of_fm vs t2
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2536
  | term_of_fm vs (@{code Iff} (t1, t2)) = @{term "op \<longleftrightarrow> :: bool \<Rightarrow> bool \<Rightarrow> bool"} $
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2537
      term_of_fm vs t1 $ term_of_fm vs t2;
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2538
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2539
in fn (ctxt, t) =>
60710
07089a750d2a tuned proofs;
wenzelm
parents: 60533
diff changeset
  2540
  let
36853
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2541
    val vs = Term.add_frees t [];
c8e4102b08aa modernized specifications; tuned reification
haftmann
parents: 35416
diff changeset
  2542
    val t' = (term_of_fm vs o @{code linrqe} o fm_of_term vs) t;
59621
291934bac95e Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents: 59580
diff changeset
  2543
  in (Thm.cterm_of ctxt o HOLogic.mk_Trueprop o HOLogic.mk_eq) (t, t') end
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2544
end;
60533
1e7ccd864b62 isabelle update_cartouches;
wenzelm
parents: 59621
diff changeset
  2545
\<close>
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2546
48891
c0eafbd55de3 prefer ML_file over old uses;
wenzelm
parents: 47432
diff changeset
  2547
ML_file "ferrack_tac.ML"
47432
e1576d13e933 more standard method setup;
wenzelm
parents: 47142
diff changeset
  2548
60533
1e7ccd864b62 isabelle update_cartouches;
wenzelm
parents: 59621
diff changeset
  2549
method_setup rferrack = \<open>
53168
d998de7f0efc tuned signature;
wenzelm
parents: 51272
diff changeset
  2550
  Scan.lift (Args.mode "no_quantify") >>
47432
e1576d13e933 more standard method setup;
wenzelm
parents: 47142
diff changeset
  2551
    (fn q => fn ctxt => SIMPLE_METHOD' (Ferrack_Tac.linr_tac ctxt (not q)))
60533
1e7ccd864b62 isabelle update_cartouches;
wenzelm
parents: 59621
diff changeset
  2552
\<close> "decision procedure for linear real arithmetic"
47432
e1576d13e933 more standard method setup;
wenzelm
parents: 47142
diff changeset
  2553
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2554
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2555
lemma
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2556
  fixes x :: real
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2557
  shows "2 * x \<le> 2 * x \<and> 2 * x \<le> 2 * x + 1"
49070
f00fee6d21d4 tuned proofs;
wenzelm
parents: 48891
diff changeset
  2558
  by rferrack
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2559
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2560
lemma
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2561
  fixes x :: real
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2562
  shows "\<exists>y \<le> x. x = y + 1"
49070
f00fee6d21d4 tuned proofs;
wenzelm
parents: 48891
diff changeset
  2563
  by rferrack
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2564
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2565
lemma
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2566
  fixes x :: real
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2567
  shows "\<not> (\<exists>z. x + z = x + z + 1)"
49070
f00fee6d21d4 tuned proofs;
wenzelm
parents: 48891
diff changeset
  2568
  by rferrack
29789
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2569
b4534c3e68f6 established session HOL-Reflection
haftmann
parents:
diff changeset
  2570
end