| 2281 |      1 | (*  Title:      HOL/Integ/Group.ML
 | 
|  |      2 |     ID:         $Id$
 | 
|  |      3 |     Author:     Tobias Nipkow
 | 
|  |      4 |     Copyright   1996 TU Muenchen
 | 
|  |      5 | *)
 | 
|  |      6 | 
 | 
|  |      7 | open Group;
 | 
|  |      8 | 
 | 
|  |      9 | Addsimps [zeroL,zeroR,plus_assoc,plus_commute];
 | 
|  |     10 | 
 | 
|  |     11 | goal Group.thy "!!x::'a::add_group. (zero-x)+(x+y) = y";
 | 
| 3018 |     12 | by (rtac trans 1);
 | 
|  |     13 | by (rtac (plus_assoc RS sym) 1);
 | 
|  |     14 | by (stac left_inv 1);
 | 
|  |     15 | by (rtac zeroL 1);
 | 
| 2281 |     16 | qed "left_inv2";
 | 
|  |     17 | 
 | 
|  |     18 | goal Group.thy "!!x::'a::add_group. (zero-(zero-x)) = x";
 | 
| 3018 |     19 | by (rtac trans 1);
 | 
|  |     20 | by (res_inst_tac [("x","zero-x")] left_inv2 2);
 | 
|  |     21 | by (stac left_inv 1);
 | 
|  |     22 | by (rtac (zeroR RS sym) 1);
 | 
| 2281 |     23 | qed "inv_inv";
 | 
|  |     24 | 
 | 
|  |     25 | goal Group.thy "zero-zero = (zero::'a::add_group)";
 | 
| 3018 |     26 | by (rtac trans 1);
 | 
|  |     27 | by (rtac (zeroR RS sym) 1);
 | 
|  |     28 | by (rtac trans 1);
 | 
|  |     29 | by (res_inst_tac [("x","zero")] left_inv2 2);
 | 
|  |     30 | by (Simp_tac 1);
 | 
| 2281 |     31 | qed "inv_zero";
 | 
|  |     32 | 
 | 
|  |     33 | goal Group.thy "!!x::'a::add_group. x+(zero-x) = zero";
 | 
| 3018 |     34 | by (rtac trans 1);
 | 
|  |     35 | by (res_inst_tac [("x","zero-x")] left_inv 2);
 | 
|  |     36 | by (stac inv_inv 1);
 | 
|  |     37 | by (rtac refl 1);
 | 
| 2281 |     38 | qed "right_inv";
 | 
|  |     39 | 
 | 
|  |     40 | goal Group.thy "!!x::'a::add_group. x+((zero-x)+y) = y";
 | 
| 3018 |     41 | by (rtac trans 1);
 | 
|  |     42 | by (res_inst_tac [("x","zero-x")] left_inv2 2);
 | 
|  |     43 | by (stac inv_inv 1);
 | 
|  |     44 | by (rtac refl 1);
 | 
| 2281 |     45 | qed "right_inv2";
 | 
|  |     46 | 
 | 
|  |     47 | goal Group.thy "!!x::'a::add_group. x-x = zero";
 | 
| 3018 |     48 | by (stac minus_inv 1);
 | 
|  |     49 | by (rtac right_inv 1);
 | 
| 2281 |     50 | qed "minus_self_zero";
 | 
|  |     51 | Addsimps [minus_self_zero];
 | 
|  |     52 | 
 | 
|  |     53 | goal Group.thy "!!x::'a::add_group. x-zero = x";
 | 
| 3018 |     54 | by (stac minus_inv 1);
 | 
|  |     55 | by (stac inv_zero 1);
 | 
|  |     56 | by (rtac zeroR 1);
 | 
| 2281 |     57 | qed "minus_zero";
 | 
|  |     58 | Addsimps [minus_zero];
 | 
|  |     59 | 
 | 
|  |     60 | val plus_cong = read_instantiate [("f1","op +")] (arg_cong RS cong);
 | 
|  |     61 | 
 | 
|  |     62 | goal Group.thy "!!x::'a::add_group. zero-(x+y) = (zero-y)+(zero-x)";
 | 
| 3018 |     63 | by (rtac trans 1);
 | 
|  |     64 |  by (rtac zeroR 2);
 | 
|  |     65 | by (rtac trans 1);
 | 
|  |     66 |  by (rtac plus_cong 2);
 | 
|  |     67 |   by (rtac refl 2);
 | 
|  |     68 |  by (res_inst_tac [("x","x+y")] right_inv 2);
 | 
|  |     69 | by (rtac trans 1);
 | 
|  |     70 |  by (rtac plus_assoc 2);
 | 
|  |     71 | by (rtac trans 1);
 | 
|  |     72 |  by (rtac plus_cong 2);
 | 
|  |     73 |   by (simp_tac (!simpset addsimps [left_inv,left_inv2,right_inv,right_inv2]) 2);
 | 
|  |     74 |  by (rtac refl 2);
 | 
|  |     75 | by (rtac (zeroL RS sym) 1);
 | 
| 2281 |     76 | qed "inv_plus";
 | 
|  |     77 | 
 | 
|  |     78 | goal Group.thy "x+(y+z)=y+(x+z::'a::add_agroup)";
 | 
| 3018 |     79 | by (rtac trans 1);
 | 
|  |     80 | by (rtac plus_commute 1);
 | 
|  |     81 | by (rtac trans 1);
 | 
|  |     82 | by (rtac plus_assoc 1);
 | 
|  |     83 | by (Simp_tac 1);
 | 
| 2281 |     84 | qed "plus_commuteL";
 | 
|  |     85 | Addsimps [plus_commuteL];
 | 
|  |     86 | 
 | 
|  |     87 | Addsimps [inv_inv,inv_plus];
 | 
|  |     88 | 
 | 
|  |     89 | (* Phase 1 *)
 | 
|  |     90 | 
 | 
|  |     91 | goal Group.thy "!!x::'a::add_agroup. (x+(zero-y))+z = (x+z)+(zero-y)";
 | 
| 3018 |     92 | by (Simp_tac 1);
 | 
| 2281 |     93 | val lemma = result();
 | 
|  |     94 | bind_thm("plus_minusL",rewrite_rule[minus_inv RS sym RS eq_reflection]lemma);
 | 
|  |     95 | 
 | 
|  |     96 | goal Group.thy "!!x::'a::add_agroup. x+(zero-(y+z)) = (x+(zero-y))+(zero-z)";
 | 
| 3018 |     97 | by (Simp_tac 1);
 | 
| 2281 |     98 | val lemma = result();
 | 
|  |     99 | bind_thm("minus_plusR",rewrite_rule[minus_inv RS sym RS eq_reflection]lemma);
 | 
|  |    100 | 
 | 
|  |    101 | goal Group.thy "!!x::'a::add_agroup. x+(zero-(y+(zero-z))) = (x+z)+(zero-y)";
 | 
| 3018 |    102 | by (Simp_tac 1);
 | 
| 2281 |    103 | val lemma = result();
 | 
|  |    104 | bind_thm("minus_minusR",rewrite_rule[minus_inv RS sym RS eq_reflection]lemma);
 | 
|  |    105 | 
 | 
|  |    106 | goal Group.thy "!!x::'a::add_agroup. x+(y+(zero-z)) = (x+y)+(zero-z)";
 | 
| 3018 |    107 | by (Simp_tac 1);
 | 
| 2281 |    108 | val lemma = result();
 | 
|  |    109 | bind_thm("plus_minusR",rewrite_rule[minus_inv RS sym RS eq_reflection]lemma);
 | 
|  |    110 | 
 | 
|  |    111 | (* Phase 2 *)
 | 
|  |    112 | 
 | 
|  |    113 | goal Group.thy "!!x::'a::add_agroup. (x+y)+(zero-z) = x+(y+(zero-z))";
 | 
| 3018 |    114 | by (Simp_tac 1);
 | 
| 2281 |    115 | val lemma = result();
 | 
|  |    116 | bind_thm("minus_plusL2",rewrite_rule[minus_inv RS sym RS eq_reflection]lemma);
 | 
|  |    117 | 
 | 
|  |    118 | goal Group.thy "!!x::'a::add_agroup. (x+y)+(zero-x) = y";
 | 
| 3018 |    119 | by (rtac (plus_assoc RS trans) 1);
 | 
|  |    120 | by (rtac trans 1);
 | 
|  |    121 |  by (rtac plus_cong 1);
 | 
|  |    122 |   by (rtac refl 1);
 | 
|  |    123 |  by (rtac right_inv2 2);
 | 
|  |    124 | by (rtac plus_commute 1);
 | 
| 2281 |    125 | val lemma = result();
 | 
|  |    126 | bind_thm("minus_plusL3",rewrite_rule[minus_inv RS sym RS eq_reflection]lemma);
 | 
|  |    127 | 
 |