src/HOL/Algebra/poly/PolyHomo.ML
author wenzelm
Sat, 06 Oct 2001 00:02:46 +0200
changeset 11704 3c50a2cd6f00
parent 11701 3d51fbf81c17
child 13735 7de9342aca7a
permissions -rw-r--r--
* sane numerals (stage 2): plain "num" syntax (removed "#");
paulson@7998
     1
(*
paulson@7998
     2
    Universal property and evaluation homomorphism of univariate polynomials
paulson@7998
     3
    $Id$
paulson@7998
     4
    Author: Clemens Ballarin, started 16 April 1997
paulson@7998
     5
*)
paulson@7998
     6
paulson@7998
     7
(* Ring homomorphisms and polynomials *)
paulson@7998
     8
paulson@7998
     9
Goal "homo (const::'a::ring=>'a up)";
paulson@7998
    10
by (auto_tac (claset() addSIs [homoI], simpset()));
paulson@7998
    11
qed "const_homo";
paulson@7998
    12
paulson@7998
    13
Delsimps [const_add, const_mult, const_one, const_zero];
paulson@7998
    14
Addsimps [const_homo];
paulson@7998
    15
paulson@7998
    16
Goal
paulson@7998
    17
  "!!f::'a::ring up=>'b::ring. homo f ==> f (a *s p) = f (const a) * f p";
paulson@7998
    18
by (asm_simp_tac (simpset() addsimps [const_mult_is_smult RS sym]) 1);
paulson@7998
    19
qed "homo_smult";
paulson@7998
    20
paulson@7998
    21
Addsimps [homo_smult];
paulson@7998
    22
paulson@7998
    23
(* Evaluation homomorphism *)
paulson@7998
    24
paulson@7998
    25
Goal
paulson@7998
    26
  "!! phi::('a::ring=>'b::ring). homo phi ==> homo (EVAL2 phi a)";
paulson@7998
    27
by (rtac homoI 1);
paulson@7998
    28
by (rewtac EVAL2_def);
paulson@7998
    29
(* + commutes *)
paulson@7998
    30
(* degree estimations:
paulson@7998
    31
  bound of all sums can be extended to max (deg aa) (deg b) *)
paulson@7998
    32
by (res_inst_tac [("m", "deg (aa + b)"), ("n", "max (deg aa) (deg b)")]
paulson@7998
    33
  SUM_shrink 1);
paulson@7998
    34
by (rtac deg_add 1);
paulson@7998
    35
by (asm_simp_tac (simpset() delsimps [coeff_add] addsimps [deg_aboveD]) 1);
paulson@7998
    36
by (res_inst_tac [("m", "deg aa"), ("n", "max (deg aa) (deg b)")]
paulson@7998
    37
  SUM_shrink 1);
paulson@7998
    38
by (rtac le_maxI1 1);
paulson@7998
    39
by (asm_simp_tac (simpset() addsimps [deg_aboveD]) 1);
paulson@7998
    40
by (res_inst_tac [("m", "deg b"), ("n", "max (deg aa) (deg b)")]
paulson@7998
    41
  SUM_shrink 1);
paulson@7998
    42
by (rtac le_maxI2 1);
paulson@7998
    43
by (asm_simp_tac (simpset() addsimps [deg_aboveD]) 1);
paulson@7998
    44
(* actual homom property + *)
paulson@7998
    45
by (asm_simp_tac (simpset() addsimps [l_distr, SUM_add]) 1);
paulson@7998
    46
paulson@7998
    47
(* * commutes *)
paulson@7998
    48
by (res_inst_tac [("m", "deg (aa * b)"), ("n", "deg aa + deg b")]
paulson@7998
    49
  SUM_shrink 1);
paulson@7998
    50
by (rtac deg_mult_ring 1);
paulson@7998
    51
by (asm_simp_tac (simpset() delsimps [coeff_mult] addsimps [deg_aboveD]) 1);
paulson@7998
    52
by (rtac trans 1);
paulson@7998
    53
by (rtac CauchySum 2);
paulson@7998
    54
by (asm_simp_tac (simpset() addsimps [boundI, deg_aboveD]) 2);
paulson@7998
    55
by (asm_simp_tac (simpset() addsimps [boundI, deg_aboveD]) 2);
paulson@7998
    56
(* getting a^i and a^(k-i) together is difficult, so we do is manually *)
paulson@7998
    57
by (res_inst_tac [("s", 
ballarin@11093
    58
"        setsum  \
ballarin@11093
    59
\           (%k. setsum \
paulson@7998
    60
\                 (%i. phi (coeff i aa) * (phi (coeff (k - i) b) * \
ballarin@11093
    61
\                      (a ^ i * a ^ (k - i)))) {..k}) \
ballarin@11093
    62
\           {..deg aa + deg b}")] trans 1);
paulson@7998
    63
by (asm_simp_tac (simpset()
paulson@7998
    64
    addsimps [power_mult, leD RS add_diff_inverse, SUM_ldistr]) 1);
paulson@7998
    65
by (simp_tac (simpset() addsimps m_ac) 1);
paulson@7998
    66
by (simp_tac (simpset() addsimps m_ac) 1);
paulson@7998
    67
(* <1> commutes *)
paulson@7998
    68
by (Asm_simp_tac 1);
paulson@7998
    69
qed "EVAL2_homo";
paulson@7998
    70
paulson@7998
    71
Goalw [EVAL2_def]
paulson@7998
    72
  "!! phi::'a::ring=>'b::ring. EVAL2 phi a (const b) = phi b";
paulson@7998
    73
by (Simp_tac 1);
paulson@7998
    74
qed "EVAL2_const";
paulson@7998
    75
paulson@7998
    76
Goalw [EVAL2_def]
ballarin@11093
    77
  "!! phi::'a::domain=>'b::ring. homo phi ==> EVAL2 phi a (monom 1) = a";
ballarin@11093
    78
(* Must be able to distinguish 0 from <1>, hence 'a::domain *)
paulson@7998
    79
by (Asm_simp_tac 1);
paulson@7998
    80
qed "EVAL2_monom1";
paulson@7998
    81
paulson@7998
    82
Goalw [EVAL2_def]
ballarin@11093
    83
  "!! phi::'a::domain=>'b::ring. homo phi ==> EVAL2 phi a (monom n) = a ^ n";
paulson@7998
    84
by (Simp_tac 1);
paulson@8707
    85
by (case_tac "n" 1); 
paulson@8707
    86
by Auto_tac;
paulson@7998
    87
qed "EVAL2_monom";
paulson@7998
    88
paulson@7998
    89
Goal
paulson@7998
    90
  "!! phi::'a::ring=>'b::ring. \
paulson@7998
    91
\    homo phi ==> EVAL2 phi a (b *s p) = phi b * EVAL2 phi a p";
paulson@7998
    92
by (asm_simp_tac
paulson@7998
    93
  (simpset() addsimps [const_mult_is_smult RS sym, EVAL2_homo, EVAL2_const]) 1);
paulson@7998
    94
qed "EVAL2_smult";
paulson@7998
    95
paulson@7998
    96
Goalw [EVAL_def] "!! a::'a::ring. homo (EVAL a)";
paulson@7998
    97
by (asm_simp_tac (simpset() addsimps [EVAL2_homo, id_homo]) 1);
paulson@7998
    98
qed "EVAL_homo";
paulson@7998
    99
paulson@7998
   100
Goalw [EVAL_def] "!! a::'a::ring. EVAL a (const b) = b";
paulson@7998
   101
by (asm_simp_tac (simpset() addsimps [EVAL2_const]) 1);
paulson@7998
   102
qed "EVAL_const";
paulson@7998
   103
ballarin@11093
   104
Goalw [EVAL_def] "!! a::'a::domain. EVAL a (monom n) = a ^ n";
paulson@7998
   105
by (asm_simp_tac (simpset() addsimps [EVAL2_monom]) 1);
paulson@7998
   106
qed "EVAL_monom";
paulson@7998
   107
paulson@7998
   108
Goalw [EVAL_def] "!! a::'a::ring. EVAL a (b *s p) = b * EVAL a p";
paulson@7998
   109
by (asm_simp_tac (simpset() addsimps [EVAL2_smult]) 1);
paulson@7998
   110
qed "EVAL_smult";
paulson@7998
   111
paulson@7998
   112
(* Examples *)
paulson@7998
   113
paulson@7998
   114
Goal
wenzelm@11704
   115
  "EVAL (x::'a::domain) (a*X^2 + b*X^1 + c*X^0) = a * x ^ 2 + b * x ^ 1 + c";
paulson@7998
   116
by (asm_simp_tac (simpset() delsimps [power_Suc]
paulson@7998
   117
    addsimps [EVAL_homo, EVAL_monom, EVAL_smult]) 1);
paulson@7998
   118
result();
paulson@7998
   119
paulson@7998
   120
Goal
ballarin@11093
   121
  "EVAL (y::'a::domain) \
wenzelm@11704
   122
\    (EVAL (const x) (monom 1 + const (a*X^2 + b*X^1 + c*X^0))) = \
wenzelm@11704
   123
\  x ^ 1 + (a * y ^ 2 + b * y ^ 1 + c)";
paulson@7998
   124
by (asm_simp_tac (simpset() delsimps [power_Suc]
paulson@7998
   125
    addsimps [EVAL_homo, EVAL_monom, EVAL_smult, EVAL_const]) 1);
paulson@7998
   126
result();
paulson@7998
   127