src/HOL/Complex/ComplexArith0.ML
changeset 14336 8f731d3cd65b
parent 14335 9c0b5e081037
child 14348 744c868ee0b7
equal deleted inserted replaced
14335:9c0b5e081037 14336:8f731d3cd65b
     2     Author:      Jacques D. Fleuriot
     2     Author:      Jacques D. Fleuriot
     3     Copyright:   2001  University of Edinburgh
     3     Copyright:   2001  University of Edinburgh
     4     Description: Assorted facts that need binary literals 
     4     Description: Assorted facts that need binary literals 
     5 		 Also, common factor cancellation (see e.g. HyperArith0)
     5 		 Also, common factor cancellation (see e.g. HyperArith0)
     6 *)
     6 *)
     7 
       
     8 (** Division and inverse **)
       
     9 
       
    10 Goal "0/x = (0::complex)";
       
    11 by (simp_tac (simpset() addsimps [complex_divide_def]) 1); 
       
    12 qed "complex_0_divide";
       
    13 Addsimps [complex_0_divide];
       
    14 
       
    15 Goalw [complex_divide_def] "x/(0::complex) = 0";
       
    16 by (stac COMPLEX_INVERSE_ZERO 1); 
       
    17 by (Simp_tac 1); 
       
    18 qed "COMPLEX_DIVIDE_ZERO";
       
    19 
       
    20 Goal "inverse (x::complex) = 1/x";
       
    21 by (simp_tac (simpset() addsimps [complex_divide_def]) 1); 
       
    22 qed "complex_inverse_eq_divide";
       
    23 
       
    24 Goal "(inverse(x::complex) = 0) = (x = 0)";
       
    25 by (auto_tac (claset(), 
       
    26               simpset() addsimps [COMPLEX_INVERSE_ZERO]));  
       
    27 qed "complex_inverse_zero_iff";
       
    28 Addsimps [complex_inverse_zero_iff];
       
    29 
       
    30 Goal "(x/y = 0) = (x=0 | y=(0::complex))";
       
    31 by (auto_tac (claset(), simpset() addsimps [complex_divide_def]));  
       
    32 qed "complex_divide_eq_0_iff";
       
    33 Addsimps [complex_divide_eq_0_iff];
       
    34 
       
    35 Goal "h ~= (0::complex) ==> h/h = 1";
       
    36 by (asm_simp_tac 
       
    37     (simpset() addsimps [complex_divide_def]) 1);
       
    38 qed "complex_divide_self_eq"; 
       
    39 Addsimps [complex_divide_self_eq];
       
    40 
       
    41 bind_thm ("complex_mult_minus_right", complex_minus_mult_eq2 RS sym);
       
    42 
       
    43 Goal "!!k::complex. (k*m = k*n) = (k = 0 | m=n)";
       
    44 by (case_tac "k=0" 1);
       
    45 by (auto_tac (claset(), simpset() addsimps [complex_mult_left_cancel]));  
       
    46 qed "complex_mult_eq_cancel1";
       
    47 
       
    48 Goal "!!k::complex. (m*k = n*k) = (k = 0 | m=n)";
       
    49 by (case_tac "k=0" 1);
       
    50 by (auto_tac (claset(), simpset() addsimps [complex_mult_right_cancel]));  
       
    51 qed "complex_mult_eq_cancel2";
       
    52 
       
    53 Goal "!!k::complex. k~=0 ==> (k*m) / (k*n) = (m/n)";
       
    54 by (asm_simp_tac
       
    55     (simpset() addsimps [complex_divide_def, complex_inverse_distrib]) 1); 
       
    56 by (subgoal_tac "k * m * (inverse k * inverse n) = \
       
    57 \                (k * inverse k) * (m * inverse n)" 1);
       
    58 by (Asm_full_simp_tac 1);
       
    59 by (asm_full_simp_tac (HOL_ss addsimps complex_mult_ac) 1); 
       
    60 qed "complex_mult_div_cancel1";
       
    61 
       
    62 (*For ExtractCommonTerm*)
       
    63 Goal "(k*m) / (k*n) = (if k = (0::complex) then 0 else m/n)";
       
    64 by (simp_tac (simpset() addsimps [complex_mult_div_cancel1]) 1); 
       
    65 qed "complex_mult_div_cancel_disj";
       
    66 
       
    67 
     7 
    68 local
     8 local
    69   open Complex_Numeral_Simprocs
     9   open Complex_Numeral_Simprocs
    70 in
    10 in
    71 
    11 
    88 structure DivCancelNumeralFactor = CancelNumeralFactorFun
    28 structure DivCancelNumeralFactor = CancelNumeralFactorFun
    89  (open CancelNumeralFactorCommon
    29  (open CancelNumeralFactorCommon
    90   val prove_conv = Bin_Simprocs.prove_conv
    30   val prove_conv = Bin_Simprocs.prove_conv
    91   val mk_bal   = HOLogic.mk_binop "HOL.divide"
    31   val mk_bal   = HOLogic.mk_binop "HOL.divide"
    92   val dest_bal = HOLogic.dest_bin "HOL.divide" complexT
    32   val dest_bal = HOLogic.dest_bin "HOL.divide" complexT
    93   val cancel = complex_mult_div_cancel1 RS trans
    33   val cancel = mult_divide_cancel_left RS trans
    94   val neg_exchanges = false
    34   val neg_exchanges = false
    95 )
    35 )
    96 
    36 
    97 
    37 
    98 structure EqCancelNumeralFactor = CancelNumeralFactorFun
    38 structure EqCancelNumeralFactor = CancelNumeralFactorFun
    99  (open CancelNumeralFactorCommon
    39  (open CancelNumeralFactorCommon
   100   val prove_conv = Bin_Simprocs.prove_conv
    40   val prove_conv = Bin_Simprocs.prove_conv
   101   val mk_bal   = HOLogic.mk_eq
    41   val mk_bal   = HOLogic.mk_eq
   102   val dest_bal = HOLogic.dest_bin "op =" complexT
    42   val dest_bal = HOLogic.dest_bin "op =" complexT
   103   val cancel = complex_mult_eq_cancel1 RS trans
    43   val cancel = field_mult_cancel_left RS trans
   104   val neg_exchanges = false
    44   val neg_exchanges = false
   105 )
    45 )
   106 
    46 
   107 val complex_cancel_numeral_factors_relations = 
    47 val complex_cancel_numeral_factors_relations = 
   108   map prep_simproc
    48   map prep_simproc
   172 structure EqCancelFactor = ExtractCommonTermFun
   112 structure EqCancelFactor = ExtractCommonTermFun
   173  (open CancelFactorCommon
   113  (open CancelFactorCommon
   174   val prove_conv = Bin_Simprocs.prove_conv
   114   val prove_conv = Bin_Simprocs.prove_conv
   175   val mk_bal   = HOLogic.mk_eq
   115   val mk_bal   = HOLogic.mk_eq
   176   val dest_bal = HOLogic.dest_bin "op =" complexT
   116   val dest_bal = HOLogic.dest_bin "op =" complexT
   177   val simplify_meta_eq  = cancel_simplify_meta_eq complex_mult_eq_cancel1
   117   val simplify_meta_eq  = cancel_simplify_meta_eq field_mult_cancel_left
   178 );
   118 );
   179 
   119 
   180 
   120 
   181 structure DivideCancelFactor = ExtractCommonTermFun
   121 structure DivideCancelFactor = ExtractCommonTermFun
   182  (open CancelFactorCommon
   122  (open CancelFactorCommon
   183   val prove_conv = Bin_Simprocs.prove_conv
   123   val prove_conv = Bin_Simprocs.prove_conv
   184   val mk_bal   = HOLogic.mk_binop "HOL.divide"
   124   val mk_bal   = HOLogic.mk_binop "HOL.divide"
   185   val dest_bal = HOLogic.dest_bin "HOL.divide" complexT
   125   val dest_bal = HOLogic.dest_bin "HOL.divide" complexT
   186   val simplify_meta_eq  = cancel_simplify_meta_eq complex_mult_div_cancel_disj
   126   val simplify_meta_eq  = cancel_simplify_meta_eq mult_divide_cancel_eq_if
   187 );
   127 );
   188 
   128 
   189 val complex_cancel_factor = 
   129 val complex_cancel_factor = 
   190   map prep_simproc
   130   map prep_simproc
   191    [("complex_eq_cancel_factor", ["(l::complex) * m = n", "(l::complex) = m * n"], 
   131    [("complex_eq_cancel_factor", ["(l::complex) * m = n", "(l::complex) = m * n"], 
   218 (*FIXME: what do we do about this?*)
   158 (*FIXME: what do we do about this?*)
   219 test "a*(b*c)/(y*z) = d*(b::complex)*(x*a)/z";
   159 test "a*(b*c)/(y*z) = d*(b::complex)*(x*a)/z";
   220 *)
   160 *)
   221 
   161 
   222 
   162 
   223 Goal "z~=0 ==> ((x::complex) = y/z) = (x*z = y)";
       
   224 by (subgoal_tac "(x*z = y) = (x*z = (y/z)*z)" 1);
       
   225 by (asm_simp_tac (simpset() addsimps [complex_divide_def, complex_mult_assoc]) 2); 
       
   226 by (etac ssubst 1);
       
   227 by (stac complex_mult_eq_cancel2 1); 
       
   228 by (Asm_simp_tac 1); 
       
   229 qed "complex_eq_divide_eq";
       
   230 Addsimps [inst "z" "number_of ?w" complex_eq_divide_eq];
       
   231 
       
   232 Goal "z~=0 ==> (y/z = (x::complex)) = (y = x*z)";
       
   233 by (subgoal_tac "(y = x*z) = ((y/z)*z = x*z)" 1);
       
   234 by (asm_simp_tac (simpset() addsimps [complex_divide_def, complex_mult_assoc]) 2); 
       
   235 by (etac ssubst 1);
       
   236 by (stac complex_mult_eq_cancel2 1); 
       
   237 by (Asm_simp_tac 1); 
       
   238 qed "complex_divide_eq_eq";
       
   239 Addsimps [inst "z" "number_of ?w" complex_divide_eq_eq];
       
   240 
       
   241 Goal "(m/k = n/k) = (k = 0 | m = (n::complex))";
       
   242 by (case_tac "k=0" 1);
       
   243 by (asm_simp_tac (simpset() addsimps [COMPLEX_DIVIDE_ZERO]) 1); 
       
   244 by (asm_simp_tac (simpset() addsimps [complex_divide_eq_eq, complex_eq_divide_eq, 
       
   245                                       complex_mult_eq_cancel2]) 1); 
       
   246 qed "complex_divide_eq_cancel2";
       
   247 
       
   248 Goal "(k/m = k/n) = (k = 0 | m = (n::complex))";
       
   249 by (case_tac "m=0 | n = 0" 1);
       
   250 by (auto_tac (claset(), 
       
   251               simpset() addsimps [COMPLEX_DIVIDE_ZERO, complex_divide_eq_eq, 
       
   252                                   complex_eq_divide_eq, complex_mult_eq_cancel1]));  
       
   253 qed "complex_divide_eq_cancel1";
       
   254 
       
   255 (** Division by 1, -1 **)
   163 (** Division by 1, -1 **)
   256 
       
   257 Goal "(x::complex)/1 = x";
       
   258 by (simp_tac (simpset() addsimps [complex_divide_def]) 1); 
       
   259 qed "complex_divide_1";
       
   260 Addsimps [complex_divide_1];
       
   261 
   164 
   262 Goal "x/-1 = -(x::complex)";
   165 Goal "x/-1 = -(x::complex)";
   263 by (Simp_tac 1); 
   166 by (Simp_tac 1); 
   264 qed "complex_divide_minus1";
   167 qed "complex_divide_minus1";
   265 Addsimps [complex_divide_minus1];
   168 Addsimps [complex_divide_minus1];
   267 Goal "-1/(x::complex) = - (1/x)";
   170 Goal "-1/(x::complex) = - (1/x)";
   268 by (simp_tac (simpset() addsimps [complex_divide_def, complex_minus_inverse]) 1); 
   171 by (simp_tac (simpset() addsimps [complex_divide_def, complex_minus_inverse]) 1); 
   269 qed "complex_minus1_divide";
   172 qed "complex_minus1_divide";
   270 Addsimps [complex_minus1_divide];
   173 Addsimps [complex_minus1_divide];
   271 
   174 
   272 
       
   273 Goal "(x = - y) = (y = - (x::complex))";
       
   274 by Auto_tac;
       
   275 qed "complex_equation_minus";
       
   276 
       
   277 Goal "(- x = y) = (- (y::complex) = x)";
       
   278 by Auto_tac;
       
   279 qed "complex_minus_equation";
       
   280 
       
   281 Goal "(x + - a = (0::complex)) = (x=a)";
   175 Goal "(x + - a = (0::complex)) = (x=a)";
   282 by (simp_tac (simpset() addsimps [complex_diff_eq_eq,symmetric complex_diff_def]) 1);
   176 by (simp_tac (simpset() addsimps [complex_diff_eq_eq,symmetric complex_diff_def]) 1);
   283 qed "complex_add_minus_iff";
   177 qed "complex_add_minus_iff";
   284 Addsimps [complex_add_minus_iff];
   178 Addsimps [complex_add_minus_iff];
   285 
       
   286 Goal "(-b = -a) = (b = (a::complex))";
       
   287 by Auto_tac;
       
   288 qed "complex_minus_eq_cancel";
       
   289 Addsimps [complex_minus_eq_cancel];
       
   290 
       
   291 (*Distributive laws for literals*)
       
   292 Addsimps (map (inst "w" "number_of ?v")
       
   293 	  [complex_add_mult_distrib, complex_add_mult_distrib2,
       
   294 	   complex_diff_mult_distrib, complex_diff_mult_distrib2]);
       
   295 
       
   296 Addsimps [inst "x" "number_of ?v" complex_equation_minus];
       
   297 
       
   298 Addsimps [inst "y" "number_of ?v" complex_minus_equation];
       
   299 
   179 
   300 Goal "(x+y = (0::complex)) = (y = -x)";
   180 Goal "(x+y = (0::complex)) = (y = -x)";
   301 by Auto_tac;
   181 by Auto_tac;
   302 by (dtac (sym RS (complex_diff_eq_eq RS iffD2)) 1);
   182 by (dtac (sym RS (complex_diff_eq_eq RS iffD2)) 1);
   303 by Auto_tac;  
   183 by Auto_tac;  
   304 qed "complex_add_eq_0_iff";
   184 qed "complex_add_eq_0_iff";
   305 AddIffs [complex_add_eq_0_iff];
   185 AddIffs [complex_add_eq_0_iff];
   306 
   186 
   307 Goalw [complex_diff_def]"-(x-y) = y - (x::complex)";
       
   308 by (auto_tac (claset(),simpset() addsimps [complex_add_commute]));
       
   309 qed "complex_minus_diff_eq";
       
   310 Addsimps [complex_minus_diff_eq];
       
   311 
   187 
   312 Addsimps [inst "x" "number_of ?w" complex_inverse_eq_divide];
       
   313