src/HOL/Real/HahnBanach/LinearSpace.thy
changeset 7808 fd019ac3485f
parent 7656 2f18c0ffc348
equal deleted inserted replaced
7807:6a102f74ad0a 7808:fd019ac3485f
     1 (*  Title:      HOL/Real/HahnBanach/LinearSpace.thy
     1 (*  Title:      HOL/Real/HahnBanach/LinearSpace.thy
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Gertrud Bauer, TU Munich
     3     Author:     Gertrud Bauer, TU Munich
     4 *)
     4 *)
     5 
     5 
       
     6 header {* Linear Spaces *};
       
     7 
     6 theory LinearSpace = Bounds + Aux:;
     8 theory LinearSpace = Bounds + Aux:;
     7 
     9 
     8 
    10 subsection {* Signature *};
     9 section {* vector spaces *};
       
    10 
    11 
    11 consts
    12 consts
    12   sum	:: "['a, 'a] => 'a"                      (infixl "[+]" 65)  
    13   sum	:: "['a, 'a] => 'a"                              (infixl "[+]" 65)
    13   prod  :: "[real, 'a] => 'a"                    (infixr "[*]" 70) 
    14   prod  :: "[real, 'a] => 'a"                            (infixr "[*]" 70) 
    14   zero  :: 'a                                    ("<0>");
    15   zero  :: 'a                                            ("<0>");
    15 
    16 
    16 constdefs
    17 constdefs
    17   negate :: "'a => 'a"                           ("[-] _" [100] 100)
    18   negate :: "'a => 'a"                                   ("[-] _" [100] 100)
    18   "[-] x == (- 1r) [*] x"
    19   "[-] x == (- 1r) [*] x"
    19   diff :: "'a => 'a => 'a"                       (infixl "[-]" 68)
    20   diff :: "'a => 'a => 'a"                               (infixl "[-]" 68)
    20   "x [-] y == x [+] [-] y";
    21   "x [-] y == x [+] [-] y";
    21 
    22 
       
    23 subsection {* Vector space laws *}
       
    24 (***
    22 constdefs
    25 constdefs
    23   is_vectorspace :: "'a set => bool"
    26   is_vectorspace :: "'a set => bool"
    24   "is_vectorspace V == <0>:V &
    27   "is_vectorspace V == V ~= {} 
    25    (ALL x:V. ALL y:V. ALL z:V. ALL a b. x [+] y: V 
    28    & (ALL x: V. ALL a. a [*] x: V)
    26                           & a [*] x: V                        
    29    & (ALL x: V. ALL y: V. x [+] y = y [+] x)
    27                           & x [+] y [+] z = x [+] (y [+] z)  
    30    & (ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z =  x [+] (y [+] z))
    28                           & x [+] y = y [+] x             
    31    & (ALL x: V. ALL y: V. x [+] y: V)
    29                           & x [-] x = <0>         
    32    & (ALL x: V. x [-] x = <0>)
    30                           & <0> [+] x = x 
    33    & (ALL x: V. <0> [+] x = x)
    31                           & a [*] (x [+] y) = a [*] x [+] a [*] y
    34    & (ALL x: V. ALL y: V. ALL a. a [*] (x [+] y) = a [*] x [+] a [*] y)
    32                           & (a + b) [*] x = a [*] x [+] b [*] x
    35    & (ALL x: V. ALL a b. (a + b) [*] x = a [*] x [+] b [*] x)
    33                           & (a * b) [*] x = a [*] b [*] x     
    36    & (ALL x: V. ALL a b. (a * b) [*] x = a [*] b [*] x)
    34                           & 1r [*] x = x)";
    37    & (ALL x: V. 1r [*] x = x)"; 
    35 
    38 ***)
    36 
    39 constdefs
    37 subsection {* neg, diff *};
    40   is_vectorspace :: "'a set => bool"
    38 
    41   "is_vectorspace V == V ~= {} 
    39 lemma vs_mult_minus_1: "(- 1r) [*] x = [-] x";
    42    & (ALL x:V. ALL y:V. ALL z:V. ALL a b. 
    40   by (simp add: negate_def);
    43         x [+] y: V 
    41 
    44       & a [*] x: V                         
    42 lemma vs_add_mult_minus_1_eq_diff: "x [+] (- 1r) [*] y = x [-] y";
    45       & x [+] y [+] z = x [+] (y [+] z)  
    43   by (simp add: diff_def negate_def);
    46       & x [+] y = y [+] x             
    44 
    47       & x [-] x = <0>         
    45 lemma vs_add_minus_eq_diff: "x [+] [-] y = x [-] y";
    48       & <0> [+] x = x 
    46   by (simp add: diff_def);
    49       & a [*] (x [+] y) = a [*] x [+] a [*] y
       
    50       & (a + b) [*] x = a [*] x [+] b [*] x
       
    51       & (a * b) [*] x = a [*] b [*] x     
       
    52       & 1r [*] x = x)";
    47 
    53 
    48 lemma vsI [intro]:
    54 lemma vsI [intro]:
    49   "[| <0>:V; \
    55   "[| <0>:V; \
    50   \      ALL x: V. ALL a::real. a [*] x: V; \     
    56        ALL x: V. ALL y: V. x [+] y: V;
    51   \      ALL x: V. ALL y: V. x [+] y = y [+] x; \
    57        ALL x: V. ALL a. a [*] x: V;    
    52   \      ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z =  x [+] (y [+] z); \
    58        ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z =  x [+] (y [+] z);
    53   \      ALL x: V. ALL y: V. x [+] y: V; \
    59        ALL x: V. ALL y: V. x [+] y = y [+] x;
    54   \      ALL x: V.  x [-] x = <0>; \
    60        ALL x: V. x [-] x = <0>;
    55   \      ALL x: V.  <0> [+] x = x; \
    61        ALL x: V. <0> [+] x = x;
    56   \      ALL x: V. ALL y: V. ALL a::real. a [*] (x [+] y) = a [*] x [+] a [*] y; \
    62        ALL x: V. ALL y: V. ALL a. a [*] (x [+] y) = a [*] x [+] a [*] y;
    57   \      ALL x: V. ALL a::real. ALL b::real. (a + b) [*] x = a [*] x [+] b [*] x; \
    63        ALL x: V. ALL a b. (a + b) [*] x = a [*] x [+] b [*] x;
    58   \      ALL x: V. ALL a::real. ALL b::real. (a * b) [*] x = a [*] b [*] x; \
    64        ALL x: V. ALL a b. (a * b) [*] x = a [*] b [*] x; \
    59   \      ALL x: V. 1r [*] x = x |] ==> is_vectorspace V";
    65        ALL x: V. 1r [*] x = x |] ==> is_vectorspace V";
    60 proof (unfold is_vectorspace_def, intro conjI ballI allI);
    66 proof (unfold is_vectorspace_def, intro conjI ballI allI);
    61   fix x y z; assume "x:V" "y:V" "z:V"; 
    67   fix x y z; assume "x:V" "y:V" "z:V"; 
    62   assume "ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z =  x [+] (y [+] z)";
    68   assume "ALL x: V. ALL y: V. ALL z: V. x [+] y [+] z =  x [+] (y [+] z)";
    63   thus "x [+] y [+] z =  x [+] (y [+] z)"; by (elim bspec[elimify]);
    69   thus "x [+] y [+] z =  x [+] (y [+] z)"; by (elim bspec[elimify]);
    64 qed force+;
    70 qed force+;
    65 
    71 
    66 lemma zero_in_vs [simp, intro]: "is_vectorspace V ==> <0>:V";
       
    67   by (unfold is_vectorspace_def) simp;
       
    68 
       
    69 lemma vs_not_empty [intro !!]: "is_vectorspace V ==> (V ~= {})"; 
    72 lemma vs_not_empty [intro !!]: "is_vectorspace V ==> (V ~= {})"; 
       
    73   by (unfold is_vectorspace_def) simp;
       
    74  
       
    75 lemma vs_add_closed [simp, intro!!]: 
       
    76   "[| is_vectorspace V; x: V; y: V|] ==> x [+] y: V"; 
       
    77   by (unfold is_vectorspace_def) simp;
       
    78 
       
    79 lemma vs_mult_closed [simp, intro!!]: 
       
    80   "[| is_vectorspace V; x: V |] ==> a [*] x: V"; 
       
    81   by (unfold is_vectorspace_def) simp;
       
    82 
       
    83 lemma vs_diff_closed [simp, intro!!]: 
       
    84  "[| is_vectorspace V; x: V; y: V|] ==> x [-] y: V";
       
    85   by (unfold diff_def negate_def) simp;
       
    86 
       
    87 lemma vs_neg_closed  [simp, intro!!]: 
       
    88   "[| is_vectorspace V; x: V |] ==>  [-] x: V";
       
    89   by (unfold negate_def) simp;
       
    90 
       
    91 lemma vs_add_assoc [simp]:  
       
    92   "[| is_vectorspace V; x: V; y: V; z: V|]
       
    93    ==> x [+] y [+] z = x [+] (y [+] z)";
    70   by (unfold is_vectorspace_def) fast;
    94   by (unfold is_vectorspace_def) fast;
    71  
    95 
    72 lemma vs_add_closed [simp, intro!!]: "[| is_vectorspace V; x: V; y: V|] ==> x [+] y: V"; 
    96 lemma vs_add_commute [simp]: 
    73   by (unfold is_vectorspace_def) simp;
    97   "[| is_vectorspace V; x:V; y:V |] ==> y [+] x = x [+] y";
    74 
       
    75 lemma vs_mult_closed [simp, intro!!]: "[| is_vectorspace V; x: V |] ==> a [*] x: V"; 
       
    76   by (unfold is_vectorspace_def) simp;
       
    77 
       
    78 lemma vs_diff_closed [simp, intro!!]: "[| is_vectorspace V; x: V; y: V|] ==> x [-] y: V";
       
    79   by (unfold diff_def negate_def) simp;
       
    80 
       
    81 lemma vs_neg_closed  [simp, intro!!]: "[| is_vectorspace V; x: V |] ==>  [-] x: V";
       
    82   by (unfold negate_def) simp;
       
    83 
       
    84 lemma vs_add_assoc [simp]:  
       
    85   "[| is_vectorspace V; x: V; y: V; z: V|] ==> x [+] y [+] z =  x [+] (y [+] z)";
       
    86   by (unfold is_vectorspace_def) fast;
       
    87 
       
    88 lemma vs_add_commute [simp]: "[| is_vectorspace V; x:V; y:V |] ==> y [+] x = x [+] y";
       
    89   by (unfold is_vectorspace_def) simp;
    98   by (unfold is_vectorspace_def) simp;
    90 
    99 
    91 lemma vs_add_left_commute [simp]:
   100 lemma vs_add_left_commute [simp]:
    92   "[| is_vectorspace V; x:V; y:V; z:V |] ==> x [+] (y [+] z) = y [+] (x [+] z)";
   101   "[| is_vectorspace V; x:V; y:V; z:V |] 
       
   102   ==> x [+] (y [+] z) = y [+] (x [+] z)";
    93 proof -;
   103 proof -;
    94   assume "is_vectorspace V" "x:V" "y:V" "z:V";
   104   assume "is_vectorspace V" "x:V" "y:V" "z:V";
    95   hence "x [+] (y [+] z) = (x [+] y) [+] z"; by (simp only: vs_add_assoc);
   105   hence "x [+] (y [+] z) = (x [+] y) [+] z"; 
       
   106     by (simp only: vs_add_assoc);
    96   also; have "... = (y [+] x) [+] z"; by (simp! only: vs_add_commute);
   107   also; have "... = (y [+] x) [+] z"; by (simp! only: vs_add_commute);
    97   also; have "... = y [+] (x [+] z)"; by (simp! only: vs_add_assoc);
   108   also; have "... = y [+] (x [+] z)"; by (simp! only: vs_add_assoc);
    98   finally; show ?thesis; .;
   109   finally; show ?thesis; .;
    99 qed;
   110 qed;
   100 
   111 
   101 theorems vs_add_ac = vs_add_assoc vs_add_commute vs_add_left_commute;
   112 theorems vs_add_ac = vs_add_assoc vs_add_commute vs_add_left_commute;
   102 
   113 
   103 lemma vs_diff_self [simp]: "[| is_vectorspace V; x:V |] ==>  x [-] x = <0>"; 
   114 lemma vs_diff_self [simp]: 
   104   by (unfold is_vectorspace_def) simp;
   115   "[| is_vectorspace V; x:V |] ==>  x [-] x = <0>"; 
   105 
   116   by (unfold is_vectorspace_def) simp;
   106 lemma vs_add_zero_left [simp]: "[| is_vectorspace V; x:V |] ==>  <0> [+] x = x";
   117 
   107   by (unfold is_vectorspace_def) simp;
   118 lemma zero_in_vs [simp, intro]: "is_vectorspace V ==> <0>:V";
   108 
   119 proof -; 
   109 lemma vs_add_zero_right [simp]: "[| is_vectorspace V; x:V |] ==>  x [+] <0> = x";
   120   assume "is_vectorspace V";
       
   121   have "V ~= {}"; ..;
       
   122   hence "EX x. x:V"; by force;
       
   123   thus ?thesis; 
       
   124   proof; 
       
   125     fix x; assume "x:V"; 
       
   126     have "<0> = x [-] x"; by (simp!);
       
   127     also; have "... : V"; by (simp! only: vs_diff_closed);
       
   128     finally; show ?thesis; .;
       
   129   qed;
       
   130 qed;
       
   131 
       
   132 lemma vs_add_zero_left [simp]: 
       
   133   "[| is_vectorspace V; x:V |] ==>  <0> [+] x = x";
       
   134   by (unfold is_vectorspace_def) simp;
       
   135 
       
   136 lemma vs_add_zero_right [simp]: 
       
   137   "[| is_vectorspace V; x:V |] ==>  x [+] <0> = x";
   110 proof -;
   138 proof -;
   111   assume "is_vectorspace V" "x:V";
   139   assume "is_vectorspace V" "x:V";
   112   hence "x [+] <0> = <0> [+] x"; by simp;
   140   hence "x [+] <0> = <0> [+] x"; by simp;
   113   also; have "... = x"; by (simp!);
   141   also; have "... = x"; by (simp!);
   114   finally; show ?thesis; .;
   142   finally; show ?thesis; .;
   115 qed;
   143 qed;
   116 
   144 
   117 lemma vs_add_mult_distrib1: 
   145 lemma vs_add_mult_distrib1: 
   118   "[| is_vectorspace V; x:V; y:V |] ==> a [*] (x [+] y) = a [*] x [+] a [*] y";
   146   "[| is_vectorspace V; x:V; y:V |] 
       
   147   ==> a [*] (x [+] y) = a [*] x [+] a [*] y";
   119   by (unfold is_vectorspace_def) simp;
   148   by (unfold is_vectorspace_def) simp;
   120 
   149 
   121 lemma vs_add_mult_distrib2: 
   150 lemma vs_add_mult_distrib2: 
   122   "[| is_vectorspace V; x:V |] ==>  (a + b) [*] x = a [*] x [+] b [*] x"; 
   151   "[| is_vectorspace V; x:V |] ==> (a + b) [*] x = a [*] x [+] b [*] x"; 
   123   by (unfold is_vectorspace_def) simp;
   152   by (unfold is_vectorspace_def) simp;
   124 
   153 
   125 lemma vs_mult_assoc: "[| is_vectorspace V; x:V |] ==> (a * b) [*] x = a [*] (b [*] x)";   
   154 lemma vs_mult_assoc: 
   126   by (unfold is_vectorspace_def) simp;
   155   "[| is_vectorspace V; x:V |] ==> (a * b) [*] x = a [*] (b [*] x)";   
   127 
   156   by (unfold is_vectorspace_def) simp;
   128 lemma vs_mult_assoc2 [simp]: "[| is_vectorspace V; x:V |] ==> a [*] b [*] x = (a * b) [*] x";
   157 
       
   158 lemma vs_mult_assoc2 [simp]: 
       
   159  "[| is_vectorspace V; x:V |] ==> a [*] b [*] x = (a * b) [*] x";
   129   by (simp only: vs_mult_assoc);
   160   by (simp only: vs_mult_assoc);
   130 
   161 
   131 lemma vs_mult_1 [simp]: "[| is_vectorspace V; x:V |] ==> 1r [*] x = x"; 
   162 lemma vs_mult_1 [simp]: 
       
   163   "[| is_vectorspace V; x:V |] ==> 1r [*] x = x"; 
   132   by (unfold is_vectorspace_def) simp;
   164   by (unfold is_vectorspace_def) simp;
   133 
   165 
   134 lemma vs_diff_mult_distrib1: 
   166 lemma vs_diff_mult_distrib1: 
   135   "[| is_vectorspace V; x:V; y:V |] ==> a [*] (x [-] y) = a [*] x [-] a [*] y";
   167   "[| is_vectorspace V; x:V; y:V |] 
       
   168   ==> a [*] (x [-] y) = a [*] x [-] a [*] y";
   136   by (simp add: diff_def negate_def vs_add_mult_distrib1);
   169   by (simp add: diff_def negate_def vs_add_mult_distrib1);
   137 
   170 
   138 lemma vs_minus_eq: "[| is_vectorspace V; x:V |] ==> - b [*] x = [-] (b [*] x)";
   171 lemma vs_minus_eq: "[| is_vectorspace V; x:V |] 
       
   172   ==> - b [*] x = [-] (b [*] x)";
   139   by (simp add: negate_def);
   173   by (simp add: negate_def);
   140 
   174 
   141 lemma vs_diff_mult_distrib2: 
   175 lemma vs_diff_mult_distrib2: 
   142   "[| is_vectorspace V; x:V |] ==> (a - b) [*] x = a [*] x [-] (b [*] x)";
   176   "[| is_vectorspace V; x:V |] 
       
   177   ==> (a - b) [*] x = a [*] x [-] (b [*] x)";
   143 proof -;
   178 proof -;
   144   assume "is_vectorspace V" "x:V";
   179   assume "is_vectorspace V" "x:V";
   145   have " (a - b) [*] x = (a + - b ) [*] x"; by (unfold real_diff_def, simp);
   180   have " (a - b) [*] x = (a + - b ) [*] x"; 
   146   also; have "... = a [*] x [+] (- b) [*] x"; by (rule vs_add_mult_distrib2);
   181     by (unfold real_diff_def, simp);
   147   also; have "... = a [*] x [+] [-] (b [*] x)"; by (simp! add: vs_minus_eq);
   182   also; have "... = a [*] x [+] (- b) [*] x"; 
       
   183     by (rule vs_add_mult_distrib2);
       
   184   also; have "... = a [*] x [+] [-] (b [*] x)"; 
       
   185     by (simp! add: vs_minus_eq);
   148   also; have "... = a [*] x [-] (b [*] x)"; by (unfold diff_def, simp);
   186   also; have "... = a [*] x [-] (b [*] x)"; by (unfold diff_def, simp);
   149   finally; show ?thesis; .;
   187   finally; show ?thesis; .;
   150 qed;
   188 qed;
   151 
   189 
   152 lemma vs_mult_zero_left [simp]: "[| is_vectorspace V; x: V|] ==> 0r [*] x = <0>";
   190 lemma vs_mult_zero_left [simp]: 
       
   191   "[| is_vectorspace V; x: V|] ==> 0r [*] x = <0>";
   153 proof -;
   192 proof -;
   154   assume "is_vectorspace V" "x:V";
   193   assume "is_vectorspace V" "x:V";
   155   have  "0r [*] x = (1r - 1r) [*] x"; by (simp only: real_diff_self);
   194   have  "0r [*] x = (1r - 1r) [*] x"; by (simp only: real_diff_self);
   156   also; have "... = (1r + - 1r) [*] x"; by simp;
   195   also; have "... = (1r + - 1r) [*] x"; by simp;
   157   also; have "... =  1r [*] x [+] (- 1r) [*] x"; by (rule vs_add_mult_distrib2);
   196   also; have "... =  1r [*] x [+] (- 1r) [*] x"; 
       
   197     by (rule vs_add_mult_distrib2);
   158   also; have "... = x [+] (- 1r) [*] x"; by (simp!);
   198   also; have "... = x [+] (- 1r) [*] x"; by (simp!);
   159   also; have "... = x [-] x"; by (rule vs_add_mult_minus_1_eq_diff);
   199   also; have "... = x [+] [-] x"; by (fold negate_def) simp;
       
   200   also; have "... = x [-] x"; by (fold diff_def) simp;
   160   also; have "... = <0>"; by (simp!);
   201   also; have "... = <0>"; by (simp!);
   161   finally; show ?thesis; .;
   202   finally; show ?thesis; .;
   162 qed;
   203 qed;
   163 
   204 
   164 lemma vs_mult_zero_right [simp]: "[| is_vectorspace (V:: 'a set) |] ==> a [*] <0> = (<0>::'a)";
   205 lemma vs_mult_zero_right [simp]: 
       
   206   "[| is_vectorspace (V:: 'a set) |] ==> a [*] <0> = (<0>::'a)";
   165 proof -;
   207 proof -;
   166   assume "is_vectorspace V";
   208   assume "is_vectorspace V";
   167   have "a [*] <0> = a [*] (<0> [-] (<0>::'a))"; by (simp!);
   209   have "a [*] <0> = a [*] (<0> [-] (<0>::'a))"; by (simp!);
   168   also; have "... =  a [*] <0> [-] a [*] <0>";
   210   also; have "... =  a [*] <0> [-] a [*] <0>";
   169      by (rule vs_diff_mult_distrib1) (simp!)+;
   211      by (rule vs_diff_mult_distrib1) (simp!)+;
   170   also; have "... = <0>"; by (simp!);
   212   also; have "... = <0>"; by (simp!);
   171   finally; show ?thesis; .;
   213   finally; show ?thesis; .;
   172 qed;
   214 qed;
   173 
   215 
   174 lemma vs_minus_mult_cancel [simp]:  "[| is_vectorspace V; x:V |] ==>  (- a) [*] [-] x = a [*] x";
   216 lemma vs_minus_mult_cancel [simp]:  
       
   217   "[| is_vectorspace V; x:V |] ==> (- a) [*] [-] x = a [*] x";
   175   by (unfold negate_def) simp;
   218   by (unfold negate_def) simp;
   176 
   219 
   177 lemma vs_add_minus_left_eq_diff: "[| is_vectorspace V; x:V; y:V |] ==>  [-] x [+] y = y [-] x";
   220 lemma vs_add_minus_left_eq_diff: 
       
   221   "[| is_vectorspace V; x:V; y:V |] ==> [-] x [+] y = y [-] x";
   178 proof -; 
   222 proof -; 
   179   assume "is_vectorspace V" "x:V" "y:V";
   223   assume "is_vectorspace V" "x:V" "y:V";
   180   have "[-] x [+] y = y [+] [-] x"; by (simp! add: vs_add_commute [RS sym, of V "[-] x"]);
   224   have "[-] x [+] y = y [+] [-] x"; 
   181   also; have "... = y [-] x"; by (simp! only: vs_add_minus_eq_diff);
   225     by (simp! add: vs_add_commute [RS sym, of V "[-] x"]);
       
   226   also; have "... = y [-] x"; by (unfold diff_def) simp;
   182   finally; show ?thesis; .;
   227   finally; show ?thesis; .;
   183 qed;
   228 qed;
   184 
   229 
   185 lemma vs_add_minus [simp]: "[| is_vectorspace V; x:V|] ==> x [+] [-] x = <0>";
   230 lemma vs_add_minus [simp]: 
   186   by (simp add: vs_add_minus_eq_diff); 
   231   "[| is_vectorspace V; x:V|] ==> x [+] [-] x = <0>";
   187 
   232   by (fold diff_def) simp;
   188 lemma vs_add_minus_left [simp]: "[| is_vectorspace V; x:V |] ==> [-] x [+]  x = <0>";
   233 
   189   by (simp add: vs_add_minus_eq_diff); 
   234 lemma vs_add_minus_left [simp]: 
   190 
   235   "[| is_vectorspace V; x:V |] ==> [-] x [+]  x = <0>";
   191 lemma vs_minus_minus [simp]: "[| is_vectorspace V; x:V|] ==> [-] [-] x = x";
   236   by (fold diff_def) simp;
       
   237 
       
   238 lemma vs_minus_minus [simp]: 
       
   239   "[| is_vectorspace V; x:V|] ==> [-] [-] x = x";
   192   by (unfold negate_def) simp;
   240   by (unfold negate_def) simp;
   193 
   241 
   194 lemma vs_minus_zero [simp]: "[| is_vectorspace (V::'a set)|] ==>  [-] (<0>::'a) = <0>"; 
   242 lemma vs_minus_zero [simp]: 
       
   243   "[| is_vectorspace (V::'a set)|] ==> [-] (<0>::'a) = <0>"; 
   195   by (unfold negate_def) simp;
   244   by (unfold negate_def) simp;
   196 
   245 
   197 lemma vs_minus_zero_iff [simp]:
   246 lemma vs_minus_zero_iff [simp]:
   198   "[| is_vectorspace V; x:V|] ==>  ([-] x = <0>) = (x = <0>)" (concl is "?L = ?R");
   247   "[| is_vectorspace V; x:V|] ==> ([-] x = <0>) = (x = <0>)" 
       
   248   (concl is "?L = ?R");
   199 proof -;
   249 proof -;
   200   assume vs: "is_vectorspace V" "x:V";
   250   assume vs: "is_vectorspace V" "x:V";
   201   show "?L = ?R";
   251   show "?L = ?R";
   202   proof;
   252   proof;
   203     assume l: ?L;
   253     assume l: ?L;
   204     have "x = [-] [-] x"; by (rule vs_minus_minus [RS sym]);
   254     have "x = [-] [-] x"; by (rule vs_minus_minus [RS sym]);
   205     also; have "... = [-] <0>"; by (rule l [RS arg_cong] );
   255     also; have "... = [-] <0>"; by (simp only: l);
   206     also; have "... = <0>"; by (rule vs_minus_zero);
   256     also; have "... = <0>"; by (rule vs_minus_zero);
   207     finally; show ?R; .;
   257     finally; show ?R; .;
   208   next;
   258   next;
   209     assume ?R;
   259     assume ?R;
   210     with vs; show ?L; by simp;
   260     with vs; show ?L; by simp;
   211   qed;
   261   qed;
   212 qed;
   262 qed;
   213 
   263 
   214 lemma vs_add_minus_cancel [simp]:  "[| is_vectorspace V; x:V; y:V|] ==>  x [+] ([-] x [+] y) = y"; 
   264 lemma vs_add_minus_cancel [simp]:  
       
   265   "[| is_vectorspace V; x:V; y:V|] ==>  x [+] ([-] x [+] y) = y"; 
   215   by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); 
   266   by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); 
   216 
   267 
   217 lemma vs_minus_add_cancel [simp]: "[| is_vectorspace V; x:V; y:V |] ==>  [-] x [+] (x [+] y) = y"; 
   268 lemma vs_minus_add_cancel [simp]: 
       
   269   "[| is_vectorspace V; x:V; y:V |] ==>  [-] x [+] (x [+] y) = y"; 
   218   by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); 
   270   by (simp add: vs_add_assoc [RS sym] del: vs_add_commute); 
   219 
   271 
   220 lemma vs_minus_add_distrib [simp]:  
   272 lemma vs_minus_add_distrib [simp]:  
   221   "[| is_vectorspace V; x:V; y:V|] ==>  [-] (x [+] y) = [-] x [+] [-] y";
   273   "[| is_vectorspace V; x:V; y:V|] 
       
   274   ==> [-] (x [+] y) = [-] x [+] [-] y";
   222   by (unfold negate_def, simp add: vs_add_mult_distrib1);
   275   by (unfold negate_def, simp add: vs_add_mult_distrib1);
   223 
   276 
   224 lemma vs_diff_zero [simp]: "[| is_vectorspace V; x:V |] ==> x [-] <0> = x";
   277 lemma vs_diff_zero [simp]: 
       
   278   "[| is_vectorspace V; x:V |] ==> x [-] <0> = x";
   225   by (unfold diff_def) simp;  
   279   by (unfold diff_def) simp;  
   226 
   280 
   227 lemma vs_diff_zero_right [simp]: "[| is_vectorspace V; x:V |] ==> <0> [-] x = [-] x";
   281 lemma vs_diff_zero_right [simp]: 
       
   282   "[| is_vectorspace V; x:V |] ==> <0> [-] x = [-] x";
   228   by (unfold diff_def) simp;
   283   by (unfold diff_def) simp;
   229 
   284 
   230 lemma vs_add_left_cancel:
   285 lemma vs_add_left_cancel:
   231   "[|is_vectorspace V; x:V; y:V; z:V|] ==> (x [+] y = x [+] z) = (y = z)"  
   286   "[| is_vectorspace V; x:V; y:V; z:V|] 
       
   287    ==> (x [+] y = x [+] z) = (y = z)"  
   232   (concl is "?L = ?R");
   288   (concl is "?L = ?R");
   233 proof;
   289 proof;
   234   assume "is_vectorspace V" "x:V" "y:V" "z:V";
   290   assume "is_vectorspace V" "x:V" "y:V" "z:V";
   235   assume l: ?L; 
   291   assume l: ?L; 
   236   have "y = <0> [+] y"; by (simp!);
   292   have "y = <0> [+] y"; by (simp!);
   237   also; have "... = [-] x [+] x [+] y"; by (simp!);
   293   also; have "... = [-] x [+] x [+] y"; by (simp!);
   238   also; have "... = [-] x [+] (x [+] y)"; by (simp! only: vs_add_assoc vs_neg_closed);
   294   also; have "... = [-] x [+] (x [+] y)"; 
       
   295     by (simp! only: vs_add_assoc vs_neg_closed);
   239   also; have "...  = [-] x [+] (x [+] z)"; by (simp only: l);
   296   also; have "...  = [-] x [+] (x [+] z)"; by (simp only: l);
   240   also; have "... = [-] x [+] x [+] z"; by (rule vs_add_assoc [RS sym]) (simp!)+;
   297   also; have "... = [-] x [+] x [+] z"; 
       
   298     by (rule vs_add_assoc [RS sym]) (simp!)+;
   241   also; have "... = z"; by (simp!);
   299   also; have "... = z"; by (simp!);
   242   finally; show ?R;.;
   300   finally; show ?R;.;
   243 next;    
   301 next;    
   244   assume ?R;
   302   assume ?R;
   245   thus ?L; by force;
   303   thus ?L; by force;
   246 qed;
   304 qed;
   247 
   305 
   248 lemma vs_add_right_cancel: 
   306 lemma vs_add_right_cancel: 
   249   "[| is_vectorspace V; x:V; y:V; z:V |] ==>  (y [+] x = z [+] x) = (y = z)";  
   307   "[| is_vectorspace V; x:V; y:V; z:V |] 
       
   308   ==> (y [+] x = z [+] x) = (y = z)";  
   250   by (simp only: vs_add_commute vs_add_left_cancel);
   309   by (simp only: vs_add_commute vs_add_left_cancel);
   251 
   310 
   252 lemma vs_add_assoc_cong [tag FIXME simp]: "[| is_vectorspace V; x:V; y:V; x':V; y':V; z:V |] 
   311 lemma vs_add_assoc_cong [tag FIXME simp]: 
       
   312   "[| is_vectorspace V; x:V; y:V; x':V; y':V; z:V |] 
   253   ==> x [+] y = x' [+] y' ==> x [+] (y [+] z) = x' [+] (y' [+] z)"; 
   313   ==> x [+] y = x' [+] y' ==> x [+] (y [+] z) = x' [+] (y' [+] z)"; 
   254   by (simp del: vs_add_commute vs_add_assoc add: vs_add_assoc [RS sym]);
   314   by (simp del: vs_add_commute vs_add_assoc add: vs_add_assoc [RS sym]); 
   255 
   315 
   256 lemma vs_mult_left_commute: 
   316 lemma vs_mult_left_commute: 
   257   "[| is_vectorspace V; x:V; y:V; z:V |] ==>  x [*] y [*] z = y [*] x [*] z";  
   317   "[| is_vectorspace V; x:V; y:V; z:V |] 
       
   318   ==> x [*] y [*] z = y [*] x [*] z";  
   258   by (simp add: real_mult_commute);
   319   by (simp add: real_mult_commute);
   259 
   320 
   260 lemma vs_mult_zero_uniq :
   321 lemma vs_mult_zero_uniq :
   261   "[| is_vectorspace V; x:V; a [*] x = <0>; x ~= <0> |] ==> a = 0r";
   322   "[| is_vectorspace V; x:V; a [*] x = <0>; x ~= <0> |] ==> a = 0r";
   262 proof (rule classical);
   323 proof (rule classical);
   269   finally; have "x = <0>"; .;
   330   finally; have "x = <0>"; .;
   270   thus "a = 0r"; by contradiction; 
   331   thus "a = 0r"; by contradiction; 
   271 qed;
   332 qed;
   272 
   333 
   273 lemma vs_mult_left_cancel: 
   334 lemma vs_mult_left_cancel: 
   274   "[| is_vectorspace V; x:V; y:V; a ~= 0r |] ==>  (a [*] x = a [*] y) = (x = y)"
   335   "[| is_vectorspace V; x:V; y:V; a ~= 0r |] ==> 
       
   336   (a [*] x = a [*] y) = (x = y)"
   275   (concl is "?L = ?R");
   337   (concl is "?L = ?R");
   276 proof;
   338 proof;
   277   assume "is_vectorspace V" "x:V" "y:V" "a ~= 0r";
   339   assume "is_vectorspace V" "x:V" "y:V" "a ~= 0r";
   278   assume l: ?L;
   340   assume l: ?L;
   279   have "x = 1r [*] x"; by (simp!);
   341   have "x = 1r [*] x"; by (simp!);
   280   also; have "... = (rinv a * a) [*] x"; by (simp!);
   342   also; have "... = (rinv a * a) [*] x"; by (simp!);
   281   also; have "... = rinv a [*] (a [*] x)"; by (simp! only: vs_mult_assoc);
   343   also; have "... = rinv a [*] (a [*] x)"; 
       
   344     by (simp! only: vs_mult_assoc);
   282   also; have "... = rinv a [*] (a [*] y)"; by (simp only: l);
   345   also; have "... = rinv a [*] (a [*] y)"; by (simp only: l);
   283   also; have "... = y"; by (simp!);
   346   also; have "... = y"; by (simp!);
   284   finally; show ?R;.;
   347   finally; show ?R;.;
   285 next;
   348 next;
   286   assume ?R;
   349   assume ?R;
   287   thus ?L; by simp;
   350   thus ?L; by simp;
   288 qed;
   351 qed;
   289 
   352 
       
   353 lemma vs_mult_right_cancel: (*** forward ***)
       
   354   "[| is_vectorspace V; x:V; x ~= <0> |] ==>  (a [*] x = b [*] x) = (a = b)"
       
   355   (concl is "?L = ?R");
       
   356 proof;
       
   357   assume "is_vectorspace V" "x:V" "x ~= <0>";
       
   358   assume l: ?L;
       
   359   have "(a - b) [*] x = a [*] x [-] b [*] x"; by (simp! add: vs_diff_mult_distrib2);
       
   360   also; from l; have "a [*] x [-] b [*] x = <0>"; by (simp!);
       
   361   finally; have "(a - b) [*] x  = <0>"; .; 
       
   362   hence "a - b = 0r"; by (simp! add:  vs_mult_zero_uniq);
       
   363   thus "a = b"; by (rule real_add_minus_eq);
       
   364 next;
       
   365   assume ?R;
       
   366   thus ?L; by simp;
       
   367 qed; (*** backward :
   290 lemma vs_mult_right_cancel: 
   368 lemma vs_mult_right_cancel: 
   291   "[| is_vectorspace V; x:V; x ~= <0> |] ==>  (a [*] x = b [*] x) = (a = b)"
   369   "[| is_vectorspace V; x:V; x ~= <0> |] ==>  (a [*] x = b [*] x) = (a = b)"
   292   (concl is "?L = ?R");
   370   (concl is "?L = ?R");
   293 proof;
   371 proof;
   294   assume "is_vectorspace V" "x:V" "x ~= <0>";
   372   assume "is_vectorspace V" "x:V" "x ~= <0>";
   295   assume l: ?L;
   373   assume l: ?L; 
   296   show "a = b"; 
   374   show "a = b"; 
   297   proof (rule real_add_minus_eq);
   375   proof (rule real_add_minus_eq);
   298     show "a - b = 0r"; 
   376     show "a - b = 0r"; 
   299     proof (rule vs_mult_zero_uniq);
   377     proof (rule vs_mult_zero_uniq);
   300       have "(a - b) [*] x = a [*] x [-] b [*] x"; by (simp! add: vs_diff_mult_distrib2);
   378       have "(a - b) [*] x = a [*] x [-] b [*] x"; by (simp! add: vs_diff_mult_distrib2);
   304   qed;
   382   qed;
   305 next;
   383 next;
   306   assume ?R;
   384   assume ?R;
   307   thus ?L; by simp;
   385   thus ?L; by simp;
   308 qed;
   386 qed;
       
   387 **)
   309 
   388 
   310 lemma vs_eq_diff_eq: 
   389 lemma vs_eq_diff_eq: 
   311   "[| is_vectorspace V; x:V; y:V; z:V |] ==>  (x = z [-] y) = (x [+] y = z)"
   390   "[| is_vectorspace V; x:V; y:V; z:V |] ==> 
       
   391   (x = z [-] y) = (x [+] y = z)"
   312    (concl is "?L = ?R" );  
   392    (concl is "?L = ?R" );  
   313 proof -;
   393 proof -;
   314   assume vs: "is_vectorspace V" "x:V" "y:V" "z:V";
   394   assume vs: "is_vectorspace V" "x:V" "y:V" "z:V";
   315   show "?L = ?R";   
   395   show "?L = ?R";   
   316   proof;
   396   proof;
   317     assume l: ?L;
   397     assume l: ?L;
   318     have "x [+] y = z [-] y [+] y"; by (simp add: l);
   398     have "x [+] y = z [-] y [+] y"; by (simp add: l);
   319     also; have "... = z [+] [-] y [+] y"; by (simp only: vs_add_minus_eq_diff);
   399     also; have "... = z [+] [-] y [+] y"; by (unfold diff_def) simp;
   320     also; have "... = z [+] ([-] y [+] y)"; by (rule vs_add_assoc) (simp!)+;
   400     also; have "... = z [+] ([-] y [+] y)"; 
   321     also; from vs; have "... = z [+] <0>"; by (simp only: vs_add_minus_left);
   401       by (rule vs_add_assoc) (simp!)+;
       
   402     also; from vs; have "... = z [+] <0>"; 
       
   403       by (simp only: vs_add_minus_left);
   322     also; from vs; have "... = z"; by (simp only: vs_add_zero_right);
   404     also; from vs; have "... = z"; by (simp only: vs_add_zero_right);
   323     finally; show ?R;.;
   405     finally; show ?R;.;
   324   next;
   406   next;
   325     assume r: ?R;
   407     assume r: ?R;
   326     have "z [-] y = (x [+] y) [-] y"; by (simp only: r);
   408     have "z [-] y = (x [+] y) [-] y"; by (simp only: r);
   327     also; from vs; have "... = x [+] y [+] [-] y"; by (simp only: vs_add_minus_eq_diff);
   409     also; from vs; have "... = x [+] y [+] [-] y"; 
   328     also; have "... = x [+] (y [+] [-] y)"; by (rule vs_add_assoc) (simp!)+;
   410       by (unfold diff_def) simp;
       
   411     also; have "... = x [+] (y [+] [-] y)"; 
       
   412       by (rule vs_add_assoc) (simp!)+;
   329     also; have "... = x"; by (simp!);
   413     also; have "... = x"; by (simp!);
   330     finally; show ?L; by (rule sym);
   414     finally; show ?L; by (rule sym);
   331   qed;
   415   qed;
   332 qed;
   416 qed;
   333 
   417 
   334 lemma vs_add_minus_eq_minus: "[| is_vectorspace V; x:V; y:V; <0> = x [+] y|] ==> y = [-] x"; 
   418 lemma vs_add_minus_eq_minus: 
       
   419   "[| is_vectorspace V; x:V; y:V; <0> = x [+] y|] ==> y = [-] x"; 
   335 proof -;
   420 proof -;
   336   assume vs: "is_vectorspace V" "x:V" "y:V"; 
   421   assume vs: "is_vectorspace V" "x:V" "y:V"; 
   337   assume "<0> = x [+] y";
   422   assume "<0> = x [+] y";
   338   have "[-] x = [-] x [+] <0>"; by (simp!);
   423   have "[-] x = [-] x [+] <0>"; by (simp!);
   339   also; have "... = [-] x [+] (x [+] y)";  by (simp!);
   424   also; have "... = [-] x [+] (x [+] y)";  by (simp!);
   340   also; have "... = [-] x [+] x [+] y"; by (rule vs_add_assoc [RS sym]) (simp!)+;
   425   also; have "... = [-] x [+] x [+] y"; 
       
   426     by (rule vs_add_assoc [RS sym]) (simp!)+;
   341   also; have "... = (x [+] [-] x) [+] y"; by (simp!);
   427   also; have "... = (x [+] [-] x) [+] y"; by (simp!);
   342   also; have "... = y"; by (simp!);
   428   also; have "... = y"; by (simp!);
   343   finally; show ?thesis; by (rule sym);
   429   finally; show ?thesis; by (rule sym);
   344 qed;  
   430 qed;  
   345 
   431 
   346 lemma vs_add_minus_eq: "[| is_vectorspace V; x:V; y:V; x [-] y = <0> |] ==> x = y"; 
   432 lemma vs_add_minus_eq: 
       
   433   "[| is_vectorspace V; x:V; y:V; x [-] y = <0> |] ==> x = y"; 
   347 proof -;
   434 proof -;
   348   assume "is_vectorspace V" "x:V" "y:V" "x [-] y = <0>";
   435   assume "is_vectorspace V" "x:V" "y:V" "x [-] y = <0>";
   349   have "x [+] [-] y = x [-] y"; by (unfold diff_def, simp);
   436   have "x [+] [-] y = x [-] y"; by (unfold diff_def, simp);
   350   also; have "... = <0>"; .;
   437   also; have "... = <0>"; .;
   351   finally; have e: "<0> = x [+] [-] y"; by (rule sym);
   438   finally; have e: "<0> = x [+] [-] y"; by (rule sym);
   352   have "x = [-] [-] x"; by (simp!);
   439   have "x = [-] [-] x"; by (simp!);
   353   also; have "[-] x = [-] y"; by (rule vs_add_minus_eq_minus [RS sym]) (simp! add: e)+;
   440   also; have "[-] x = [-] y"; 
       
   441     by (rule vs_add_minus_eq_minus [RS sym]) (simp! add: e)+;
   354   also; have "[-] ... = y"; by (simp!); 
   442   also; have "[-] ... = y"; by (simp!); 
   355   finally; show "x = y"; .;
   443   finally; show "x = y"; .;
   356 qed;
   444 qed;
   357 
   445 
   358 lemma vs_add_diff_swap:
   446 lemma vs_add_diff_swap:
   359   "[| is_vectorspace V; a:V; b:V; c:V; d:V; a [+] b = c [+] d|] ==> a [-] c = d [-] b";
   447   "[| is_vectorspace V; a:V; b:V; c:V; d:V; a [+] b = c [+] d|] 
       
   448   ==> a [-] c = d [-] b";
   360 proof -; 
   449 proof -; 
   361   assume vs: "is_vectorspace V" "a:V" "b:V" "c:V" "d:V" and eq: "a [+] b = c [+] d";
   450   assume vs: "is_vectorspace V" "a:V" "b:V" "c:V" "d:V" 
   362   have "[-] c [+] (a [+] b) = [-] c [+] (c [+] d)"; by (simp! add: vs_add_left_cancel);
   451   and eq: "a [+] b = c [+] d";
       
   452   have "[-] c [+] (a [+] b) = [-] c [+] (c [+] d)"; 
       
   453     by (simp! add: vs_add_left_cancel);
   363   also; have "... = d"; by (rule vs_minus_add_cancel);
   454   also; have "... = d"; by (rule vs_minus_add_cancel);
   364   finally; have eq: "[-] c [+] (a [+] b) = d"; .;
   455   finally; have eq: "[-] c [+] (a [+] b) = d"; .;
   365   from vs; have "a [-] c = ([-] c [+] (a [+] b)) [+] [-] b"; by (simp add: vs_add_ac diff_def);
   456   from vs; have "a [-] c = ([-] c [+] (a [+] b)) [+] [-] b"; 
   366   also; from eq; have "...  = d [+] [-] b"; by (simp! add: vs_add_right_cancel);
   457     by (simp add: vs_add_ac diff_def);
       
   458   also; from eq; have "...  = d [+] [-] b"; 
       
   459     by (simp! add: vs_add_right_cancel);
   367   also; have "... = d [-] b"; by (simp add : diff_def);
   460   also; have "... = d [-] b"; by (simp add : diff_def);
   368   finally; show "a [-] c = d [-] b"; .;
   461   finally; show "a [-] c = d [-] b"; .;
   369 qed;
   462 qed;
   370 
   463 
   371 lemma vs_add_cancel_21: 
   464 lemma vs_add_cancel_21: 
   372   "[| is_vectorspace V; x:V; y:V; z:V; u:V|] ==> (x [+] (y [+] z) = y [+] u) = ((x [+] z) = u)"
   465   "[| is_vectorspace V; x:V; y:V; z:V; u:V|] 
       
   466   ==> (x [+] (y [+] z) = y [+] u) = ((x [+] z) = u)"
   373   (concl is "?L = ?R" ); 
   467   (concl is "?L = ?R" ); 
   374 proof -; 
   468 proof -; 
   375   assume vs: "is_vectorspace V" "x:V" "y:V""z:V" "u:V";
   469   assume vs: "is_vectorspace V" "x:V" "y:V""z:V" "u:V";
   376   show "?L = ?R";
   470   show "?L = ?R";
   377   proof;
   471   proof;
   378     assume l: ?L;
   472     assume l: ?L;
   379     have "u = <0> [+] u"; by (simp!);
   473     have "u = <0> [+] u"; by (simp!);
   380     also; have "... = [-] y [+] y [+] u"; by (simp!);
   474     also; have "... = [-] y [+] y [+] u"; by (simp!);
   381     also; have "... = [-] y [+] (y [+] u)"; by (rule vs_add_assoc) (simp!)+;
   475     also; have "... = [-] y [+] (y [+] u)"; 
       
   476       by (rule vs_add_assoc) (simp!)+;
   382     also; have "... = [-] y [+] (x [+] (y [+] z))"; by (simp only: l);
   477     also; have "... = [-] y [+] (x [+] (y [+] z))"; by (simp only: l);
   383     also; have "... = [-] y [+] (y [+] (x [+] z))"; by (simp!);
   478     also; have "... = [-] y [+] (y [+] (x [+] z))"; by (simp!);
   384     also; have "... = [-] y [+] y [+] (x [+] z)"; by (rule vs_add_assoc [RS sym]) (simp!)+;
   479     also; have "... = [-] y [+] y [+] (x [+] z)"; 
       
   480       by (rule vs_add_assoc [RS sym]) (simp!)+;
   385     also; have "... = (x [+] z)"; by (simp!);
   481     also; have "... = (x [+] z)"; by (simp!);
   386     finally; show ?R; by (rule sym);
   482     finally; show ?R; by (rule sym);
   387   next;
   483   next;
   388     assume r: ?R;
   484     assume r: ?R;
   389     have "x [+] (y [+] z) = y [+] (x [+] z)"; by (simp! only: vs_add_left_commute [of V x]);
   485     have "x [+] (y [+] z) = y [+] (x [+] z)"; 
       
   486       by (simp! only: vs_add_left_commute [of V x]);
   390     also; have "... = y [+] u"; by (simp only: r);
   487     also; have "... = y [+] u"; by (simp only: r);
   391     finally; show ?L; .;
   488     finally; show ?L; .;
   392   qed;
   489   qed;
   393 qed;
   490 qed;
   394 
   491 
   395 lemma vs_add_cancel_end: 
   492 lemma vs_add_cancel_end: 
   396   "[| is_vectorspace V;  x:V; y:V; z:V |] ==> (x [+] (y [+] z) = y) = (x = [-] z)"
   493   "[| is_vectorspace V;  x:V; y:V; z:V |] 
       
   494   ==> (x [+] (y [+] z) = y) = (x = [-] z)"
   397   (concl is "?L = ?R" );
   495   (concl is "?L = ?R" );
   398 proof -;
   496 proof -;
   399   assume vs: "is_vectorspace V" "x:V" "y:V" "z:V";
   497   assume vs: "is_vectorspace V" "x:V" "y:V" "z:V";
   400   show "?L = ?R";
   498   show "?L = ?R";
   401   proof;
   499   proof;
   402     assume l: ?L;
   500     assume l: ?L;
   403     have "<0> = x [+] z";
   501     have "<0> = x [+] z";
   404     proof (rule vs_add_left_cancel [RS iffD1]);
   502     proof (rule vs_add_left_cancel [RS iffD1]);
   405       have "y [+] <0> = y"; by (simp! only: vs_add_zero_right); 
   503       have "y [+] <0> = y"; by (simp! only: vs_add_zero_right); 
   406       also; have "... =  x [+] (y [+] z)"; by (simp only: l); 
   504       also; have "... =  x [+] (y [+] z)"; by (simp only: l); 
   407       also; have "... = y [+] (x [+] z)"; by (simp! only: vs_add_left_commute); 
   505       also; have "... = y [+] (x [+] z)"; 
       
   506         by (simp! only: vs_add_left_commute); 
   408       finally; show "y [+] <0> = y [+] (x [+] z)"; .;
   507       finally; show "y [+] <0> = y [+] (x [+] z)"; .;
   409   qed (simp!)+;
   508   qed (simp!)+;
   410     hence "z = [-] x"; by (simp! only: vs_add_minus_eq_minus);
   509     hence "z = [-] x"; by (simp! only: vs_add_minus_eq_minus);
   411     then; show ?R; by (simp!); 
   510     then; show ?R; by (simp!); 
   412   next;
   511   next;
   413     assume r: ?R;
   512     assume r: ?R;
   414     have "x [+] (y [+] z) = [-] z [+] (y [+] z)"; by (simp only: r); 
   513     have "x [+] (y [+] z) = [-] z [+] (y [+] z)"; by (simp only: r); 
   415     also; have "... = y [+] ([-] z [+] z)"; by (simp! only: vs_add_left_commute);
   514     also; have "... = y [+] ([-] z [+] z)"; 
       
   515       by (simp! only: vs_add_left_commute);
   416     also; have "... = y [+] <0>";  by (simp!);
   516     also; have "... = y [+] <0>";  by (simp!);
   417     also; have "... = y";  by (simp!);
   517     also; have "... = y";  by (simp!);
   418     finally; show ?L; .;
   518     finally; show ?L; .;
   419   qed;
   519   qed;
   420 qed;
   520 qed;
   421 
   521 
   422 lemma it: "[| x = y; x' = y'|] ==> x [+] x' = y [+] y'";
   522 lemma it: "[| x = y; x' = y'|] ==> x [+] x' = y [+] y'";
   423   by simp; 
   523   by simp; 
   424 
   524 
   425 
       
   426 end;
   525 end;