src/HOL/Hyperreal/Poly.ML
author berghofe
Mon, 30 Sep 2002 16:14:02 +0200
changeset 13601 fd3e3d6b37b2
parent 12481 ea5d6da573c5
child 14266 08b34c902618
permissions -rw-r--r--
Adapted to new simplifier.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12224
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     1
(*  Title:       Poly.ML
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     2
    Author:      Jacques D. Fleuriot
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     3
    Copyright:   2000 University of Edinburgh
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     4
    Description: Properties of real polynomials following 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     5
                 John Harrison's HOL-Light implementation.
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     6
                 Some early theorems by Lucas Dixon
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     7
*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     8
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     9
Goal "p +++ [] = p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    10
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    11
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    12
qed "padd_Nil2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    13
Addsimps [padd_Nil2];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    14
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    15
Goal "(h1 # p1) +++ (h2 # p2) = (h1 + h2) # (p1 +++ p2)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    16
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    17
qed "padd_Cons_Cons";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    18
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    19
Goal "-- [] = []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    20
by (rewtac poly_minus_def);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    21
by (Auto_tac);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    22
qed "pminus_Nil";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    23
Addsimps [pminus_Nil];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    24
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    25
Goal "[h1] *** p1 = h1 %* p1";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    26
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    27
qed "pmult_singleton";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    28
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    29
Goal "1 %* t = t";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    30
by (induct_tac "t" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    31
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    32
qed "poly_ident_mult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    33
Addsimps [poly_ident_mult];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    34
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    35
Goal "[a] +++ ((0)#t) = (a#t)"; 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    36
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    37
qed "poly_simple_add_Cons";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    38
Addsimps [poly_simple_add_Cons];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    39
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    40
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    41
(*  Handy general properties                                               *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    42
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    43
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    44
Goal "b +++ a = a +++ b"; 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    45
by (subgoal_tac "ALL a. b +++ a = a +++ b" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    46
by (induct_tac "b" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    47
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    48
by (rtac (padd_Cons RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    49
by (case_tac "aa" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    50
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    51
qed "padd_commut";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    52
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    53
Goal "(a +++ b) +++ c = a +++ (b +++ c)"; 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    54
by (subgoal_tac "ALL b c. (a +++ b) +++ c = a +++ (b +++ c)" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    55
by (Asm_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    56
by (induct_tac "a" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    57
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    58
by (case_tac "b" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    59
by (Asm_simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    60
by (Asm_simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    61
by (Asm_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    62
qed "padd_assoc";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    63
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    64
Goal "a %* ( p +++ q ) = (a %* p +++ a %* q)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    65
by (subgoal_tac "ALL q. a %* ( p +++ q ) = (a %* p +++ a %* q) " 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    66
by (induct_tac "p" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    67
by (Simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    68
by (rtac allI 2 );
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    69
by (case_tac "q" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    70
by (Asm_simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    71
by (asm_simp_tac (simpset() addsimps [real_add_mult_distrib2] ) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    72
by (Asm_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    73
qed "poly_cmult_distr";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    74
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    75
Goal "[0, 1] *** t = ((0)#t)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    76
by (induct_tac "t" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    77
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    78
by (simp_tac (simpset() addsimps [poly_ident_mult, padd_commut]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    79
by (case_tac "list" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    80
by (Asm_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    81
by (asm_full_simp_tac (simpset() addsimps [poly_ident_mult, padd_commut]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    82
qed "pmult_by_x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    83
Addsimps [pmult_by_x];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    84
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    85
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    86
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    87
(*  properties of evaluation of polynomials.                               *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    88
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    89
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    90
Goal "poly (p1 +++ p2) x = poly p1 x + poly p2 x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    91
by (subgoal_tac "ALL p2. poly (p1 +++ p2) x = poly( p1 ) x + poly( p2 ) x" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    92
by (induct_tac "p1" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    93
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    94
by (case_tac "p2" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    95
by (auto_tac (claset(),simpset() addsimps [real_add_mult_distrib2]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    96
qed "poly_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    97
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    98
Goal "poly (c %* p) x = c * poly p x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    99
by (induct_tac "p" 1); 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   100
by (case_tac "x=0" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   101
by (auto_tac (claset(),simpset() addsimps [real_add_mult_distrib2] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   102
    @ real_mult_ac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   103
qed "poly_cmult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   104
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   105
Goalw [poly_minus_def] "poly (-- p) x = - (poly p x)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   106
by (auto_tac (claset(),simpset() addsimps [poly_cmult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   107
qed "poly_minus";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   108
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   109
Goal "poly (p1 *** p2) x = poly p1 x * poly p2 x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   110
by (subgoal_tac "ALL p2. poly (p1 *** p2) x = poly p1 x * poly p2 x" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   111
by (Asm_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   112
by (induct_tac "p1" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   113
by (auto_tac (claset(),simpset() addsimps [poly_cmult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   114
by (case_tac "list" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   115
by (auto_tac (claset(),simpset() addsimps [poly_cmult,poly_add,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   116
    real_add_mult_distrib,real_add_mult_distrib2] @ real_mult_ac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   117
qed "poly_mult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   118
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   119
Goal "poly (p %^ n) x = (poly p x) ^ n";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   120
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   121
by (auto_tac (claset(),simpset() addsimps [poly_cmult, poly_mult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   122
qed "poly_exp";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   123
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   124
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   125
(*  More Polynomial Evaluation Lemmas                                      *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   126
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   127
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   128
Goal "poly (a +++ []) x = poly a x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   129
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   130
qed "poly_add_rzero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   131
Addsimps [poly_add_rzero];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   132
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   133
Goal "poly ((a *** b) *** c) x = poly (a *** (b *** c)) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   134
by (simp_tac (simpset() addsimps [poly_mult,real_mult_assoc])  1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   135
qed "poly_mult_assoc";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   136
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   137
Goal "poly (p *** []) x = 0";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   138
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   139
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   140
qed "poly_mult_Nil2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   141
Addsimps [poly_mult_Nil2];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   142
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   143
Goal "poly (p %^ (n + d)) x = poly( p %^ n *** p %^ d ) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   144
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   145
by (auto_tac (claset(), simpset() addsimps [poly_mult,real_mult_assoc]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   146
qed "poly_exp_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   147
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   148
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   149
(*  The derivative                                                         *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   150
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   151
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   152
Goalw [pderiv_def] "pderiv [] = []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   153
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   154
qed "pderiv_Nil";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   155
Addsimps [pderiv_Nil];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   156
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   157
Goalw [pderiv_def] "pderiv [c] = []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   158
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   159
qed "pderiv_singleton";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   160
Addsimps [pderiv_singleton];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   161
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   162
Goalw [pderiv_def] "pderiv (h#t) = pderiv_aux 1 t";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   163
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   164
qed "pderiv_Cons";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   165
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   166
Goal "DERIV f x :> D ==> DERIV (%x. (f x) * c) x :> D * c";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   167
by (auto_tac (claset() addIs [DERIV_cmult,real_mult_commute RS subst],
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   168
    simpset() addsimps [real_mult_commute]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   169
qed "DERIV_cmult2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   170
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   171
Goal "DERIV (%x. x ^ Suc n) x :> real (Suc n) * (x ^ n)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   172
by (rtac lemma_DERIV_subst 1 THEN rtac DERIV_pow 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   173
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   174
qed "DERIV_pow2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   175
Addsimps [DERIV_pow2,DERIV_pow];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   176
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   177
Goal "ALL n. DERIV (%x. (x ^ (Suc n) * poly p x)) x :> \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   178
    \   x ^ n * poly (pderiv_aux (Suc n) p) x ";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   179
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   180
by (auto_tac (claset() addSIs [DERIV_add,DERIV_cmult2],simpset() addsimps 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   181
    [pderiv_def,real_add_mult_distrib2,real_mult_assoc RS sym] delsimps 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   182
    [realpow_Suc]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   183
by (rtac (real_mult_commute RS subst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   184
by (simp_tac (simpset() delsimps [realpow_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   185
by (asm_full_simp_tac (simpset() addsimps [real_mult_commute,realpow_Suc RS sym] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   186
    delsimps [realpow_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   187
qed "lemma_DERIV_poly1";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   188
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   189
Goal "DERIV (%x. (x ^ (Suc n) * poly p x)) x :> \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   190
    \   x ^ n * poly (pderiv_aux (Suc n) p) x ";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   191
by (simp_tac (simpset() addsimps [lemma_DERIV_poly1] delsimps [realpow_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   192
qed "lemma_DERIV_poly";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   193
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   194
Goal "DERIV f x :> D ==>  DERIV (%x. a + f x) x :> D";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   195
by (rtac lemma_DERIV_subst 1 THEN rtac DERIV_add 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   196
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   197
qed "DERIV_add_const";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   198
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   199
Goal "DERIV (%x. poly p x) x :> poly (pderiv p) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   200
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   201
by (auto_tac (claset(),simpset() addsimps [pderiv_Cons]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   202
by (rtac DERIV_add_const 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   203
by (rtac lemma_DERIV_subst 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   204
by (rtac (full_simplify (simpset()) 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   205
    (read_instantiate [("n","0")] lemma_DERIV_poly)) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   206
by (simp_tac (simpset() addsimps [CLAIM "1 = 1"]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   207
qed "poly_DERIV";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   208
Addsimps [poly_DERIV];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   209
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   210
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   211
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   212
(* Consequences of the derivative theorem above                            *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   213
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   214
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   215
Goalw [differentiable_def] "(%x. poly p x) differentiable x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   216
by (blast_tac (claset() addIs [poly_DERIV]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   217
qed "poly_differentiable";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   218
Addsimps [poly_differentiable];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   219
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   220
Goal "isCont (%x. poly p x) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   221
by (rtac (poly_DERIV RS DERIV_isCont) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   222
qed "poly_isCont";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   223
Addsimps [poly_isCont];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   224
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   225
Goal "[| a < b; poly p a < 0; 0 < poly p b |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   226
\     ==> EX x. a < x & x < b & (poly p x = 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   227
by (cut_inst_tac [("f","%x. poly p x"),("a","a"),("b","b"),("y","0")] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   228
    IVT_objl 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   229
by (auto_tac (claset(),simpset() addsimps [real_le_less]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   230
qed "poly_IVT_pos";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   231
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   232
Goal "[| a < b; 0 < poly p a; poly p b < 0 |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   233
\     ==> EX x. a < x & x < b & (poly p x = 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   234
by (blast_tac (claset() addIs [full_simplify (simpset() 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   235
    addsimps [poly_minus, rename_numerals real_minus_zero_less_iff2])
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   236
   (read_instantiate [("p","-- p")] poly_IVT_pos)]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   237
qed "poly_IVT_neg";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   238
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   239
Goal "a < b ==> \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   240
\    EX x. a < x & x < b & (poly p b - poly p a = (b - a) * poly (pderiv p) x)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   241
by (dres_inst_tac [("f","poly p")] MVT 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   242
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   243
by (res_inst_tac [("x","z")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   244
by (auto_tac (claset() addDs [ARITH_PROVE 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   245
    "[| a < z; z < b |] ==> (b - (a::real)) ~= 0"],simpset()
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   246
     addsimps [real_mult_left_cancel,poly_DERIV RS DERIV_unique]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   247
qed "poly_MVT";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   248
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   249
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   250
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   251
(*  Lemmas for Derivatives                                                 *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   252
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   253
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   254
Goal "ALL p2 n. poly (pderiv_aux n (p1 +++ p2)) x = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   255
    \           poly (pderiv_aux n p1 +++ pderiv_aux n p2) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   256
by (induct_tac "p1" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   257
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   258
by (case_tac "p2" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   259
by (auto_tac (claset(),simpset() addsimps [real_add_mult_distrib2]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   260
qed "lemma_poly_pderiv_aux_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   261
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   262
Goal "poly (pderiv_aux n (p1 +++ p2)) x = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   263
    \ poly (pderiv_aux n p1 +++ pderiv_aux n p2) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   264
by (simp_tac (simpset() addsimps [lemma_poly_pderiv_aux_add]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   265
qed "poly_pderiv_aux_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   266
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   267
Goal "ALL n. poly (pderiv_aux n (c %* p) ) x = poly (c %* pderiv_aux n p) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   268
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   269
by (auto_tac (claset(),simpset() addsimps [poly_cmult] @ real_mult_ac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   270
qed "lemma_poly_pderiv_aux_cmult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   271
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   272
Goal "poly (pderiv_aux n (c %* p) ) x = poly (c %* pderiv_aux n p) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   273
by (simp_tac (simpset() addsimps [lemma_poly_pderiv_aux_cmult]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   274
qed "poly_pderiv_aux_cmult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   275
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   276
Goalw [poly_minus_def]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   277
   "poly (pderiv_aux n (-- p)) x = poly (-- pderiv_aux n p) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   278
by (simp_tac (simpset() addsimps [poly_pderiv_aux_cmult]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   279
qed "poly_pderiv_aux_minus";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   280
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   281
Goal "ALL n. poly (pderiv_aux (Suc n) p) x = poly ((pderiv_aux n p) +++ p) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   282
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   283
by (auto_tac (claset(),simpset() addsimps [real_of_nat_Suc,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   284
    real_add_mult_distrib]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   285
qed "lemma_poly_pderiv_aux_mult1";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   286
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   287
Goal "poly (pderiv_aux (Suc n) p) x = poly ((pderiv_aux n p) +++ p) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   288
by (simp_tac (simpset() addsimps [lemma_poly_pderiv_aux_mult1]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   289
qed "lemma_poly_pderiv_aux_mult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   290
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   291
Goal "ALL q. poly (pderiv (p +++ q)) x = poly (pderiv p +++ pderiv q) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   292
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   293
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   294
by (case_tac "q" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   295
by (auto_tac (claset(),simpset() addsimps [poly_pderiv_aux_add,poly_add,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   296
    pderiv_def]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   297
qed "lemma_poly_pderiv_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   298
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   299
Goal "poly (pderiv (p +++ q)) x = poly (pderiv p +++ pderiv q) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   300
by (simp_tac (simpset() addsimps [lemma_poly_pderiv_add]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   301
qed "poly_pderiv_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   302
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   303
Goal "poly (pderiv (c %* p)) x = poly (c %* (pderiv p)) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   304
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   305
by (auto_tac (claset(),simpset() addsimps [poly_pderiv_aux_cmult,poly_cmult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   306
    pderiv_def]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   307
qed "poly_pderiv_cmult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   308
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   309
Goalw [poly_minus_def] "poly (pderiv (--p)) x = poly (--(pderiv p)) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   310
by (simp_tac (simpset() addsimps [poly_pderiv_cmult]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   311
qed "poly_pderiv_minus";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   312
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   313
Goalw [pderiv_def] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   314
   "poly (pderiv (h#t)) x = poly ((0 # (pderiv t)) +++ t) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   315
by (induct_tac "t" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   316
by (auto_tac (claset(),simpset() addsimps [poly_add,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   317
    lemma_poly_pderiv_aux_mult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   318
qed "lemma_poly_mult_pderiv";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   319
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   320
Goal "ALL q. poly (pderiv (p *** q)) x = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   321
\     poly (p *** (pderiv q) +++ q *** (pderiv p)) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   322
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   323
by (auto_tac (claset(),simpset() addsimps [poly_add,poly_cmult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   324
    poly_pderiv_cmult,poly_pderiv_add,poly_mult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   325
by (rtac (lemma_poly_mult_pderiv RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   326
by (rtac (lemma_poly_mult_pderiv RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   327
by (rtac (poly_add RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   328
by (rtac (poly_add RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   329
by (asm_simp_tac (simpset() addsimps [poly_mult,real_add_mult_distrib2] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   330
    @ real_add_ac @ real_mult_ac) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   331
qed "poly_pderiv_mult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   332
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   333
Goal "poly (pderiv (p %^ (Suc n))) x = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   334
    \    poly ((real (Suc n)) %* (p %^ n) *** pderiv p ) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   335
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   336
by (auto_tac (claset(),simpset() addsimps [poly_add,poly_pderiv_cmult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   337
    poly_cmult,poly_pderiv_mult,real_of_nat_zero,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   338
    real_of_nat_Suc,real_add_mult_distrib2,real_add_mult_distrib]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   339
    @ real_mult_ac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   340
qed "poly_pderiv_exp";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   341
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   342
Goal "poly (pderiv ([-a, 1] %^ (Suc n))) x = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   343
\     poly (real (Suc n) %* ([-a, 1] %^ n)) x";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   344
by (simp_tac (simpset() addsimps [poly_pderiv_exp,poly_mult] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   345
    delsimps [pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   346
by (simp_tac (simpset() addsimps [poly_cmult,pderiv_def]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   347
qed "poly_pderiv_exp_prime";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   348
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   349
(* ----------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   350
(* Key property that f(a) = 0 ==> (x - a) divides p(x).                    *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   351
(* ----------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   352
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   353
Goal "ALL h. EX q r. h#t = [r] +++ [-a, 1] *** q";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   354
by (induct_tac "t" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   355
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   356
by (res_inst_tac [("x","[]")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   357
by (res_inst_tac [("x","h")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   358
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   359
by (dres_inst_tac [("x","aa")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   360
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   361
by (res_inst_tac [("x","r#q")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   362
by (res_inst_tac [("x","a*r + h")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   363
by (case_tac "q" 1);
12481
ea5d6da573c5 mods due to reorienting and renaming of real_minus_mult_eq1/2
nipkow
parents: 12224
diff changeset
   364
by (Auto_tac);
12224
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   365
qed "lemma_poly_linear_rem";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   366
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   367
Goal "EX q r. h#t = [r] +++ [-a, 1] *** q";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   368
by (cut_inst_tac [("t","t"),("a","a")] lemma_poly_linear_rem 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   369
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   370
qed "poly_linear_rem";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   371
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   372
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   373
Goal "(poly p a = 0) = ((p = []) | (EX q. p = [-a, 1] *** q))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   374
by (auto_tac (claset(),simpset() addsimps [poly_add,poly_cmult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   375
    real_add_mult_distrib2]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   376
by (case_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   377
by (cut_inst_tac [("h","aa"),("t","list"),("a","a")] poly_linear_rem 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   378
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   379
by (case_tac "q" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   380
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   381
by (dres_inst_tac [("x","[]")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   382
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   383
by (auto_tac (claset(),simpset() addsimps [poly_add,poly_cmult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   384
    real_add_assoc]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   385
by (dres_inst_tac [("x","aa#lista")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   386
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   387
qed "poly_linear_divides";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   388
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   389
Goal "ALL h k a. length (k %* p +++  (h # (a %* p))) = Suc (length p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   390
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   391
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   392
qed "lemma_poly_length_mult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   393
Addsimps [lemma_poly_length_mult];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   394
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   395
Goal "ALL h k. length (k %* p +++  (h # p)) = Suc (length p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   396
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   397
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   398
qed "lemma_poly_length_mult2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   399
Addsimps [lemma_poly_length_mult2];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   400
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   401
Goal "length([-a ,1] *** q) = Suc (length q)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   402
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   403
qed "poly_length_mult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   404
Addsimps [poly_length_mult];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   405
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   406
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   407
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   408
(* Polynomial length                                                       *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   409
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   410
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   411
Goal "length (a %* p) = length p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   412
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   413
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   414
qed "poly_cmult_length";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   415
Addsimps [poly_cmult_length];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   416
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   417
Goal "length (p1 +++ p2) = (if (length( p1 ) < length( p2 )) \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   418
\   then (length( p2 )) else (length( p1) ))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   419
by (subgoal_tac "ALL p2. length (p1 +++ p2) = (if (length( p1 ) < \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   420
\   length( p2 )) then (length( p2 )) else (length( p1) ))" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   421
by (induct_tac "p1" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   422
by (Simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   423
by (Simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   424
by (Step_tac 2);  
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   425
by (Asm_full_simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   426
by (arith_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   427
by (Asm_full_simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   428
by (arith_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   429
by (induct_tac "p2" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   430
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   431
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   432
qed "poly_add_length";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   433
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   434
Goal "length([a,b] *** p) = Suc (length p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   435
by (asm_full_simp_tac (simpset() addsimps [poly_cmult_length, 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   436
    poly_add_length]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   437
qed "poly_root_mult_length";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   438
Addsimps [poly_root_mult_length];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   439
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   440
Goal "(poly (p *** q) x ~= poly [] x) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   441
\     (poly p x ~= poly [] x & poly q x ~= poly [] x)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   442
by (auto_tac (claset(),simpset() addsimps [poly_mult,rename_numerals
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   443
    real_mult_not_zero]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   444
qed "poly_mult_not_eq_poly_Nil";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   445
Addsimps [poly_mult_not_eq_poly_Nil];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   446
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   447
Goal "(poly (p *** q) x = 0) = (poly p x = 0 | poly q x = 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   448
by (auto_tac (claset() addDs [CLAIM "x * y = 0 ==> x = 0 | y = (0::real)"],
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   449
    simpset() addsimps [poly_mult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   450
qed "poly_mult_eq_zero_disj";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   451
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   452
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   453
(*  Normalisation Properties                                               *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   454
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   455
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   456
Goal "(pnormalize p = []) --> (poly p x = 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   457
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   458
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   459
qed "poly_normalized_nil";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   460
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   461
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   462
(*  A nontrivial polynomial of degree n has no more than n roots           *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   463
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   464
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   465
Goal 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   466
   "ALL p x. (poly p x ~= poly [] x & length p = n  \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   467
\   --> (EX i. ALL x. (poly p x = (0::real)) --> (EX m. (m <= n & x = i m))))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   468
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   469
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   470
by (rtac ccontr 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   471
by (subgoal_tac "EX a. poly p a = 0" 1 THEN Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   472
by (dtac (poly_linear_divides RS iffD1) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   473
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   474
by (dres_inst_tac [("x","q")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   475
by (dres_inst_tac [("x","x")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   476
by (asm_full_simp_tac (simpset() delsimps [poly_Nil,pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   477
by (etac exE 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   478
by (dres_inst_tac [("x","%m. if m = Suc n then a else i m")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   479
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   480
by (dtac (poly_mult_eq_zero_disj RS iffD1) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   481
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   482
by (dres_inst_tac [("x","Suc(length q)")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   483
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   484
by (dres_inst_tac [("x","xa")] spec 1 THEN Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   485
by (dres_inst_tac [("x","m")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   486
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   487
by (Blast_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   488
qed_spec_mp "poly_roots_index_lemma";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   489
bind_thm ("poly_roots_index_lemma2",conjI RS poly_roots_index_lemma);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   490
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   491
Goal "poly p x ~= poly [] x ==> \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   492
\     EX i. ALL x. (poly p x = 0) --> (EX n. n <= length p & x = i n)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   493
by (blast_tac (claset() addIs [poly_roots_index_lemma2]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   494
qed "poly_roots_index_length";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   495
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   496
Goal "poly p x ~= poly [] x ==> \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   497
\     EX N i. ALL x. (poly p x = 0) --> (EX n. (n::nat) < N & x = i n)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   498
by (dtac poly_roots_index_length 1 THEN Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   499
by (res_inst_tac [("x","Suc (length p)")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   500
by (res_inst_tac [("x","i")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   501
by (auto_tac (claset(),simpset() addsimps 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   502
    [ARITH_PROVE "(m < Suc n) = (m <= n)"]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   503
qed "poly_roots_finite_lemma";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   504
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   505
(* annoying proof *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   506
Goal "ALL P. (ALL x. P x --> (EX n. (n::nat) < N & x = (j::nat=>real) n)) \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   507
\     --> (EX a. ALL x. P x --> x < a)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   508
by (induct_tac "N" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   509
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   510
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   511
by (dres_inst_tac [("x","%z. P z & (z ~= (j::nat=>real) n)")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   512
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   513
by (dres_inst_tac [("x","x")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   514
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   515
by (res_inst_tac [("x","na")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   516
by (auto_tac (claset() addDs [ARITH_PROVE "na < Suc n ==> na = n | na < n"],
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   517
    simpset()));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   518
by (res_inst_tac [("x","abs a + abs(j n) + 1")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   519
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   520
by (dres_inst_tac [("x","x")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   521
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   522
by (dres_inst_tac [("x","j na")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   523
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   524
by (ALLGOALS(arith_tac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   525
qed_spec_mp "real_finite_lemma";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   526
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   527
Goal "(poly p ~= poly []) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   528
\     (EX N j. ALL x. poly p x = 0 --> (EX n. (n::nat) < N & x = j n))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   529
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   530
by (etac swap 1 THEN rtac ext 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   531
by (rtac ccontr 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   532
by (clarify_tac (claset() addSDs [poly_roots_finite_lemma]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   533
by (clarify_tac (claset() addSDs [real_finite_lemma]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   534
by (dres_inst_tac [("x","a")] fun_cong 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   535
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   536
qed "poly_roots_finite";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   537
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   538
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   539
(*  Entirety and Cancellation for polynomials                              *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   540
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   541
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   542
Goal "[| poly p ~= poly [] ; poly q ~= poly [] |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   543
\     ==>  poly (p *** q) ~= poly []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   544
by (auto_tac (claset(),simpset() addsimps [poly_roots_finite]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   545
by (res_inst_tac [("x","N + Na")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   546
by (res_inst_tac [("x","%n. if n < N then j n else ja (n - N)")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   547
by (auto_tac (claset(),simpset() addsimps [poly_mult_eq_zero_disj]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   548
by (flexflex_tac THEN rotate_tac 1 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   549
by (dtac spec 1 THEN Auto_tac);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   550
qed "poly_entire_lemma";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   551
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   552
Goal "(poly (p *** q) = poly []) = ((poly p = poly []) | (poly q = poly []))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   553
by (auto_tac (claset() addIs [ext] addDs [fun_cong],simpset() 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   554
    addsimps [poly_entire_lemma,poly_mult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   555
by (blast_tac (claset() addIs [ccontr] addDs [poly_entire_lemma,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   556
    poly_mult RS subst]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   557
qed "poly_entire";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   558
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   559
Goal "(poly (p *** q) ~= poly []) = ((poly p ~= poly []) & (poly q ~= poly []))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   560
by (asm_full_simp_tac (simpset() addsimps [poly_entire]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   561
qed "poly_entire_neg";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   562
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   563
Goal " (f = g) = (ALL x. f x = g x)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   564
by (auto_tac (claset() addSIs [ext],simpset()));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   565
qed "fun_eq";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   566
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   567
Goal "(poly (p +++ -- q) = poly []) = (poly p = poly q)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   568
by (auto_tac (claset(),simpset() addsimps [poly_add,poly_minus_def,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   569
    fun_eq,poly_cmult,ARITH_PROVE "(p + -q = 0) = (p = (q::real))"]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   570
qed "poly_add_minus_zero_iff";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   571
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   572
Goal "poly (p *** q +++ --(p *** r)) = poly (p *** (q +++ -- r))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   573
by (auto_tac (claset(),simpset() addsimps [poly_add,poly_minus_def,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   574
    fun_eq,poly_mult,poly_cmult,real_add_mult_distrib2]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   575
qed "poly_add_minus_mult_eq";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   576
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   577
Goal "(poly (p *** q) = poly (p *** r)) = (poly p = poly [] | poly q = poly r)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   578
by (res_inst_tac [("p1","p *** q")] (poly_add_minus_zero_iff RS subst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   579
by (auto_tac (claset() addIs [ext], simpset() addsimps [poly_add_minus_mult_eq,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   580
    poly_entire,poly_add_minus_zero_iff]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   581
qed "poly_mult_left_cancel";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   582
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   583
Goal "(x * y = 0) = (x = (0::real) | y = 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   584
by (auto_tac (claset() addDs [CLAIM "x * y = 0 ==> x = 0 | y = (0::real)"],
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   585
    simpset()));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   586
qed "real_mult_zero_disj_iff";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   587
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   588
Goal "(poly (p %^ n) = poly []) = (poly p = poly [] & n ~= 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   589
by (simp_tac (simpset() addsimps [fun_eq]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   590
by (rtac (CLAIM "((ALL x. P x) & Q) = (ALL x. P x & Q)" RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   591
by (rtac (CLAIM "f = g ==> (ALL x. f x) = (ALL x. g x)") 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   592
by (rtac ext 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   593
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   594
by (auto_tac (claset(),simpset() addsimps [poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   595
    real_mult_zero_disj_iff]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   596
qed "poly_exp_eq_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   597
Addsimps [poly_exp_eq_zero];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   598
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   599
Goal "poly [a,1] ~= poly []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   600
by (simp_tac (simpset() addsimps [fun_eq]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   601
by (res_inst_tac [("x","1 - a")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   602
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   603
qed "poly_prime_eq_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   604
Addsimps [poly_prime_eq_zero];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   605
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   606
Goal "(poly ([a, 1] %^ n) ~= poly [])";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   607
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   608
qed "poly_exp_prime_eq_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   609
Addsimps [poly_exp_prime_eq_zero];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   610
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   611
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   612
(*  A more constructive notion of polynomials being trivial                *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   613
(*-------------------------------------------------------------------------*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   614
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   615
Goal "poly (h # t) = poly [] ==> h = 0 & poly t = poly []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   616
by (asm_full_simp_tac (simpset() addsimps [fun_eq]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   617
by (case_tac "h = 0" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   618
by (dres_inst_tac [("x","0")] spec 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   619
by (rtac conjI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   620
by (rtac ((simplify (simpset()) (read_instantiate [("g","poly []")] fun_eq))
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   621
    RS iffD1) 2 THEN rtac ccontr 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   622
by (auto_tac (claset(),simpset() addsimps [poly_roots_finite,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   623
    real_mult_zero_disj_iff]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   624
by (dtac real_finite_lemma 1 THEN Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   625
by (REPEAT(dres_inst_tac [("x","abs a + 1")] spec 1));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   626
by (arith_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   627
qed "poly_zero_lemma";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   628
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   629
Goal "(poly p = poly []) = list_all (%c. c = 0) p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   630
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   631
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   632
by (rtac iffI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   633
by (dtac poly_zero_lemma 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   634
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   635
qed "poly_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   636
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   637
Addsimps [real_mult_zero_disj_iff];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   638
Goal "ALL n. (list_all (%c. c = 0) (pderiv_aux (Suc n) p) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   639
\     list_all (%c. c = 0) p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   640
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   641
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   642
qed_spec_mp "pderiv_aux_iszero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   643
Addsimps [pderiv_aux_iszero];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   644
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   645
Goal "(number_of n :: nat) ~= 0 \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   646
\     ==> (list_all (%c. c = 0) (pderiv_aux (number_of n) p) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   647
\     list_all (%c. c = 0) p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   648
by (res_inst_tac [("n1","number_of n"),("m1","0")] (less_imp_Suc_add RS exE) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   649
by (Force_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   650
by (res_inst_tac [("n1","0 + x")] (pderiv_aux_iszero RS subst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   651
by (asm_simp_tac (simpset() delsimps [pderiv_aux_iszero]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   652
qed "pderiv_aux_iszero_num";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   653
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   654
Goal "poly (pderiv p) = poly [] --> (EX h. poly p = poly [h])";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   655
by (asm_full_simp_tac (simpset() addsimps [poly_zero]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   656
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   657
by (Force_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   658
by (asm_full_simp_tac (simpset() addsimps [pderiv_Cons,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   659
    pderiv_aux_iszero_num] delsimps [poly_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   660
by (auto_tac (claset(),simpset() addsimps [poly_zero RS sym]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   661
qed_spec_mp "pderiv_iszero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   662
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   663
Goal "poly p = poly [] --> (poly (pderiv p) = poly [])";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   664
by (asm_full_simp_tac (simpset() addsimps [poly_zero]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   665
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   666
by (Force_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   667
by (asm_full_simp_tac (simpset() addsimps [pderiv_Cons,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   668
    pderiv_aux_iszero_num] delsimps [poly_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   669
qed "pderiv_zero_obj";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   670
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   671
Goal "poly p = poly [] ==> (poly (pderiv p) = poly [])";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   672
by (blast_tac (claset() addEs [pderiv_zero_obj RS impE]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   673
qed "pderiv_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   674
Addsimps [pderiv_zero];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   675
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   676
Goal "poly p = poly q ==> (poly (pderiv p) = poly (pderiv q))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   677
by (cut_inst_tac [("p","p +++ --q")] pderiv_zero_obj 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   678
by (auto_tac (claset() addIs [ ARITH_PROVE "x + - y = 0 ==> x = (y::real)"],
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   679
    simpset() addsimps [fun_eq,poly_add,poly_minus,poly_pderiv_add,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   680
    poly_pderiv_minus] delsimps [pderiv_zero]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   681
qed "poly_pderiv_welldef";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   682
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   683
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   684
(* Basics of divisibility.                                                   *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   685
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   686
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   687
Goal "([a, 1] divides (p *** q)) = ([a, 1] divides p | [a, 1] divides q)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   688
by (auto_tac (claset(),simpset() addsimps [divides_def,fun_eq,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   689
    poly_add,poly_cmult,real_add_mult_distrib RS sym]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   690
by (dres_inst_tac [("x","-a")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   691
by (auto_tac (claset(),simpset() addsimps [poly_linear_divides,poly_add,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   692
    poly_cmult,real_add_mult_distrib RS sym]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   693
by (res_inst_tac [("x","qa *** q")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   694
by (res_inst_tac [("x","p *** qa")] exI 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   695
by (auto_tac (claset(),simpset() addsimps [poly_add,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   696
    poly_cmult] @ real_mult_ac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   697
qed "poly_primes";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   698
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   699
Goalw [divides_def] "p divides p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   700
by (res_inst_tac [("x","[1]")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   701
by (auto_tac (claset(),simpset() addsimps [poly_mult,fun_eq]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   702
qed "poly_divides_refl";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   703
Addsimps [poly_divides_refl];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   704
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   705
Goalw [divides_def] "[| p divides q; q divides r |] ==> p divides r";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   706
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   707
by (res_inst_tac [("x","qa *** qaa")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   708
by (auto_tac (claset(),simpset() addsimps [poly_mult,fun_eq,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   709
    real_mult_assoc]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   710
qed "poly_divides_trans";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   711
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   712
Goal "(m::nat) <= n = (EX d. n = m + d)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   713
by (auto_tac (claset(),simpset() addsimps [le_eq_less_or_eq,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   714
    less_iff_Suc_add]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   715
qed "le_iff_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   716
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   717
Goal "m <= n ==> (p %^ m) divides (p %^ n)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   718
by (auto_tac (claset(),simpset() addsimps [le_iff_add]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   719
by (induct_tac "d" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   720
by (rtac poly_divides_trans 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   721
by (auto_tac (claset(),simpset() addsimps [divides_def]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   722
by (res_inst_tac [("x","p")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   723
by (auto_tac (claset(),simpset() addsimps [poly_mult,fun_eq]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   724
    @ real_mult_ac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   725
qed "poly_divides_exp";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   726
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   727
Goal "[| (p %^ n) divides q;  m <= n |] ==> (p %^ m) divides q";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   728
by (blast_tac (claset() addIs [poly_divides_exp,poly_divides_trans]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   729
qed "poly_exp_divides";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   730
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   731
Goalw [divides_def] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   732
   "[| p divides q; p divides r |] ==> p divides (q +++ r)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   733
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   734
by (res_inst_tac [("x","qa +++ qaa")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   735
by (auto_tac (claset(),simpset() addsimps [poly_add,fun_eq,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   736
    real_add_mult_distrib2]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   737
qed "poly_divides_add";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   738
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   739
Goalw [divides_def] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   740
   "[| p divides q; p divides (q +++ r) |] ==> p divides r";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   741
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   742
by (res_inst_tac [("x","qaa +++ -- qa")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   743
by (auto_tac (claset(),simpset() addsimps [poly_add,fun_eq,poly_mult,
12481
ea5d6da573c5 mods due to reorienting and renaming of real_minus_mult_eq1/2
nipkow
parents: 12224
diff changeset
   744
    poly_minus,real_add_mult_distrib2,
12224
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   745
    ARITH_PROVE "(x = y + -z) = (z + x = (y::real))"]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   746
qed "poly_divides_diff";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   747
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   748
Goal "[| p divides r; p divides (q +++ r) |] ==> p divides q";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   749
by (etac poly_divides_diff 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   750
by (auto_tac (claset(),simpset() addsimps [poly_add,fun_eq,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   751
    divides_def] @ real_add_ac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   752
qed "poly_divides_diff2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   753
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   754
Goalw [divides_def] "poly p = poly [] ==> q divides p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   755
by (auto_tac (claset(),simpset() addsimps [fun_eq,poly_mult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   756
qed "poly_divides_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   757
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   758
Goalw [divides_def] "q divides []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   759
by (res_inst_tac [("x","[]")] exI 1); 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   760
by (auto_tac (claset(),simpset() addsimps [fun_eq]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   761
qed "poly_divides_zero2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   762
Addsimps [poly_divides_zero2];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   763
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   764
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   765
(* At last, we can consider the order of a root.                             *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   766
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   767
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   768
(* FIXME: Tidy up *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   769
Goal "[| length p = d; poly p ~= poly [] |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   770
\     ==> EX n. ([-a, 1] %^ n) divides p & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   771
\               ~(([-a, 1] %^ (Suc n)) divides p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   772
by (subgoal_tac "ALL p. length p = d & poly p ~= poly [] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   773
\     --> (EX n q. p = mulexp n [-a, 1] q & poly q a ~= 0)" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   774
by (induct_tac "d" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   775
by (asm_full_simp_tac (simpset() addsimps [fun_eq]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   776
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   777
by (case_tac "poly pa a = 0" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   778
by (dtac (poly_linear_divides RS iffD1) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   779
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   780
by (dres_inst_tac [("x","q")] spec 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   781
by (dtac (poly_entire_neg RS iffD1) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   782
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   783
by (Force_tac 2 THEN Blast_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   784
by (res_inst_tac [("x","Suc na")] exI 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   785
by (res_inst_tac [("x","qa")] exI 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   786
by (asm_full_simp_tac (simpset() delsimps [pmult_Cons]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   787
by (res_inst_tac [("x","0")] exI 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   788
by (Force_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   789
by (dres_inst_tac [("x","p")] spec 1 THEN Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   790
by (res_inst_tac [("x","n")] exI 1 THEN Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   791
by (rewtac divides_def);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   792
by (res_inst_tac [("x","q")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   793
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   794
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   795
by (asm_simp_tac (simpset() addsimps [poly_add,poly_cmult,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   796
    real_add_mult_distrib2] @ real_mult_ac) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   797
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   798
by (rotate_tac 2 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   799
by (rtac swap 1 THEN assume_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   800
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   801
by (asm_full_simp_tac (simpset() delsimps [pmult_Cons,pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   802
by (eres_inst_tac [("Pa","poly q a = 0")] swap 1);
12481
ea5d6da573c5 mods due to reorienting and renaming of real_minus_mult_eq1/2
nipkow
parents: 12224
diff changeset
   803
by (asm_full_simp_tac (simpset() addsimps [poly_add,poly_cmult]) 1);
12224
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   804
by (rtac (pexp_Suc RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   805
by (rtac ccontr 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   806
by (asm_full_simp_tac (simpset() addsimps [poly_mult_left_cancel,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   807
    poly_mult_assoc] delsimps [pmult_Cons,pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   808
qed "poly_order_exists";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   809
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   810
Goalw [divides_def] "[1] divides p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   811
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   812
qed "poly_one_divides";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   813
Addsimps [poly_one_divides];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   814
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   815
Goal "poly p ~= poly [] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   816
\     ==> EX! n. ([-a, 1] %^ n) divides p & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   817
\                ~(([-a, 1] %^ (Suc n)) divides p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   818
by (auto_tac (claset() addIs [poly_order_exists],
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   819
    simpset() addsimps [less_linear] delsimps [pmult_Cons,pexp_Suc]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   820
by (cut_inst_tac [("m","y"),("n","n")] less_linear 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   821
by (dres_inst_tac [("m","n")] poly_exp_divides 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   822
by (auto_tac (claset() addDs [ARITH_PROVE "n < m ==> Suc n <= m" RSN  
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   823
    (2,poly_exp_divides)],simpset() delsimps [pmult_Cons,pexp_Suc]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   824
qed "poly_order";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   825
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   826
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   827
(* Order                                                                     *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   828
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   829
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   830
Goal "[| n = (@n. P n); EX! n. P n |] ==> P n";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   831
by (blast_tac (claset() addIs [someI2]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   832
qed "some1_equalityD";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   833
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   834
Goalw [order_def]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   835
      "(([-a, 1] %^ n) divides p & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   836
\       ~(([-a, 1] %^ (Suc n)) divides p)) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   837
\       ((n = order a p) & ~(poly p = poly []))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   838
by (rtac iffI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   839
by (blast_tac (claset() addDs [poly_divides_zero] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   840
    addSIs [some1_equality RS sym, poly_order]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   841
by (blast_tac (claset() addSIs [poly_order RSN (2,some1_equalityD)]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   842
qed "order";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   843
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   844
Goal "[| poly p ~= poly [] |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   845
\     ==> ([-a, 1] %^ (order a p)) divides p & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   846
\             ~(([-a, 1] %^ (Suc(order a p))) divides p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   847
by (asm_full_simp_tac (simpset() addsimps [order] delsimps [pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   848
qed "order2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   849
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   850
Goal "[| poly p ~= poly []; ([-a, 1] %^ n) divides p; \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   851
\        ~(([-a, 1] %^ (Suc n)) divides p) \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   852
\     |] ==> (n = order a p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   853
by (cut_inst_tac [("p","p"),("a","a"),("n","n")] order 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   854
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   855
qed "order_unique";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   856
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   857
Goal "(poly p ~= poly [] & ([-a, 1] %^ n) divides p & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   858
\        ~(([-a, 1] %^ (Suc n)) divides p)) \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   859
\     ==> (n = order a p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   860
by (blast_tac (claset() addIs [order_unique]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   861
qed "order_unique_lemma";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   862
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   863
Goal "poly p = poly q ==> order a p = order a q";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   864
by (auto_tac (claset(),simpset() addsimps [fun_eq,divides_def,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   865
    order_def]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   866
qed "order_poly";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   867
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   868
Goal "p %^ (Suc 0) = p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   869
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   870
by (auto_tac (claset(),simpset() addsimps [numeral_1_eq_1]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   871
qed "pexp_one";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   872
Addsimps [pexp_one];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   873
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   874
Goal "ALL p a. 0 < n & [- a, 1] %^ n divides p & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   875
\            ~ [- a, 1] %^ (Suc n) divides p \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   876
\            --> poly p a = 0";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   877
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   878
by (Blast_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   879
by (auto_tac (claset(),simpset() addsimps [divides_def,poly_mult] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   880
    delsimps [pmult_Cons]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   881
qed_spec_mp "lemma_order_root";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   882
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   883
Goal "(poly p a = 0) = ((poly p = poly []) | order a p ~= 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   884
by (case_tac "poly p = poly []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   885
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   886
by (asm_full_simp_tac (simpset() addsimps [poly_linear_divides]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   887
    delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   888
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   889
by (ALLGOALS(dres_inst_tac [("a","a")] order2));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   890
by (rtac ccontr 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   891
by (asm_full_simp_tac (simpset() addsimps [divides_def,poly_mult,fun_eq]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   892
    delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   893
by (Blast_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   894
by (blast_tac (claset() addIs [lemma_order_root]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   895
qed "order_root";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   896
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   897
Goal "(([-a, 1] %^ n) divides p) = ((poly p = poly []) | n <= order a p)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   898
by (case_tac "poly p = poly []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   899
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   900
by (asm_full_simp_tac (simpset() addsimps [divides_def,fun_eq,poly_mult]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   901
by (res_inst_tac [("x","[]")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   902
by (TRYALL(dres_inst_tac [("a","a")] order2));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   903
by (auto_tac (claset() addIs [poly_exp_divides],simpset()
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   904
    delsimps [pexp_Suc]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   905
qed "order_divides";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   906
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   907
Goalw [divides_def] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   908
     "poly p ~= poly [] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   909
\     ==> EX q. (poly p = poly (([-a, 1] %^ (order a p)) *** q)) & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   910
\               ~([-a, 1] divides q)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   911
by (dres_inst_tac [("a","a")] order2 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   912
by (asm_full_simp_tac (simpset() addsimps [divides_def]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   913
     delsimps [pexp_Suc,pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   914
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   915
by (res_inst_tac [("x","q")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   916
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   917
by (dres_inst_tac [("x","qa")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   918
by (auto_tac (claset(),simpset() addsimps [poly_mult,fun_eq,poly_exp] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   919
    @ real_mult_ac delsimps [pmult_Cons]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   920
qed "order_decomp";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   921
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   922
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   923
(* Important composition properties of orders.                               *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   924
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   925
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   926
Goal "poly (p *** q) ~= poly [] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   927
\     ==> order a (p *** q) = order a p + order a q";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   928
by (cut_inst_tac [("a","a"),("p","p***q"),("n","order a p + order a q")] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   929
    order 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   930
by (auto_tac (claset(),simpset() addsimps [poly_entire] delsimps [pmult_Cons]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   931
by (REPEAT(dres_inst_tac [("a","a")] order2 1));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   932
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   933
by (asm_full_simp_tac (simpset() addsimps [divides_def,fun_eq,poly_exp_add,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   934
    poly_mult] delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   935
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   936
by (res_inst_tac [("x","qa *** qaa")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   937
by (asm_full_simp_tac (simpset() addsimps [poly_mult] @ real_mult_ac
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   938
    delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   939
by (REPEAT(dres_inst_tac [("a","a")] order_decomp 1));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   940
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   941
by (subgoal_tac "[-a,1] divides (qa *** qaa)" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   942
by (asm_full_simp_tac (simpset() addsimps [poly_primes] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   943
    delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   944
by (auto_tac (claset(),simpset() addsimps [divides_def] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   945
    delsimps [pmult_Cons]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   946
by (res_inst_tac [("x","qb")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   947
by (subgoal_tac "poly ([-a, 1] %^ (order a p) *** (qa *** qaa)) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   948
\                poly ([-a, 1] %^ (order a p) *** ([-a, 1] *** qb))" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   949
by (dtac (poly_mult_left_cancel RS iffD1) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   950
by (Force_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   951
by (subgoal_tac "poly ([-a, 1] %^ (order a q) *** \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   952
\                      ([-a, 1] %^ (order a p) *** (qa *** qaa))) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   953
\                poly ([-a, 1] %^ (order a q) *** \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   954
\                      ([-a, 1] %^ (order a p) *** ([-a, 1] *** qb)))" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   955
by (dtac (poly_mult_left_cancel RS iffD1) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   956
by (Force_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   957
by (asm_full_simp_tac (simpset() addsimps [fun_eq,poly_exp_add,poly_mult] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   958
    @ real_mult_ac delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   959
qed "order_mult";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   960
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   961
(* FIXME: too too long! *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   962
Goal "ALL p q a. 0 < n &  \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   963
\      poly (pderiv p) ~= poly [] & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   964
\      poly p = poly ([- a, 1] %^ n *** q) & ~ [- a, 1] divides q \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   965
\      --> n = Suc (order a (pderiv p))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   966
by (induct_tac "n" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   967
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   968
by (rtac order_unique_lemma 1 THEN rtac conjI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   969
by (assume_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   970
by (subgoal_tac "ALL r. r divides (pderiv p) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   971
\                       r divides (pderiv ([-a, 1] %^ Suc n *** q))" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   972
by (dtac poly_pderiv_welldef 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   973
by (asm_full_simp_tac (simpset() addsimps [divides_def] delsimps [pmult_Cons,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   974
    pexp_Suc]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   975
by (asm_full_simp_tac (simpset() delsimps [pmult_Cons,pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   976
by (rtac conjI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   977
by (asm_full_simp_tac (simpset() addsimps [divides_def,fun_eq] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   978
    delsimps [pmult_Cons,pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   979
by (res_inst_tac 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   980
    [("x","[-a, 1] *** (pderiv q) +++ real (Suc n) %* q")] exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   981
by (asm_full_simp_tac (simpset() addsimps [poly_pderiv_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   982
    poly_pderiv_exp_prime,poly_add,poly_mult,poly_cmult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   983
    real_add_mult_distrib2] @ real_mult_ac
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   984
    delsimps [pmult_Cons,pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   985
by (asm_full_simp_tac (simpset() addsimps [poly_mult,real_add_mult_distrib2,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   986
    real_add_mult_distrib] @ real_mult_ac delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   987
by (thin_tac "ALL r. \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   988
\             r divides pderiv p = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   989
\             r divides pderiv ([- a, 1] %^ Suc n *** q)" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   990
by (rewtac divides_def);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   991
by (simp_tac (simpset() addsimps [poly_pderiv_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   992
    poly_pderiv_exp_prime,fun_eq,poly_add,poly_mult] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   993
    delsimps [pmult_Cons,pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   994
by (rtac swap 1 THEN assume_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   995
by (rotate_tac  3 1 THEN etac swap 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   996
by (asm_full_simp_tac (simpset() delsimps [pmult_Cons,pexp_Suc]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   997
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   998
by (res_inst_tac [("x","inverse(real (Suc n)) %* (qa +++ --(pderiv q))")]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   999
    exI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1000
by (subgoal_tac "poly ([-a, 1] %^ n *** q) = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1001
\         poly ([-a, 1] %^ n *** ([-a, 1] *** (inverse (real (Suc n)) %* \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1002
\         (qa +++ -- (pderiv q)))))" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1003
by (dtac (poly_mult_left_cancel RS iffD1) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1004
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1005
by (asm_full_simp_tac (simpset() addsimps [fun_eq,poly_mult,poly_add,poly_cmult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1006
    poly_minus] delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1007
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1008
by (res_inst_tac [("c1","real (Suc n)")] (real_mult_left_cancel 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1009
    RS iffD1) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1010
by (Simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1011
by (rtac ((CLAIM_SIMP 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1012
    "a * (b * (c * (d * e))) = e * (b * (c * (d * (a::real))))" 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1013
     real_mult_ac) RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1014
by (rotate_tac 2 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1015
by (dres_inst_tac [("x","xa")] spec 1);
12481
ea5d6da573c5 mods due to reorienting and renaming of real_minus_mult_eq1/2
nipkow
parents: 12224
diff changeset
  1016
by (asm_full_simp_tac (simpset()
ea5d6da573c5 mods due to reorienting and renaming of real_minus_mult_eq1/2
nipkow
parents: 12224
diff changeset
  1017
    addsimps [real_add_mult_distrib] @ real_mult_ac
12224
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1018
    delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1019
qed_spec_mp "lemma_order_pderiv";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1020
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1021
Goal "[| poly (pderiv p) ~= poly []; order a p ~= 0 |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1022
\     ==> (order a p = Suc (order a (pderiv p)))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1023
by (case_tac "poly p = poly []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1024
by (auto_tac (claset() addDs [pderiv_zero],simpset()));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1025
by (dres_inst_tac [("a","a"),("p","p")] order_decomp 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1026
by (blast_tac (claset() addIs [lemma_order_pderiv]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1027
qed "order_pderiv";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1028
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1029
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1030
(* Now justify the standard squarefree decomposition, i.e. f / gcd(f,f').    *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1031
(* `a la Harrison                                                            *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1032
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1033
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1034
Goal "[| poly (pderiv p) ~= poly []; \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1035
\        poly p = poly (q *** d); \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1036
\        poly (pderiv p) = poly (e *** d); \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1037
\        poly d = poly (r *** p +++ s *** pderiv p) \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1038
\     |] ==> order a q = (if order a p = 0 then 0 else 1)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1039
by (subgoal_tac "order a p = order a q + order a d" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1040
by (res_inst_tac [("s","order a (q *** d)")] trans 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1041
by (blast_tac (claset() addIs [order_poly]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1042
by (rtac order_mult 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1043
by (rtac notI 2 THEN Asm_full_simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1044
by (case_tac "order a p = 0" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1045
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1046
by (subgoal_tac "order a (pderiv p) = order a e + order a d" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1047
by (res_inst_tac [("s","order a (e *** d)")] trans 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1048
by (blast_tac (claset() addIs [order_poly]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1049
by (rtac order_mult 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1050
by (rtac notI 2 THEN Asm_full_simp_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1051
by (case_tac "poly p = poly []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1052
by (dres_inst_tac [("p","p")] pderiv_zero 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1053
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1054
by (dtac order_pderiv 1 THEN assume_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1055
by (subgoal_tac "order a (pderiv p) <= order a d" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1056
by (subgoal_tac "([-a, 1] %^ (order a (pderiv p))) divides d" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1057
by (asm_full_simp_tac (simpset() addsimps [poly_entire,order_divides]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1058
by (subgoal_tac "([-a, 1] %^ (order a (pderiv p))) divides p & \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1059
\       ([-a, 1] %^ (order a (pderiv p))) divides (pderiv p)" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1060
by (asm_simp_tac (simpset() addsimps [order_divides]) 3);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1061
by (asm_full_simp_tac (simpset() addsimps [divides_def]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1062
    delsimps [pexp_Suc,pmult_Cons]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1063
by (Step_tac 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1064
by (res_inst_tac [("x","r *** qa +++ s *** qaa")] exI 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1065
by (asm_full_simp_tac (simpset() addsimps [fun_eq,poly_add,poly_mult,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1066
    real_add_mult_distrib, real_add_mult_distrib2] @ real_mult_ac
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1067
    delsimps [pexp_Suc,pmult_Cons]) 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1068
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1069
qed "poly_squarefree_decomp_order";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1070
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1071
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1072
Goal "[| poly (pderiv p) ~= poly []; \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1073
\        poly p = poly (q *** d); \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1074
\        poly (pderiv p) = poly (e *** d); \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1075
\        poly d = poly (r *** p +++ s *** pderiv p) \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1076
\     |] ==> ALL a. order a q = (if order a p = 0 then 0 else 1)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1077
by (blast_tac (claset() addIs [poly_squarefree_decomp_order]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1078
qed "poly_squarefree_decomp_order2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1079
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1080
Goal "poly p ~= poly [] ==> (poly p a = 0) = (order a p ~= 0)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1081
by (rtac (order_root RS ssubst) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1082
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1083
qed "order_root2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1084
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1085
Goal "[| poly (pderiv p) ~= poly []; order a p ~= 0 |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1086
\     ==> (order a (pderiv p) = n) = (order a p = Suc n)";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1087
by (auto_tac (claset() addDs [order_pderiv],simpset()));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1088
qed "order_pderiv2";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1089
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1090
Goalw [rsquarefree_def]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1091
  "rsquarefree p = (ALL a. ~(poly p a = 0 & poly (pderiv p) a = 0))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1092
by (case_tac "poly p = poly []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1093
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1094
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1095
by (case_tac "poly (pderiv p) = poly []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1096
by (Asm_full_simp_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1097
by (dtac pderiv_iszero 1 THEN Clarify_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1098
by (subgoal_tac "ALL a. order a p = order a [h]" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1099
by (asm_full_simp_tac (simpset() addsimps [fun_eq]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1100
by (rtac allI 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1101
by (cut_inst_tac [("p","[h]"),("a","a")] order_root 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1102
by (asm_full_simp_tac (simpset() addsimps [fun_eq]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1103
by (blast_tac (claset() addIs [order_poly]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1104
by (auto_tac (claset(),simpset() addsimps [order_root,order_pderiv2]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1105
by (dtac spec 1 THEN Auto_tac);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1106
qed "rsquarefree_roots";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1107
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1108
Goal "[1] *** p = p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1109
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1110
qed "pmult_one";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1111
Addsimps [pmult_one];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1112
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1113
Goal "poly [] = poly [0]";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1114
by (simp_tac (simpset() addsimps [fun_eq]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1115
qed "poly_Nil_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1116
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1117
Goalw [rsquarefree_def]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1118
     "[| rsquarefree p; poly p a = 0 |] \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1119
\     ==> EX q. (poly p = poly ([-a, 1] *** q)) & poly q a ~= 0";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1120
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1121
by (forw_inst_tac [("a","a")] order_decomp 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1122
by (dres_inst_tac [("x","a")] spec 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1123
by (dres_inst_tac [("a1","a")] (order_root2 RS sym) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1124
by (auto_tac (claset(),simpset() delsimps [pmult_Cons]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1125
by (res_inst_tac [("x","q")] exI 1 THEN Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1126
by (asm_full_simp_tac (simpset() addsimps [poly_mult,fun_eq]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1127
by (dres_inst_tac [("p1","q")] (poly_linear_divides RS iffD1) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1128
by (asm_full_simp_tac (simpset() addsimps [divides_def]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1129
    delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1130
by (Step_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1131
by (dres_inst_tac [("x","[]")] spec 1); 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1132
by (auto_tac (claset(),simpset() addsimps [fun_eq]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1133
qed "rsquarefree_decomp";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1134
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1135
Goal "[| poly (pderiv p) ~= poly []; \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1136
\        poly p = poly (q *** d); \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1137
\        poly (pderiv p) = poly (e *** d); \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1138
\        poly d = poly (r *** p +++ s *** pderiv p) \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1139
\     |] ==> rsquarefree q & (ALL a. (poly q a = 0) = (poly p a = 0))";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1140
by (ftac poly_squarefree_decomp_order2 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1141
by (TRYALL(assume_tac));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1142
by (case_tac "poly p = poly []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1143
by (blast_tac (claset() addDs [pderiv_zero]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1144
by (simp_tac (simpset() addsimps [rsquarefree_def,
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1145
    order_root] delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1146
by (asm_full_simp_tac (simpset() addsimps [poly_entire] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1147
    delsimps [pmult_Cons]) 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1148
qed "poly_squarefree_decomp";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1149
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1150
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1151
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1152
(* Normalization of a polynomial.                                            *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1153
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1154
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1155
Goal "poly (pnormalize p) = poly p";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1156
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1157
by (auto_tac (claset(),simpset() addsimps [fun_eq]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1158
qed "poly_normalize";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1159
Addsimps [poly_normalize];
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1160
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1161
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1162
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1163
(* The degree of a polynomial.                                               *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1164
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1165
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1166
Goal "list_all (%c. c = 0) p -->  pnormalize p = []";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1167
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1168
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1169
qed_spec_mp "lemma_degree_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1170
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1171
Goalw [degree_def] "poly p = poly [] ==> degree p = 0";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1172
by (case_tac "pnormalize p = []" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1173
by (auto_tac (claset() addDs [lemma_degree_zero],simpset() 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1174
    addsimps [poly_zero]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1175
qed "degree_zero";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1176
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1177
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1178
(* Tidier versions of finiteness of roots.                                   *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1179
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1180
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1181
Goal "poly p ~= poly [] ==> finite {x. poly p x = 0}";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1182
by (auto_tac (claset(),simpset() addsimps [poly_roots_finite]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1183
by (res_inst_tac [("B","{x::real. EX n. (n::nat) < N & (x = j n)}")] 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1184
    finite_subset 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1185
by (induct_tac "N" 2);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1186
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1187
by (subgoal_tac "{x::real. EX na. na < Suc n & (x = j na)} = \
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1188
\                 {(j n)} Un {x. EX na. na < n & (x = j na)}" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1189
by (auto_tac (claset(),simpset() addsimps [ARITH_PROVE 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1190
    "(na < Suc n) = (na = n | na < n)"]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1191
qed "poly_roots_finite_set";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1192
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1193
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1194
(* bound for polynomial.                                                     *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1195
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1196
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1197
Goal "abs(x) <= k --> abs(poly p x) <= poly (map abs p) k";
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1198
by (induct_tac "p" 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1199
by Auto_tac;
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1200
by (res_inst_tac [("j","abs a + abs(x * poly list x)")] real_le_trans 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1201
by (rtac abs_triangle_ineq 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1202
by (auto_tac (claset() addSIs [real_mult_le_mono],simpset() 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1203
    addsimps [abs_mult]));
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1204
by (arith_tac 1);
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
  1205
qed_spec_mp "poly_mono";