src/HOL/Complex/Complex.thy
changeset 14335 9c0b5e081037
parent 14334 6137d24eef79
child 14341 a09441bd4f1e
equal deleted inserted replaced
14334:6137d24eef79 14335:9c0b5e081037
   481 apply (rule_tac z = x in eq_Abs_complex)
   481 apply (rule_tac z = x in eq_Abs_complex)
   482 apply (rule_tac z = y in eq_Abs_complex)
   482 apply (rule_tac z = y in eq_Abs_complex)
   483 apply (auto simp add: complex_mult complex_minus real_diff_def)
   483 apply (auto simp add: complex_mult complex_minus real_diff_def)
   484 done
   484 done
   485 
   485 
   486 declare complex_minus_mult_eq1 [symmetric, simp] complex_minus_mult_eq2 [symmetric, simp]
       
   487 
       
   488 lemma complex_mult_minus_one: "-(1::complex) * z = -z"
       
   489 apply (simp (no_asm))
       
   490 done
       
   491 declare complex_mult_minus_one [simp]
       
   492 
       
   493 lemma complex_mult_minus_one_right: "z * -(1::complex) = -z"
       
   494 apply (subst complex_mult_commute)
       
   495 apply (simp (no_asm))
       
   496 done
       
   497 declare complex_mult_minus_one_right [simp]
       
   498 
       
   499 lemma complex_minus_mult_cancel: "-x * -y = x * (y::complex)"
       
   500 apply (simp (no_asm))
       
   501 done
       
   502 declare complex_minus_mult_cancel [simp]
       
   503 
       
   504 lemma complex_minus_mult_commute: "-x * y = x * -(y::complex)"
       
   505 apply (simp (no_asm))
       
   506 done
       
   507 
       
   508 lemma complex_add_mult_distrib: "((z1::complex) + z2) * w = (z1 * w) + (z2 * w)"
   486 lemma complex_add_mult_distrib: "((z1::complex) + z2) * w = (z1 * w) + (z2 * w)"
   509 apply (rule_tac z = z1 in eq_Abs_complex)
   487 apply (rule_tac z = z1 in eq_Abs_complex)
   510 apply (rule_tac z = z2 in eq_Abs_complex)
   488 apply (rule_tac z = z2 in eq_Abs_complex)
   511 apply (rule_tac z = w in eq_Abs_complex)
   489 apply (rule_tac z = w in eq_Abs_complex)
   512 apply (auto simp add: complex_mult complex_add left_distrib real_diff_def add_ac)
   490 apply (auto simp add: complex_mult complex_add left_distrib real_diff_def add_ac)
   539 
   517 
   540 lemma COMPLEX_DIVISION_BY_ZERO: "a / (0::complex) = 0"
   518 lemma COMPLEX_DIVISION_BY_ZERO: "a / (0::complex) = 0"
   541 apply (simp (no_asm) add: complex_divide_def COMPLEX_INVERSE_ZERO)
   519 apply (simp (no_asm) add: complex_divide_def COMPLEX_INVERSE_ZERO)
   542 done
   520 done
   543 
   521 
       
   522 instance complex :: division_by_zero
       
   523 proof
       
   524   fix x :: complex
       
   525   show "inverse 0 = (0::complex)" by (rule COMPLEX_INVERSE_ZERO)
       
   526   show "x/0 = 0" by (rule COMPLEX_DIVISION_BY_ZERO) 
       
   527 qed
       
   528 
   544 lemma complex_mult_inv_left: "z ~= (0::complex) ==> inverse(z) * z = 1"
   529 lemma complex_mult_inv_left: "z ~= (0::complex) ==> inverse(z) * z = 1"
   545 apply (rule_tac z = z in eq_Abs_complex)
   530 apply (rule_tac z = z in eq_Abs_complex)
   546 apply (auto simp add: complex_mult complex_inverse complex_one_def 
   531 apply (auto simp add: complex_mult complex_inverse complex_one_def 
   547        complex_zero_def add_divide_distrib [symmetric] real_power_two mult_ac)
   532        complex_zero_def add_divide_distrib [symmetric] real_power_two mult_ac)
   548 apply (drule_tac y = y in real_sum_squares_not_zero)
   533 apply (drule_tac y = y in real_sum_squares_not_zero)
   551 declare complex_mult_inv_left [simp]
   536 declare complex_mult_inv_left [simp]
   552 
   537 
   553 lemma complex_mult_inv_right: "z ~= (0::complex) ==> z * inverse(z) = 1"
   538 lemma complex_mult_inv_right: "z ~= (0::complex) ==> z * inverse(z) = 1"
   554 by (auto intro: complex_mult_commute [THEN subst])
   539 by (auto intro: complex_mult_commute [THEN subst])
   555 declare complex_mult_inv_right [simp]
   540 declare complex_mult_inv_right [simp]
       
   541 
       
   542 
       
   543 subsection {* The field of complex numbers *}
       
   544 
       
   545 instance complex :: field
       
   546 proof
       
   547   fix z u v w :: complex
       
   548   show "(u + v) + w = u + (v + w)"
       
   549     by (rule complex_add_assoc) 
       
   550   show "z + w = w + z"
       
   551     by (rule complex_add_commute) 
       
   552   show "0 + z = z"
       
   553     by (rule complex_add_zero_left) 
       
   554   show "-z + z = 0"
       
   555     by (rule complex_add_minus_left_zero) 
       
   556   show "z - w = z + -w"
       
   557     by (simp add: complex_diff_def)
       
   558   show "(u * v) * w = u * (v * w)"
       
   559     by (rule complex_mult_assoc) 
       
   560   show "z * w = w * z"
       
   561     by (rule complex_mult_commute) 
       
   562   show "1 * z = z"
       
   563     by (rule complex_mult_one_left) 
       
   564   show "0 \<noteq> (1::complex)"  --{*for some reason it has to be early*}
       
   565     by (rule complex_zero_not_eq_one) 
       
   566   show "(u + v) * w = u * w + v * w"
       
   567     by (rule complex_add_mult_distrib) 
       
   568   assume neq: "w \<noteq> 0"
       
   569   thus "z / w = z * inverse w"
       
   570     by (simp add: complex_divide_def)
       
   571   show "inverse w * w = 1"
       
   572     by (simp add: neq complex_mult_inv_left) 
       
   573 qed
       
   574 
       
   575 
       
   576 lemma complex_mult_minus_one: "-(1::complex) * z = -z"
       
   577 apply (simp (no_asm))
       
   578 done
       
   579 declare complex_mult_minus_one [simp]
       
   580 
       
   581 lemma complex_mult_minus_one_right: "z * -(1::complex) = -z"
       
   582 apply (subst complex_mult_commute)
       
   583 apply (simp (no_asm))
       
   584 done
       
   585 declare complex_mult_minus_one_right [simp]
       
   586 
       
   587 lemma complex_minus_mult_cancel: "-x * -y = x * (y::complex)"
       
   588 apply (simp (no_asm))
       
   589 done
       
   590 declare complex_minus_mult_cancel [simp]
       
   591 
       
   592 lemma complex_minus_mult_commute: "-x * y = x * -(y::complex)"
       
   593 apply (simp (no_asm))
       
   594 done
       
   595 
   556 
   596 
   557 lemma complex_mult_left_cancel: "(c::complex) ~= 0 ==> (c*a=c*b) = (a=b)"
   597 lemma complex_mult_left_cancel: "(c::complex) ~= 0 ==> (c*a=c*b) = (a=b)"
   558 apply auto
   598 apply auto
   559 apply (drule_tac f = "%x. x*inverse c" in arg_cong)
   599 apply (drule_tac f = "%x. x*inverse c" in arg_cong)
   560 apply (simp add: complex_mult_ac)
   600 apply (simp add: complex_mult_ac)
   601 apply (rule_tac c1 = "-x" in complex_mult_right_cancel [THEN iffD1], force)
   641 apply (rule_tac c1 = "-x" in complex_mult_right_cancel [THEN iffD1], force)
   602 apply (subst complex_mult_inv_left, auto)
   642 apply (subst complex_mult_inv_left, auto)
   603 done
   643 done
   604 
   644 
   605 lemma complex_inverse_distrib: "inverse(x*y) = inverse x * inverse (y::complex)"
   645 lemma complex_inverse_distrib: "inverse(x*y) = inverse x * inverse (y::complex)"
   606 apply (case_tac "x = 0", simp add: COMPLEX_INVERSE_ZERO)
   646 apply (rule inverse_mult_distrib) 
   607 apply (case_tac "y = 0", simp add: COMPLEX_INVERSE_ZERO)
       
   608 apply (rule_tac c1 = "x*y" in complex_mult_left_cancel [THEN iffD1])
       
   609 apply (auto simp add: complex_mult_not_zero complex_mult_ac)
       
   610 apply (auto simp add: complex_mult_not_zero complex_mult_assoc [symmetric])
       
   611 done
   647 done
   612 
   648 
   613 
   649 
   614 subsection{*Division*}
   650 subsection{*Division*}
   615 
   651