src/HOL/Hyperreal/Transcendental.thy
changeset 15234 ec91a90c604e
parent 15229 1eb23f805c06
child 15241 a3949068537e
equal deleted inserted replaced
15233:c55a12162944 15234:ec91a90c604e
   422 apply (subgoal_tac "\<bar>z ^ n\<bar> * inverse (\<bar>x\<bar> ^ n) = (\<bar>z\<bar> * inverse (\<bar>x\<bar>)) ^ n")
   422 apply (subgoal_tac "\<bar>z ^ n\<bar> * inverse (\<bar>x\<bar> ^ n) = (\<bar>z\<bar> * inverse (\<bar>x\<bar>)) ^ n")
   423 apply (auto simp add: power_abs [symmetric])
   423 apply (auto simp add: power_abs [symmetric])
   424 apply (subgoal_tac "x \<noteq> 0")
   424 apply (subgoal_tac "x \<noteq> 0")
   425 apply (subgoal_tac [3] "x \<noteq> 0")
   425 apply (subgoal_tac [3] "x \<noteq> 0")
   426 apply (auto simp del: abs_inverse abs_mult simp add: abs_inverse [symmetric] realpow_not_zero abs_mult [symmetric] power_inverse power_mult_distrib [symmetric])
   426 apply (auto simp del: abs_inverse abs_mult simp add: abs_inverse [symmetric] realpow_not_zero abs_mult [symmetric] power_inverse power_mult_distrib [symmetric])
   427 apply (auto intro!: geometric_sums simp add: power_abs inverse_eq_divide)
   427 apply (auto intro!: geometric_sums 
   428 apply (rule_tac c="\<bar>x\<bar>" in mult_right_less_imp_less) 
   428             simp add: power_abs inverse_eq_divide times_divide_eq)
   429 apply (auto simp add: abs_mult [symmetric] mult_assoc)
       
   430 done
   429 done
   431 
   430 
   432 lemma powser_inside:
   431 lemma powser_inside:
   433      "[| summable (%n. f(n) * (x ^ n)); \<bar>z\<bar> < \<bar>x\<bar> |]  
   432      "[| summable (%n. f(n) * (x ^ n)); \<bar>z\<bar> < \<bar>x\<bar> |]  
   434       ==> summable (%n. f(n) * (z ^ n))"
   433       ==> summable (%n. f(n) * (z ^ n))"
   910   have "1 < exp (y + - x)"
   909   have "1 < exp (y + - x)"
   911     by (rule real_less_sum_gt_zero [THEN exp_gt_one])
   910     by (rule real_less_sum_gt_zero [THEN exp_gt_one])
   912   hence "exp x * inverse (exp x) < exp y * inverse (exp x)"
   911   hence "exp x * inverse (exp x) < exp y * inverse (exp x)"
   913     by (auto simp add: exp_add exp_minus)
   912     by (auto simp add: exp_add exp_minus)
   914   thus ?thesis
   913   thus ?thesis
   915     by (simp add: divide_inverse [symmetric] pos_less_divide_eq 
   914     by (simp add: divide_inverse [symmetric] pos_less_divide_eq times_divide_eq
   916              del: divide_self_if)
   915              del: divide_self_if)
   917 qed
   916 qed
   918 
   917 
   919 lemma exp_less_cancel: "exp x < exp y ==> x < y"
   918 lemma exp_less_cancel: "exp x < exp y ==> x < y"
   920 apply (simp add: linorder_not_le [symmetric]) 
   919 apply (simp add: linorder_not_le [symmetric]) 
  1006 apply (rule order_less_le_trans)
  1005 apply (rule order_less_le_trans)
  1007 apply (rule_tac [2] ln_add_one_self_le_self)
  1006 apply (rule_tac [2] ln_add_one_self_le_self)
  1008 apply (rule ln_less_cancel_iff [THEN iffD2], auto)
  1007 apply (rule ln_less_cancel_iff [THEN iffD2], auto)
  1009 done
  1008 done
  1010 
  1009 
  1011 lemma ln_ge_zero:
  1010 lemma ln_ge_zero [simp]:
  1012   assumes x: "1 \<le> x" shows "0 \<le> ln x"
  1011   assumes x: "1 \<le> x" shows "0 \<le> ln x"
  1013 proof -
  1012 proof -
  1014   have "0 < x" using x by arith
  1013   have "0 < x" using x by arith
  1015   hence "exp 0 \<le> exp (ln x)"
  1014   hence "exp 0 \<le> exp (ln x)"
  1016     by (simp add: x exp_ln_iff [symmetric] del: exp_ln_iff)
  1015     by (simp add: x exp_ln_iff [symmetric] del: exp_ln_iff)
  1027 qed
  1026 qed
  1028 
  1027 
  1029 lemma ln_ge_zero_iff [simp]: "0 < x ==> (0 \<le> ln x) = (1 \<le> x)"
  1028 lemma ln_ge_zero_iff [simp]: "0 < x ==> (0 \<le> ln x) = (1 \<le> x)"
  1030 by (blast intro: ln_ge_zero ln_ge_zero_imp_ge_one)
  1029 by (blast intro: ln_ge_zero ln_ge_zero_imp_ge_one)
  1031 
  1030 
       
  1031 lemma ln_less_zero_iff [simp]: "0 < x ==> (ln x < 0) = (x < 1)"
       
  1032 by (insert ln_ge_zero_iff [of x], arith)
       
  1033 
  1032 lemma ln_gt_zero:
  1034 lemma ln_gt_zero:
  1033   assumes x: "1 < x" shows "0 < ln x"
  1035   assumes x: "1 < x" shows "0 < ln x"
  1034 proof -
  1036 proof -
  1035   have "0 < x" using x by arith
  1037   have "0 < x" using x by arith
  1036   hence "exp 0 < exp (ln x)"
  1038   hence "exp 0 < exp (ln x)"
  1048 qed
  1050 qed
  1049 
  1051 
  1050 lemma ln_gt_zero_iff [simp]: "0 < x ==> (0 < ln x) = (1 < x)"
  1052 lemma ln_gt_zero_iff [simp]: "0 < x ==> (0 < ln x) = (1 < x)"
  1051 by (blast intro: ln_gt_zero ln_gt_zero_imp_gt_one)
  1053 by (blast intro: ln_gt_zero ln_gt_zero_imp_gt_one)
  1052 
  1054 
  1053 lemma ln_not_eq_zero [simp]: "[| 0 < x; x \<noteq> 1 |] ==> ln x \<noteq> 0"
  1055 lemma ln_eq_zero_iff [simp]: "0 < x ==> (ln x = 0) = (x = 1)"
  1054 apply safe
  1056 by (insert ln_less_zero_iff [of x] ln_gt_zero_iff [of x], arith)
  1055 apply (drule exp_inj_iff [THEN iffD2])
       
  1056 apply (drule exp_ln_iff [THEN iffD2], auto)
       
  1057 done
       
  1058 
  1057 
  1059 lemma ln_less_zero: "[| 0 < x; x < 1 |] ==> ln x < 0"
  1058 lemma ln_less_zero: "[| 0 < x; x < 1 |] ==> ln x < 0"
  1060 apply (rule exp_less_cancel_iff [THEN iffD1])
  1059 by simp
  1061 apply (auto simp add: exp_ln_iff [symmetric] simp del: exp_ln_iff)
       
  1062 done
       
  1063 
  1060 
  1064 lemma exp_ln_eq: "exp u = x ==> ln x = u"
  1061 lemma exp_ln_eq: "exp u = x ==> ln x = u"
  1065 by auto
  1062 by auto
  1066 
  1063 
  1067 
  1064 
  1362 apply (rule_tac n1 = 0 in series_pos_less [THEN [2] order_le_less_trans])
  1359 apply (rule_tac n1 = 0 in series_pos_less [THEN [2] order_le_less_trans])
  1363 apply (auto simp del: fact_Suc realpow_Suc)
  1360 apply (auto simp del: fact_Suc realpow_Suc)
  1364 apply (erule sums_summable)
  1361 apply (erule sums_summable)
  1365 apply (case_tac "m=0")
  1362 apply (case_tac "m=0")
  1366 apply (simp (no_asm_simp))
  1363 apply (simp (no_asm_simp))
  1367 apply (subgoal_tac "6 * (x * (x * x) / real (Suc (Suc (Suc (Suc (Suc (Suc 0))))))) < 6 * x")
  1364 apply (subgoal_tac "6 * (x * (x * x) / real (Suc (Suc (Suc (Suc (Suc (Suc 0))))))) < 6 * x") 
  1368 apply (simp only: mult_less_cancel_left, simp)
  1365 apply (simp only: mult_less_cancel_left, simp add: times_divide_eq)  
  1369 apply (simp (no_asm_simp) add: numeral_2_eq_2 [symmetric] mult_assoc [symmetric])
  1366 apply (simp (no_asm_simp) add: times_divide_eq 
       
  1367                numeral_2_eq_2 [symmetric] mult_assoc [symmetric])
  1370 apply (subgoal_tac "x*x < 2*3", simp) 
  1368 apply (subgoal_tac "x*x < 2*3", simp) 
  1371 apply (rule mult_strict_mono)
  1369 apply (rule mult_strict_mono)
  1372 apply (auto simp add: real_0_less_add_iff real_of_nat_Suc simp del: fact_Suc)
  1370 apply (auto simp add: real_0_less_add_iff real_of_nat_Suc simp del: fact_Suc)
  1373 apply (subst fact_Suc)
  1371 apply (subst fact_Suc)
  1374 apply (subst fact_Suc)
  1372 apply (subst fact_Suc)
  1423 
  1421 
  1424 lemma cos_two_less_zero: "cos (2) < 0"
  1422 lemma cos_two_less_zero: "cos (2) < 0"
  1425 apply (cut_tac x = 2 in cos_paired)
  1423 apply (cut_tac x = 2 in cos_paired)
  1426 apply (drule sums_minus)
  1424 apply (drule sums_minus)
  1427 apply (rule neg_less_iff_less [THEN iffD1]) 
  1425 apply (rule neg_less_iff_less [THEN iffD1]) 
  1428 apply (frule sums_unique, auto)
  1426 apply (frule sums_unique, auto simp add: times_divide_eq)
  1429 apply (rule_tac y = "sumr 0 (Suc (Suc (Suc 0))) (%n. - ((- 1) ^ n / (real (fact (2 * n))) * 2 ^ (2 * n)))" in order_less_trans)
  1427 apply (rule_tac y = "sumr 0 (Suc (Suc (Suc 0))) (%n. - ((- 1) ^ n / (real (fact (2 * n))) * 2 ^ (2 * n)))" in order_less_trans)
  1430 apply (simp (no_asm) add: fact_num_eq_if realpow_num_eq_if del: fact_Suc realpow_Suc)
  1428 apply (simp (no_asm) add: fact_num_eq_if realpow_num_eq_if del: fact_Suc realpow_Suc)
  1431 apply (simp (no_asm) add: mult_assoc del: sumr_Suc)
  1429 apply (simp (no_asm) add: mult_assoc times_divide_eq del: sumr_Suc)
  1432 apply (rule sumr_pos_lt_pair)
  1430 apply (rule sumr_pos_lt_pair)
  1433 apply (erule sums_summable, safe)
  1431 apply (erule sums_summable, safe)
  1434 apply (simp (no_asm) add: divide_inverse real_0_less_add_iff mult_assoc [symmetric] 
  1432 apply (simp (no_asm) add: divide_inverse real_0_less_add_iff mult_assoc [symmetric] 
  1435             del: fact_Suc)
  1433             del: fact_Suc)
  1436 apply (rule real_mult_inverse_cancel2)
  1434 apply (rule real_mult_inverse_cancel2)
  1520 apply (cut_tac sin_gt_zero [OF pi_half_gt_zero pi_half_less_two])
  1518 apply (cut_tac sin_gt_zero [OF pi_half_gt_zero pi_half_less_two])
  1521 apply (auto simp add: numeral_2_eq_2)
  1519 apply (auto simp add: numeral_2_eq_2)
  1522 done
  1520 done
  1523 
  1521 
  1524 lemma cos_pi [simp]: "cos pi = -1"
  1522 lemma cos_pi [simp]: "cos pi = -1"
  1525 by (cut_tac x = "pi/2" and y = "pi/2" in cos_add, simp)
  1523 by (cut_tac x = "pi/2" and y = "pi/2" in cos_add, simp add: times_divide_eq)
  1526 
  1524 
  1527 lemma sin_pi [simp]: "sin pi = 0"
  1525 lemma sin_pi [simp]: "sin pi = 0"
  1528 by (cut_tac x = "pi/2" and y = "pi/2" in sin_add, simp)
  1526 by (cut_tac x = "pi/2" and y = "pi/2" in sin_add, simp add: times_divide_eq)
  1529 
  1527 
  1530 lemma sin_cos_eq: "sin x = cos (pi/2 - x)"
  1528 lemma sin_cos_eq: "sin x = cos (pi/2 - x)"
  1531 by (simp add: diff_minus cos_add)
  1529 by (simp add: diff_minus cos_add)
  1532 
  1530 
  1533 lemma minus_sin_cos_eq: "-sin x = cos (x + pi/2)"
  1531 lemma minus_sin_cos_eq: "-sin x = cos (x + pi/2)"
  1701 apply (cut_tac linorder_linear [of 0 x], safe)
  1699 apply (cut_tac linorder_linear [of 0 x], safe)
  1702 apply (drule cos_zero_lemma, assumption+)
  1700 apply (drule cos_zero_lemma, assumption+)
  1703 apply (cut_tac x="-x" in cos_zero_lemma, simp, simp) 
  1701 apply (cut_tac x="-x" in cos_zero_lemma, simp, simp) 
  1704 apply (force simp add: minus_equation_iff [of x]) 
  1702 apply (force simp add: minus_equation_iff [of x]) 
  1705 apply (auto simp only: odd_Suc_mult_two_ex real_of_nat_Suc left_distrib) 
  1703 apply (auto simp only: odd_Suc_mult_two_ex real_of_nat_Suc left_distrib) 
  1706 apply (auto simp add: cos_add)
  1704 apply (auto simp add: cos_add times_divide_eq)
  1707 done
  1705 done
  1708 
  1706 
  1709 (* ditto: but to a lesser extent *)
  1707 (* ditto: but to a lesser extent *)
  1710 lemma sin_zero_iff:
  1708 lemma sin_zero_iff:
  1711      "(sin x = 0) =  
  1709      "(sin x = 0) =  
  1714 apply (rule iffI)
  1712 apply (rule iffI)
  1715 apply (cut_tac linorder_linear [of 0 x], safe)
  1713 apply (cut_tac linorder_linear [of 0 x], safe)
  1716 apply (drule sin_zero_lemma, assumption+)
  1714 apply (drule sin_zero_lemma, assumption+)
  1717 apply (cut_tac x="-x" in sin_zero_lemma, simp, simp, safe)
  1715 apply (cut_tac x="-x" in sin_zero_lemma, simp, simp, safe)
  1718 apply (force simp add: minus_equation_iff [of x]) 
  1716 apply (force simp add: minus_equation_iff [of x]) 
  1719 apply (auto simp add: even_mult_two_ex)
  1717 apply (auto simp add: even_mult_two_ex times_divide_eq)
  1720 done
  1718 done
  1721 
  1719 
  1722 
  1720 
  1723 subsection{*Tangent*}
  1721 subsection{*Tangent*}
  1724 
  1722 
  1744 apply (auto simp del: inverse_mult_distrib 
  1742 apply (auto simp del: inverse_mult_distrib 
  1745             simp add: inverse_mult_distrib [symmetric] mult_ac)
  1743             simp add: inverse_mult_distrib [symmetric] mult_ac)
  1746 apply (rule_tac c1 = "cos x * cos y" in real_mult_right_cancel [THEN subst])
  1744 apply (rule_tac c1 = "cos x * cos y" in real_mult_right_cancel [THEN subst])
  1747 apply (auto simp del: inverse_mult_distrib 
  1745 apply (auto simp del: inverse_mult_distrib 
  1748             simp add: mult_assoc left_diff_distrib cos_add)
  1746             simp add: mult_assoc left_diff_distrib cos_add)
  1749 done
  1747 done  
  1750 
  1748 
  1751 lemma add_tan_eq: 
  1749 lemma add_tan_eq: 
  1752       "[| cos x \<noteq> 0; cos y \<noteq> 0 |]  
  1750       "[| cos x \<noteq> 0; cos y \<noteq> 0 |]  
  1753        ==> tan x + tan y = sin(x + y)/(cos x * cos y)"
  1751        ==> tan x + tan y = sin(x + y)/(cos x * cos y)"
  1754 apply (simp add: tan_def)
  1752 apply (simp add: tan_def)
  1755 apply (rule_tac c1 = "cos x * cos y" in real_mult_right_cancel [THEN subst])
  1753 apply (rule_tac c1 = "cos x * cos y" in real_mult_right_cancel [THEN subst])
  1756 apply (auto simp add: mult_assoc left_distrib)
  1754 apply (auto simp add: mult_assoc left_distrib)
  1757 apply (simp (no_asm) add: sin_add)
  1755 apply (simp add: sin_add times_divide_eq)
  1758 done
  1756 done
  1759 
  1757 
  1760 lemma tan_add:
  1758 lemma tan_add:
  1761      "[| cos x \<noteq> 0; cos y \<noteq> 0; cos (x + y) \<noteq> 0 |]  
  1759      "[| cos x \<noteq> 0; cos y \<noteq> 0; cos (x + y) \<noteq> 0 |]  
  1762       ==> tan(x + y) = (tan(x) + tan(y))/(1 - tan(x) * tan(y))"
  1760       ==> tan(x + y) = (tan(x) + tan(y))/(1 - tan(x) * tan(y))"
  2063 
  2061 
  2064 lemma isCont_exp [simp]: "isCont exp x"
  2062 lemma isCont_exp [simp]: "isCont exp x"
  2065 by (rule DERIV_exp [THEN DERIV_isCont])
  2063 by (rule DERIV_exp [THEN DERIV_isCont])
  2066 
  2064 
  2067 lemma sin_zero_abs_cos_one: "sin x = 0 ==> \<bar>cos x\<bar> = 1"
  2065 lemma sin_zero_abs_cos_one: "sin x = 0 ==> \<bar>cos x\<bar> = 1"
  2068 by (auto simp add: sin_zero_iff even_mult_two_ex)
  2066 by (auto simp add: sin_zero_iff even_mult_two_ex times_divide_eq)
  2069 
  2067 
  2070 lemma exp_eq_one_iff [simp]: "(exp x = 1) = (x = 0)"
  2068 lemma exp_eq_one_iff [simp]: "(exp x = 1) = (x = 0)"
  2071 apply auto
  2069 apply auto
  2072 apply (drule_tac f = ln in arg_cong, auto)
  2070 apply (drule_tac f = ln in arg_cong, auto)
  2073 done
  2071 done
  2128 
  2126 
  2129 lemma real_root_mult:
  2127 lemma real_root_mult:
  2130      "[| 0 \<le> x; 0 \<le> y |] 
  2128      "[| 0 \<le> x; 0 \<le> y |] 
  2131       ==> root(Suc n) (x * y) = root(Suc n) x * root(Suc n) y"
  2129       ==> root(Suc n) (x * y) = root(Suc n) x * root(Suc n) y"
  2132 apply (rule real_root_pos_unique)
  2130 apply (rule real_root_pos_unique)
  2133 apply (auto intro!: real_root_pos_pos_le simp add: power_mult_distrib zero_le_mult_iff real_root_pow_pos2 simp del: realpow_Suc)
  2131 apply (auto intro!: real_root_pos_pos_le 
       
  2132             simp add: power_mult_distrib zero_le_mult_iff real_root_pow_pos2 
       
  2133             simp del: realpow_Suc)
  2134 done
  2134 done
  2135 
  2135 
  2136 lemma real_root_inverse:
  2136 lemma real_root_inverse:
  2137      "0 \<le> x ==> (root(Suc n) (inverse x) = inverse(root(Suc n) x))"
  2137      "0 \<le> x ==> (root(Suc n) (inverse x) = inverse(root(Suc n) x))"
  2138 apply (rule real_root_pos_unique)
  2138 apply (rule real_root_pos_unique)
  2139 apply (auto intro: real_root_pos_pos_le simp add: power_inverse [symmetric] real_root_pow_pos2 simp del: realpow_Suc)
  2139 apply (auto intro: real_root_pos_pos_le 
       
  2140             simp add: power_inverse [symmetric] real_root_pow_pos2 
       
  2141             simp del: realpow_Suc)
  2140 done
  2142 done
  2141 
  2143 
  2142 lemma real_root_divide: 
  2144 lemma real_root_divide: 
  2143      "[| 0 \<le> x; 0 \<le> y |]  
  2145      "[| 0 \<le> x; 0 \<le> y |]  
  2144       ==> (root(Suc n) (x / y) = root(Suc n) x / root(Suc n) y)"
  2146       ==> (root(Suc n) (x / y) = root(Suc n) x / root(Suc n) y)"
  2447 
  2449 
  2448 lemma real_sqrt_two_gt_one [simp]: "1 < sqrt 2"
  2450 lemma real_sqrt_two_gt_one [simp]: "1 < sqrt 2"
  2449 apply (rule order_less_le_trans [of _ "7/5"], simp) 
  2451 apply (rule order_less_le_trans [of _ "7/5"], simp) 
  2450 apply (rule_tac n = 1 in realpow_increasing)
  2452 apply (rule_tac n = 1 in realpow_increasing)
  2451   prefer 3 apply (simp add: numeral_2_eq_2 [symmetric] del: realpow_Suc)
  2453   prefer 3 apply (simp add: numeral_2_eq_2 [symmetric] del: realpow_Suc)
  2452 apply (simp_all add: numeral_2_eq_2)
  2454 apply (simp_all add: numeral_2_eq_2 times_divide_eq)
  2453 done
  2455 done
  2454 
  2456 
  2455 lemma lemma_real_divide_sqrt_less: "0 < u ==> u / sqrt 2 < u"
  2457 lemma lemma_real_divide_sqrt_less: "0 < u ==> u / sqrt 2 < u"
  2456 by (rule_tac z1 = "inverse u" in real_mult_less_iff1 [THEN iffD1], auto)
  2458 by (simp add: divide_less_eq mult_compare_simps) 
  2457 
  2459 
  2458 lemma four_x_squared: 
  2460 lemma four_x_squared: 
  2459   fixes x::real
  2461   fixes x::real
  2460   shows "4 * x\<twosuperior> = (2 * x)\<twosuperior>"
  2462   shows "4 * x\<twosuperior> = (2 * x)\<twosuperior>"
  2461 by (simp add: power2_eq_square)
  2463 by (simp add: power2_eq_square)
  2688 val ln_realpow = thm "ln_realpow";
  2690 val ln_realpow = thm "ln_realpow";
  2689 val ln_add_one_self_le_self = thm "ln_add_one_self_le_self";
  2691 val ln_add_one_self_le_self = thm "ln_add_one_self_le_self";
  2690 val ln_less_self = thm "ln_less_self";
  2692 val ln_less_self = thm "ln_less_self";
  2691 val ln_ge_zero = thm "ln_ge_zero";
  2693 val ln_ge_zero = thm "ln_ge_zero";
  2692 val ln_gt_zero = thm "ln_gt_zero";
  2694 val ln_gt_zero = thm "ln_gt_zero";
  2693 val ln_not_eq_zero = thm "ln_not_eq_zero";
       
  2694 val ln_less_zero = thm "ln_less_zero";
  2695 val ln_less_zero = thm "ln_less_zero";
  2695 val exp_ln_eq = thm "exp_ln_eq";
  2696 val exp_ln_eq = thm "exp_ln_eq";
  2696 val sin_zero = thm "sin_zero";
  2697 val sin_zero = thm "sin_zero";
  2697 val cos_zero = thm "cos_zero";
  2698 val cos_zero = thm "cos_zero";
  2698 val DERIV_sin_sin_mult = thm "DERIV_sin_sin_mult";
  2699 val DERIV_sin_sin_mult = thm "DERIV_sin_sin_mult";