src/HOL/Real/RealOrd.ML
author paulson
Wed, 20 Dec 2000 12:15:52 +0100
changeset 10712 351ba950d4d9
parent 10699 f0c3da8477e9
child 10752 c4f1bf2acf4c
permissions -rw-r--r--
further tidying
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
     1
(*  Title:       HOL/Real/Real.ML
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
     2
    ID:          $Id$
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
     3
    Author:      Jacques D. Fleuriot and Lawrence C. Paulson
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
     4
    Copyright:   1998  University of Cambridge
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
     5
    Description: Type "real" is a linear order
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
     6
*)
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
     7
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
     8
(**** The simproc abel_cancel ****)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
     9
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    10
(*** Two lemmas needed for the simprocs ***)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    11
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    12
(*Deletion of other terms in the formula, seeking the -x at the front of z*)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    13
Goal "((x::real) + (y + z) = y + u) = ((x + z) = u)";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    14
by (stac real_add_left_commute 1);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    15
by (rtac real_add_left_cancel 1);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    16
qed "real_add_cancel_21";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    17
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    18
(*A further rule to deal with the case that
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    19
  everything gets cancelled on the right.*)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    20
Goal "((x::real) + (y + z) = y) = (x = -z)";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    21
by (stac real_add_left_commute 1);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    22
by (res_inst_tac [("t", "y")] (real_add_zero_right RS subst) 1
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    23
    THEN stac real_add_left_cancel 1);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    24
by (simp_tac (simpset() addsimps [real_eq_diff_eq RS sym]) 1);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    25
qed "real_add_cancel_end";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    26
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    27
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    28
structure Real_Cancel_Data =
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    29
struct
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    30
  val ss		= HOL_ss
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    31
  val eq_reflection	= eq_reflection
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    32
9434
d2fa043ab24f do nat pass theory value, but sg_ref;
wenzelm
parents: 9081
diff changeset
    33
  val sg_ref		= Sign.self_ref (Theory.sign_of (the_context ()))
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    34
  val T			= HOLogic.realT
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    35
  val zero		= Const ("0", T)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    36
  val restrict_to_left  = restrict_to_left
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    37
  val add_cancel_21	= real_add_cancel_21
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    38
  val add_cancel_end	= real_add_cancel_end
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    39
  val add_left_cancel	= real_add_left_cancel
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    40
  val add_assoc		= real_add_assoc
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    41
  val add_commute	= real_add_commute
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    42
  val add_left_commute	= real_add_left_commute
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    43
  val add_0		= real_add_zero_left
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    44
  val add_0_right	= real_add_zero_right
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    45
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    46
  val eq_diff_eq	= real_eq_diff_eq
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    47
  val eqI_rules		= [real_less_eqI, real_eq_eqI, real_le_eqI]
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    48
  fun dest_eqI th = 
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    49
      #1 (HOLogic.dest_bin "op =" HOLogic.boolT 
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    50
	      (HOLogic.dest_Trueprop (concl_of th)))
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    51
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    52
  val diff_def		= real_diff_def
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    53
  val minus_add_distrib	= real_minus_add_distrib
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    54
  val minus_minus	= real_minus_minus
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    55
  val minus_0		= real_minus_zero
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
    56
  val add_inverses	= [real_add_minus, real_add_minus_left]
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    57
  val cancel_simps	= [real_add_minus_cancel, real_minus_add_cancel]
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    58
end;
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    59
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    60
structure Real_Cancel = Abel_Cancel (Real_Cancel_Data);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    61
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    62
Addsimprocs [Real_Cancel.sum_conv, Real_Cancel.rel_conv];
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    63
9081
d54b2c41fe0e new lemma real_minus_diff_eq
paulson
parents: 9069
diff changeset
    64
Goal "- (z - y) = y - (z::real)";
d54b2c41fe0e new lemma real_minus_diff_eq
paulson
parents: 9069
diff changeset
    65
by (Simp_tac 1);
d54b2c41fe0e new lemma real_minus_diff_eq
paulson
parents: 9069
diff changeset
    66
qed "real_minus_diff_eq";
d54b2c41fe0e new lemma real_minus_diff_eq
paulson
parents: 9069
diff changeset
    67
Addsimps [real_minus_diff_eq];
d54b2c41fe0e new lemma real_minus_diff_eq
paulson
parents: 9069
diff changeset
    68
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    69
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    70
(**** Theorems about the ordering ****)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    71
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    72
Goal "(0 < x) = (EX y. x = real_of_preal y)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    73
by (auto_tac (claset(), simpset() addsimps [real_of_preal_zero_less]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    74
by (cut_inst_tac [("x","x")] real_of_preal_trichotomy 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    75
by (blast_tac (claset() addSEs [real_less_irrefl,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    76
				real_of_preal_not_minus_gt_zero RS notE]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    77
qed "real_gt_zero_preal_Ex";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    78
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    79
Goal "real_of_preal z < x ==> EX y. x = real_of_preal y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    80
by (blast_tac (claset() addSDs [real_of_preal_zero_less RS real_less_trans]
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    81
               addIs [real_gt_zero_preal_Ex RS iffD1]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    82
qed "real_gt_preal_preal_Ex";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    83
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    84
Goal "real_of_preal z <= x ==> EX y. x = real_of_preal y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    85
by (blast_tac (claset() addDs [real_le_imp_less_or_eq,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    86
			       real_gt_preal_preal_Ex]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    87
qed "real_ge_preal_preal_Ex";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    88
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    89
Goal "y <= 0 ==> ALL x. y < real_of_preal x";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    90
by (auto_tac (claset() addEs [real_le_imp_less_or_eq RS disjE]
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    91
                       addIs [real_of_preal_zero_less RSN(2,real_less_trans)],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    92
              simpset() addsimps [real_of_preal_zero_less]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    93
qed "real_less_all_preal";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    94
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    95
Goal "~ 0 < y ==> ALL x. y < real_of_preal x";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    96
by (blast_tac (claset() addSIs [real_less_all_preal,real_leI]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    97
qed "real_less_all_real2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
    98
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
    99
Goal "[| R + L = S;  (0::real) < L |] ==> R < S";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   100
by (rtac (real_less_sum_gt_0_iff RS iffD1) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   101
by (auto_tac (claset(), simpset() addsimps real_add_ac));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   102
qed "real_lemma_add_positive_imp_less";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   103
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   104
Goal "EX T::real. 0 < T & R + T = S ==> R < S";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   105
by (blast_tac (claset() addIs [real_lemma_add_positive_imp_less]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   106
qed "real_ex_add_positive_left_less";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   107
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   108
(*Alternative definition for real_less.  NOT for rewriting*)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   109
Goal "(R < S) = (EX T::real. 0 < T & R + T = S)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   110
by (blast_tac (claset() addSIs [real_less_add_positive_left_Ex,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   111
				real_ex_add_positive_left_less]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   112
qed "real_less_iff_add";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   113
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   114
Goal "(real_of_preal m1 <= real_of_preal m2) = (m1 <= m2)";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   115
by (auto_tac (claset() addSIs [preal_leI],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   116
    simpset() addsimps [real_less_le_iff RS sym]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   117
by (dtac preal_le_less_trans 1 THEN assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   118
by (etac preal_less_irrefl 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   119
qed "real_of_preal_le_iff";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   120
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   121
Goal "[| 0 < x; 0 < y |] ==> (0::real) < x * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   122
by (auto_tac (claset(), simpset() addsimps [real_gt_zero_preal_Ex]));  
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   123
by (res_inst_tac [("x","y*ya")] exI 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   124
by (full_simp_tac (simpset() addsimps [real_of_preal_mult]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   125
qed "real_mult_order";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   126
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   127
Goal "[| x < 0; y < 0 |] ==> (0::real) < x * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   128
by (REPEAT(dtac (real_minus_zero_less_iff RS iffD2) 1));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   129
by (dtac real_mult_order 1 THEN assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   130
by (Asm_full_simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   131
qed "real_mult_less_zero1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   132
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   133
Goal "[| 0 <= x; 0 <= y |] ==> (0::real) <= x * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   134
by (REPEAT(dtac real_le_imp_less_or_eq 1));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   135
by (auto_tac (claset() addIs [real_mult_order, real_less_imp_le],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   136
	      simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   137
qed "real_le_mult_order";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   138
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   139
Goal "[| 0 < x; 0 <= y |] ==> (0::real) <= x * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   140
by (dtac real_le_imp_less_or_eq 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   141
by (auto_tac (claset() addIs [real_mult_order,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   142
			      real_less_imp_le],simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   143
qed "real_less_le_mult_order";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   144
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   145
Goal "[| x <= 0; y <= 0 |] ==> (0::real) <= x * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   146
by (rtac real_less_or_eq_imp_le 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   147
by (dtac real_le_imp_less_or_eq 1 THEN etac disjE 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   148
by Auto_tac;
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   149
by (dtac real_le_imp_less_or_eq 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   150
by (auto_tac (claset() addDs [real_mult_less_zero1],simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   151
qed "real_mult_le_zero1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   152
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   153
Goal "[| 0 <= x; y < 0 |] ==> x * y <= (0::real)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   154
by (rtac real_less_or_eq_imp_le 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   155
by (dtac real_le_imp_less_or_eq 1 THEN etac disjE 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   156
by Auto_tac;
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   157
by (dtac (real_minus_zero_less_iff RS iffD2) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   158
by (rtac (real_minus_zero_less_iff RS subst) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   159
by (blast_tac (claset() addDs [real_mult_order] 
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   160
	                addIs [real_minus_mult_eq2 RS ssubst]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   161
qed "real_mult_le_zero";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   162
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   163
Goal "[| 0 < x; y < 0 |] ==> x*y < (0::real)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   164
by (dtac (real_minus_zero_less_iff RS iffD2) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   165
by (dtac real_mult_order 1 THEN assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   166
by (rtac (real_minus_zero_less_iff RS iffD1) 1);
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   167
by (Asm_full_simp_tac 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   168
qed "real_mult_less_zero";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   169
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   170
Goalw [real_one_def] "0 < 1r";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   171
by (auto_tac (claset() addIs [real_gt_zero_preal_Ex RS iffD2],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   172
	      simpset() addsimps [real_of_preal_def]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   173
qed "real_zero_less_one";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   174
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   175
(*** Monotonicity results ***)
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   176
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   177
Goal "(v+z < w+z) = (v < (w::real))";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   178
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   179
qed "real_add_right_cancel_less";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   180
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   181
Goal "(z+v < z+w) = (v < (w::real))";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   182
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   183
qed "real_add_left_cancel_less";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   184
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   185
Addsimps [real_add_right_cancel_less, real_add_left_cancel_less];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   186
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   187
Goal "(v+z <= w+z) = (v <= (w::real))";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   188
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   189
qed "real_add_right_cancel_le";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   190
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   191
Goal "(z+v <= z+w) = (v <= (w::real))";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   192
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   193
qed "real_add_left_cancel_le";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   194
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   195
Addsimps [real_add_right_cancel_le, real_add_left_cancel_le];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   196
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   197
(*"v<=w ==> v+z <= w+z"*)
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   198
bind_thm ("real_add_less_mono1", real_add_right_cancel_less RS iffD2);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   199
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   200
(*"v<=w ==> v+z <= w+z"*)
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   201
bind_thm ("real_add_le_mono1", real_add_right_cancel_le RS iffD2);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   202
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   203
Goal "!!z z'::real. [| w'<w; z'<=z |] ==> w' + z' < w + z";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   204
by (etac (real_add_less_mono1 RS real_less_le_trans) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   205
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   206
qed "real_add_less_le_mono";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   207
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   208
Goal "!!z z'::real. [| w'<=w; z'<z |] ==> w' + z' < w + z";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   209
by (etac (real_add_le_mono1 RS real_le_less_trans) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   210
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   211
qed "real_add_le_less_mono";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   212
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   213
Goal "!!(A::real). A < B ==> C + A < C + B";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   214
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   215
qed "real_add_less_mono2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   216
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   217
Goal "!!(A::real). A + C < B + C ==> A < B";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   218
by (Full_simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   219
qed "real_less_add_right_cancel";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   220
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   221
Goal "!!(A::real). C + A < C + B ==> A < B";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   222
by (Full_simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   223
qed "real_less_add_left_cancel";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   224
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   225
Goal "!!(A::real). A + C <= B + C ==> A <= B";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   226
by (Full_simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   227
qed "real_le_add_right_cancel";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   228
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   229
Goal "!!(A::real). C + A <= C + B ==> A <= B";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   230
by (Full_simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   231
qed "real_le_add_left_cancel";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   232
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   233
Goal "[| 0 < x; 0 < y |] ==> (0::real) < x + y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   234
by (etac real_less_trans 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   235
by (dtac real_add_less_mono2 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   236
by (Full_simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   237
qed "real_add_order";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   238
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   239
Goal "[| 0 <= x; 0 <= y |] ==> (0::real) <= x + y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   240
by (REPEAT(dtac real_le_imp_less_or_eq 1));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   241
by (auto_tac (claset() addIs [real_add_order, real_less_imp_le],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   242
	      simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   243
qed "real_le_add_order";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   244
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   245
Goal "[| R1 < S1; R2 < S2 |] ==> R1 + R2 < S1 + (S2::real)";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   246
by (dtac real_add_less_mono1 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   247
by (etac real_less_trans 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   248
by (etac real_add_less_mono2 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   249
qed "real_add_less_mono";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   250
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   251
Goal "!!(q1::real). q1 <= q2  ==> x + q1 <= x + q2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   252
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   253
qed "real_add_left_le_mono1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   254
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   255
Goal "[|i<=j;  k<=l |] ==> i + k <= j + (l::real)";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   256
by (dtac real_add_le_mono1 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   257
by (etac real_le_trans 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   258
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   259
qed "real_add_le_mono";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   260
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   261
Goal "EX (x::real). x < y";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   262
by (rtac (real_add_zero_right RS subst) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   263
by (res_inst_tac [("x","y + (-1r)")] exI 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   264
by (auto_tac (claset() addSIs [real_add_less_mono2],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   265
	  simpset() addsimps [real_minus_zero_less_iff2, real_zero_less_one]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   266
qed "real_less_Ex";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   267
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   268
Goal "(0::real) < r ==>  u + (-r) < u";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   269
by (res_inst_tac [("C","r")] real_less_add_right_cancel 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   270
by (simp_tac (simpset() addsimps [real_add_assoc]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   271
qed "real_add_minus_positive_less_self";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   272
10699
f0c3da8477e9 more tidying
paulson
parents: 10677
diff changeset
   273
Goal "(-s <= -r) = ((r::real) <= s)";
f0c3da8477e9 more tidying
paulson
parents: 10677
diff changeset
   274
by (rtac sym 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   275
by (Step_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   276
by (dres_inst_tac [("x","-s")] real_add_left_le_mono1 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   277
by (dres_inst_tac [("x","r")] real_add_left_le_mono1 2);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   278
by Auto_tac;
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   279
by (dres_inst_tac [("z","-r")] real_add_le_mono1 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   280
by (dres_inst_tac [("z","s")] real_add_le_mono1 2);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   281
by (auto_tac (claset(), simpset() addsimps [real_add_assoc]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   282
qed "real_le_minus_iff";
10699
f0c3da8477e9 more tidying
paulson
parents: 10677
diff changeset
   283
Addsimps [real_le_minus_iff];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   284
          
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   285
Goal "0 <= 1r";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   286
by (rtac (real_zero_less_one RS real_less_imp_le) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   287
qed "real_zero_le_one";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   288
Addsimps [real_zero_le_one];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   289
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   290
Goal "(0::real) <= x*x";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   291
by (res_inst_tac [("R2.0","0"),("R1.0","x")] real_linear_less2 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   292
by (auto_tac (claset() addIs [real_mult_order,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   293
			      real_mult_less_zero1,real_less_imp_le],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   294
	      simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   295
qed "real_le_square";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   296
Addsimps [real_le_square];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   297
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   298
(*----------------------------------------------------------------------------
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   299
             An embedding of the naturals in the reals
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   300
 ----------------------------------------------------------------------------*)
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   301
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   302
Goalw [real_of_posnat_def] "real_of_posnat 0 = 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   303
by (full_simp_tac (simpset() addsimps [pnat_one_iff RS sym,real_of_preal_def]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   304
by (fold_tac [real_one_def]);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   305
by (rtac refl 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   306
qed "real_of_posnat_one";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   307
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   308
Goalw [real_of_posnat_def] "real_of_posnat 1 = 1r + 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   309
by (full_simp_tac (simpset() addsimps [real_of_preal_def,real_one_def,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   310
    pnat_two_eq,real_add,prat_of_pnat_add RS sym,preal_of_prat_add RS sym
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   311
    ] @ pnat_add_ac) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   312
qed "real_of_posnat_two";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   313
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   314
Goalw [real_of_posnat_def]
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   315
    "real_of_posnat n1 + real_of_posnat n2 = real_of_posnat (n1 + n2) + 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   316
by (full_simp_tac (simpset() addsimps [real_of_posnat_one RS sym,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   317
    real_of_posnat_def,real_of_preal_add RS sym,preal_of_prat_add RS sym,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   318
    prat_of_pnat_add RS sym,pnat_of_nat_add]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   319
qed "real_of_posnat_add";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   320
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   321
Goal "real_of_posnat (n + 1) = real_of_posnat n + 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   322
by (res_inst_tac [("x1","1r")] (real_add_right_cancel RS iffD1) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   323
by (rtac (real_of_posnat_add RS subst) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   324
by (full_simp_tac (simpset() addsimps [real_of_posnat_two,real_add_assoc]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   325
qed "real_of_posnat_add_one";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   326
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   327
Goal "real_of_posnat (Suc n) = real_of_posnat n + 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   328
by (stac (real_of_posnat_add_one RS sym) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   329
by (Simp_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   330
qed "real_of_posnat_Suc";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   331
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   332
Goal "inj(real_of_posnat)";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   333
by (rtac injI 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   334
by (rewtac real_of_posnat_def);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   335
by (dtac (inj_real_of_preal RS injD) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   336
by (dtac (inj_preal_of_prat RS injD) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   337
by (dtac (inj_prat_of_pnat RS injD) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   338
by (etac (inj_pnat_of_nat RS injD) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   339
qed "inj_real_of_posnat";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   340
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   341
Goalw [real_of_posnat_def] "0 < real_of_posnat n";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   342
by (rtac (real_gt_zero_preal_Ex RS iffD2) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   343
by (Blast_tac 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   344
qed "real_of_posnat_gt_zero";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   345
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   346
Goal "real_of_posnat n ~= 0";
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   347
by (rtac (real_of_posnat_gt_zero RS real_not_refl2 RS not_sym) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   348
qed "real_of_posnat_not_eq_zero";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   349
Addsimps[real_of_posnat_not_eq_zero];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   350
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   351
Goal "1r <= real_of_posnat n";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   352
by (simp_tac (simpset() addsimps [real_of_posnat_one RS sym]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   353
by (induct_tac "n" 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   354
by (auto_tac (claset(),
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   355
	      simpset () addsimps [real_of_posnat_Suc,real_of_posnat_one,
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   356
			   real_of_posnat_gt_zero, real_less_imp_le]));
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   357
qed "real_of_posnat_less_one";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   358
Addsimps [real_of_posnat_less_one];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   359
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   360
Goal "inverse (real_of_posnat n) ~= 0";
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   361
by (rtac ((real_of_posnat_gt_zero RS 
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   362
    real_not_refl2 RS not_sym) RS real_inverse_not_zero) 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   363
qed "real_of_posnat_inverse_not_zero";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   364
Addsimps [real_of_posnat_inverse_not_zero];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   365
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   366
Goal "inverse (real_of_posnat x) = inverse (real_of_posnat y) ==> x = y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   367
by (rtac (inj_real_of_posnat RS injD) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   368
by (res_inst_tac [("n2","x")] 
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   369
    (real_of_posnat_inverse_not_zero RS real_mult_left_cancel RS iffD1) 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   370
by (full_simp_tac (simpset() addsimps [(real_of_posnat_gt_zero RS 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   371
    real_not_refl2 RS not_sym) RS real_mult_inv_left]) 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   372
by (asm_full_simp_tac (simpset() addsimps [(real_of_posnat_gt_zero RS 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   373
    real_not_refl2 RS not_sym)]) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   374
qed "real_of_posnat_inverse_inj";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   375
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   376
Goal "0 < x ==> 0 < inverse (x::real)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   377
by (EVERY1[rtac ccontr, dtac real_leI]);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   378
by (forward_tac [real_minus_zero_less_iff2 RS iffD2] 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   379
by (forward_tac [real_not_refl2 RS not_sym] 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   380
by (dtac (real_not_refl2 RS not_sym RS real_inverse_not_zero) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   381
by (EVERY1[dtac real_le_imp_less_or_eq, Step_tac]); 
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   382
by (dtac real_mult_less_zero1 1 THEN assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   383
by (auto_tac (claset() addIs [real_zero_less_one RS real_less_asym],
9053
paulson
parents: 9043
diff changeset
   384
	      simpset()));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   385
qed "real_inverse_gt_zero";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   386
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   387
Goal "x < 0 ==> inverse (x::real) < 0";
7499
23e090051cb8 isatool expandshort;
wenzelm
parents: 7334
diff changeset
   388
by (ftac real_not_refl2 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   389
by (dtac (real_minus_zero_less_iff RS iffD2) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   390
by (rtac (real_minus_zero_less_iff RS iffD1) 1);
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   391
by (stac (real_minus_inverse RS sym) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   392
by (auto_tac (claset() addIs [real_inverse_gt_zero], simpset()));
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   393
qed "real_inverse_less_zero";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   394
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   395
Goal "0 < inverse (real_of_posnat n)";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   396
by (rtac (real_of_posnat_gt_zero RS real_inverse_gt_zero) 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   397
qed "real_of_posnat_inverse_gt_zero";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   398
Addsimps [real_of_posnat_inverse_gt_zero];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   399
10043
a0364652e115 Updated Files with new theorems
fleuriot
parents: 9825
diff changeset
   400
Goal "real_of_preal (preal_of_prat (prat_of_pnat (pnat_of_nat N))) = \
a0364652e115 Updated Files with new theorems
fleuriot
parents: 9825
diff changeset
   401
\     real_of_nat (Suc N)";
a0364652e115 Updated Files with new theorems
fleuriot
parents: 9825
diff changeset
   402
by (simp_tac (simpset() addsimps [real_of_nat_def,real_of_posnat_Suc,
a0364652e115 Updated Files with new theorems
fleuriot
parents: 9825
diff changeset
   403
    real_add_assoc,(real_of_posnat_def RS meta_eq_to_obj_eq) RS sym]) 1);
a0364652e115 Updated Files with new theorems
fleuriot
parents: 9825
diff changeset
   404
qed "real_of_preal_real_of_nat_Suc";
a0364652e115 Updated Files with new theorems
fleuriot
parents: 9825
diff changeset
   405
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   406
Goal "x+x = x*(1r+1r)";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   407
by (simp_tac (simpset() addsimps [real_add_mult_distrib2]) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   408
qed "real_add_self";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   409
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   410
Goal "x < x + 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   411
by (rtac (real_less_sum_gt_0_iff RS iffD1) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   412
by (full_simp_tac (simpset() addsimps [real_zero_less_one,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   413
				real_add_assoc, real_add_left_commute]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   414
qed "real_self_less_add_one";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   415
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   416
Goal "1r < 1r + 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   417
by (rtac real_self_less_add_one 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   418
qed "real_one_less_two";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   419
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   420
Goal "0 < 1r + 1r";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   421
by (rtac ([real_zero_less_one,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   422
	   real_one_less_two] MRS real_less_trans) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   423
qed "real_zero_less_two";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   424
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   425
Goal "1r + 1r ~= 0";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   426
by (rtac (real_zero_less_two RS real_not_refl2 RS not_sym) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   427
qed "real_two_not_zero";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   428
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   429
Addsimps [real_two_not_zero];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   430
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   431
Goal "x * inverse (1r + 1r) + x * inverse(1r + 1r) = x";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   432
by (stac real_add_self 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   433
by (full_simp_tac (simpset() addsimps [real_mult_assoc]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   434
qed "real_sum_of_halves";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   435
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   436
Goal "[| (0::real) < z; x < y |] ==> x*z < y*z";       
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   437
by (rotate_tac 1 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   438
by (dtac real_less_sum_gt_zero 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   439
by (rtac real_sum_gt_zero_less 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   440
by (dtac real_mult_order 1 THEN assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   441
by (asm_full_simp_tac (simpset() addsimps [real_add_mult_distrib2,
9053
paulson
parents: 9043
diff changeset
   442
					   real_mult_commute ]) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   443
qed "real_mult_less_mono1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   444
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   445
Goal "[| (0::real) < z; x < y |] ==> z * x < z * y";       
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   446
by (asm_simp_tac (simpset() addsimps [real_mult_commute,real_mult_less_mono1]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   447
qed "real_mult_less_mono2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   448
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   449
Goal "[| (0::real) < z; x * z < y * z |] ==> x < y";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   450
by (forw_inst_tac [("x","x*z")] (real_inverse_gt_zero 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   451
                       RS real_mult_less_mono1) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   452
by (auto_tac (claset(),
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   453
	      simpset() addsimps 
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   454
     [real_mult_assoc,real_not_refl2 RS not_sym]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   455
qed "real_mult_less_cancel1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   456
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   457
Goal "[| (0::real) < z; z*x < z*y |] ==> x < y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   458
by (etac real_mult_less_cancel1 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   459
by (asm_full_simp_tac (simpset() addsimps [real_mult_commute]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   460
qed "real_mult_less_cancel2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   461
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   462
Goal "(0::real) < z ==> (x*z < y*z) = (x < y)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   463
by (blast_tac (claset() addIs [real_mult_less_mono1,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   464
    real_mult_less_cancel1]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   465
qed "real_mult_less_iff1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   466
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   467
Goal "(0::real) < z ==> (z*x < z*y) = (x < y)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   468
by (blast_tac (claset() addIs [real_mult_less_mono2,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   469
    real_mult_less_cancel2]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   470
qed "real_mult_less_iff2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   471
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   472
Addsimps [real_mult_less_iff1,real_mult_less_iff2];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   473
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   474
(* 05/00 *)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   475
Goalw [real_le_def] "(0::real) < z ==> (x*z <= y*z) = (x <= y)";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   476
by (Auto_tac);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   477
qed "real_mult_le_cancel_iff1";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   478
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   479
Goalw [real_le_def] "(0::real) < z ==> (z*x <= z*y) = (x <= y)";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   480
by (Auto_tac);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   481
qed "real_mult_le_cancel_iff2";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   482
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   483
Addsimps [real_mult_le_cancel_iff1,real_mult_le_cancel_iff2];
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   484
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   485
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   486
Goal "[| (0::real) <= z; x < y |] ==> x*z <= y*z";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   487
by (EVERY1 [rtac real_less_or_eq_imp_le, dtac real_le_imp_less_or_eq]);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   488
by (auto_tac (claset() addIs [real_mult_less_mono1],simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   489
qed "real_mult_le_less_mono1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   490
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   491
Goal "[| (0::real) <= z; x < y |] ==> z*x <= z*y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   492
by (asm_simp_tac (simpset() addsimps [real_mult_commute,real_mult_le_less_mono1]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   493
qed "real_mult_le_less_mono2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   494
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   495
Goal "[| (0::real) <= z; x <= y |] ==> z*x <= z*y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   496
by (dres_inst_tac [("x","x")] real_le_imp_less_or_eq 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   497
by (auto_tac (claset() addIs [real_mult_le_less_mono2], simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   498
qed "real_mult_le_le_mono1";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   499
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   500
Goal "[| (0::real) < r1; r1 < r2; 0 < x; x < y|] ==> r1 * x < r2 * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   501
by (dres_inst_tac [("x","x")] real_mult_less_mono2 1);
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   502
by (dres_inst_tac [("R1.0","0")] real_less_trans 2);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   503
by (dres_inst_tac [("x","r1")] real_mult_less_mono1 3);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   504
by Auto_tac;
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   505
by (blast_tac (claset() addIs [real_less_trans]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   506
qed "real_mult_less_mono";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   507
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   508
Goal "[| (0::real) < r1; r1  < r2;  0 < y|] ==> 0 < r2 * y";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   509
by (rtac real_mult_order 1); 
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   510
by (assume_tac 2);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   511
by (blast_tac (claset() addIs [real_less_trans]) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   512
qed "real_mult_order_trans";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   513
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   514
Goal "[| (0::real) < r1; r1  < r2;  0 <= x; x < y|] ==> r1 * x < r2 * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   515
by (auto_tac (claset() addSDs [real_le_imp_less_or_eq] 
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   516
	               addIs [real_mult_less_mono,real_mult_order_trans],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   517
              simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   518
qed "real_mult_less_mono3";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   519
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   520
Goal "[| (0::real) <= r1; r1  < r2;  0 <= x; x < y|] ==> r1 * x < r2 * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   521
by (auto_tac (claset() addSDs [real_le_imp_less_or_eq] 
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   522
	               addIs [real_mult_less_mono,real_mult_order_trans,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   523
			      real_mult_order],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   524
	      simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   525
by (dres_inst_tac [("R2.0","x")] real_less_trans 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   526
by (assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   527
by (blast_tac (claset() addIs [real_mult_order]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   528
qed "real_mult_less_mono4";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   529
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   530
Goal "[| (0::real) < r1; r1 <= r2;  0 <= x; x <= y |] ==> r1 * x <= r2 * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   531
by (rtac real_less_or_eq_imp_le 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   532
by (REPEAT(dtac real_le_imp_less_or_eq 1));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   533
by (auto_tac (claset() addIs [real_mult_less_mono,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   534
			      real_mult_order_trans,real_mult_order],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   535
	      simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   536
qed "real_mult_le_mono";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   537
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   538
Goal "[| (0::real) < r1; r1 < r2;  0 <= x; x <= y |] ==> r1 * x <= r2 * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   539
by (rtac real_less_or_eq_imp_le 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   540
by (REPEAT(dtac real_le_imp_less_or_eq 1));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   541
by (auto_tac (claset() addIs [real_mult_less_mono, real_mult_order_trans,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   542
			      real_mult_order],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   543
	      simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   544
qed "real_mult_le_mono2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   545
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   546
Goal "[| (0::real) <= r1; r1 < r2;  0 <= x; x <= y |] ==> r1 * x <= r2 * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   547
by (dtac real_le_imp_less_or_eq 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   548
by (auto_tac (claset() addIs [real_mult_le_mono2],simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   549
by (dtac real_le_trans 1 THEN assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   550
by (auto_tac (claset() addIs [real_less_le_mult_order], simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   551
qed "real_mult_le_mono3";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   552
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   553
Goal "[| (0::real) <= r1; r1 <= r2;  0 <= x; x <= y |] ==> r1 * x <= r2 * y";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   554
by (dres_inst_tac [("x","r1")] real_le_imp_less_or_eq 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   555
by (auto_tac (claset() addIs [real_mult_le_mono3, real_mult_le_le_mono1],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   556
	      simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   557
qed "real_mult_le_mono4";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   558
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   559
Goal "1r <= x ==> 0 < x";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   560
by (rtac ccontr 1 THEN dtac real_leI 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   561
by (dtac real_le_trans 1 THEN assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   562
by (auto_tac (claset() addDs [real_zero_less_one RSN (2,real_le_less_trans)],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   563
	      simpset() addsimps [real_less_not_refl]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   564
qed "real_gt_zero";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   565
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   566
Goal "[| 1r < r; 1r <= x |]  ==> x <= r * x";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   567
by (dtac (real_gt_zero RS real_less_imp_le) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   568
by (auto_tac (claset() addSDs [real_mult_le_less_mono1],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   569
    simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   570
qed "real_mult_self_le";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   571
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   572
Goal "[| 1r <= r; 1r <= x |]  ==> x <= r * x";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   573
by (dtac real_le_imp_less_or_eq 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   574
by (auto_tac (claset() addIs [real_mult_self_le],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   575
	      simpset() addsimps [real_le_refl]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   576
qed "real_mult_self_le2";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   577
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   578
Goal "(EX n. inverse (real_of_posnat n) < r) = (EX n. 1r < r * real_of_posnat n)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   579
by (Step_tac 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   580
by (dres_inst_tac [("n1","n")] (real_of_posnat_gt_zero 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   581
				RS real_mult_less_mono1) 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   582
by (dres_inst_tac [("n2","n")] (real_of_posnat_gt_zero RS 
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   583
				real_inverse_gt_zero RS real_mult_less_mono1) 2);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   584
by (auto_tac (claset(),
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   585
	      simpset() addsimps [(real_of_posnat_gt_zero RS 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   586
				   real_not_refl2 RS not_sym),
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   587
				  real_mult_assoc]));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   588
qed "real_of_posnat_inverse_Ex_iff";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   589
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   590
Goal "(inverse(real_of_posnat n) < r) = (1r < r * real_of_posnat n)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   591
by (Step_tac 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   592
by (dres_inst_tac [("n1","n")] (real_of_posnat_gt_zero 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   593
                       RS real_mult_less_mono1) 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   594
by (dres_inst_tac [("n2","n")] (real_of_posnat_gt_zero RS 
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   595
				real_inverse_gt_zero RS real_mult_less_mono1) 2);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   596
by (auto_tac (claset(), simpset() addsimps [real_mult_assoc]));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   597
qed "real_of_posnat_inverse_iff";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   598
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   599
Goal "(inverse (real_of_posnat n) <= r) = (1r <= r * real_of_posnat n)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   600
by (Step_tac 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   601
by (dres_inst_tac [("n2","n")] (real_of_posnat_gt_zero RS 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   602
    real_less_imp_le RS real_mult_le_le_mono1) 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   603
by (dres_inst_tac [("n3","n")] (real_of_posnat_gt_zero RS 
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   604
        real_inverse_gt_zero RS real_less_imp_le RS 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   605
        real_mult_le_le_mono1) 2);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   606
by (auto_tac (claset(), simpset() addsimps real_mult_ac));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   607
qed "real_of_posnat_inverse_le_iff";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   608
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   609
Goalw [real_of_posnat_def] "(real_of_posnat n < real_of_posnat m) = (n < m)";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   610
by Auto_tac;
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   611
qed "real_of_posnat_less_iff";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   612
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   613
Addsimps [real_of_posnat_less_iff];
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   614
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   615
Goal "0 < u  ==> (u < inverse (real_of_posnat n)) = (real_of_posnat n < inverse u)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   616
by (Step_tac 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   617
by (res_inst_tac [("n2","n")] (real_of_posnat_gt_zero RS 
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   618
    real_inverse_gt_zero RS real_mult_less_cancel1) 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   619
by (res_inst_tac [("x1","u")] ( real_inverse_gt_zero
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   620
   RS real_mult_less_cancel1) 2);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   621
by (auto_tac (claset(),
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   622
	      simpset() addsimps [real_of_posnat_gt_zero, 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   623
    real_not_refl2 RS not_sym]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   624
by (res_inst_tac [("z","u")] real_mult_less_cancel2 1);
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   625
by (res_inst_tac [("n1","n")] (real_of_posnat_gt_zero RS 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   626
    real_mult_less_cancel2) 3);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   627
by (auto_tac (claset(),
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   628
	      simpset() addsimps [real_of_posnat_gt_zero, 
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   629
    real_not_refl2 RS not_sym,real_mult_assoc RS sym]));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   630
qed "real_of_posnat_less_inverse_iff";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   631
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   632
Goal "0 < u ==> (u = inverse (real_of_posnat n)) = (real_of_posnat n = inverse u)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   633
by (auto_tac (claset(),
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   634
	      simpset() addsimps [real_inverse_inverse, real_of_posnat_gt_zero, 
9825
a0fcf6f0436c Renamed real_of_posnat_less_zero to real_of_posnat_gt_zero
paulson
parents: 9434
diff changeset
   635
				  real_not_refl2 RS not_sym]));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   636
qed "real_of_posnat_inverse_eq_iff";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   637
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   638
Goal "[| 0 < r; r < x |] ==> inverse x < inverse (r::real)";
7499
23e090051cb8 isatool expandshort;
wenzelm
parents: 7334
diff changeset
   639
by (ftac real_less_trans 1 THEN assume_tac 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   640
by (ftac real_inverse_gt_zero 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   641
by (forw_inst_tac [("x","x")] real_inverse_gt_zero 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   642
by (forw_inst_tac [("x","r"),("z","inverse r")] real_mult_less_mono1 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   643
by (assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   644
by (asm_full_simp_tac (simpset() addsimps [real_not_refl2 RS 
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   645
					   not_sym RS real_mult_inv_right]) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   646
by (ftac real_inverse_gt_zero 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   647
by (forw_inst_tac [("x","1r"),("z","inverse x")] real_mult_less_mono2 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   648
by (assume_tac 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   649
by (asm_full_simp_tac (simpset() addsimps [real_not_refl2 RS 
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   650
         not_sym RS real_mult_inv_left,real_mult_assoc RS sym]) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   651
qed "real_inverse_less_swap";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   652
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   653
Goal "r < r + inverse (real_of_posnat n)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   654
by (res_inst_tac [("C","-r")] real_less_add_left_cancel 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   655
by (full_simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   656
qed "real_add_inverse_real_of_posnat_less";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   657
Addsimps [real_add_inverse_real_of_posnat_less];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   658
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   659
Goal "r <= r + inverse (real_of_posnat n)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   660
by (rtac real_less_imp_le 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   661
by (Simp_tac 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   662
qed "real_add_inverse_real_of_posnat_le";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   663
Addsimps [real_add_inverse_real_of_posnat_le];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   664
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   665
Goal "r + (-inverse (real_of_posnat n)) < r";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   666
by (res_inst_tac [("C","-r")] real_less_add_left_cancel 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   667
by (full_simp_tac (simpset() addsimps [real_add_assoc RS sym,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   668
				       real_minus_zero_less_iff2]) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   669
qed "real_add_minus_inverse_real_of_posnat_less";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   670
Addsimps [real_add_minus_inverse_real_of_posnat_less];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   671
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   672
Goal "r + (-inverse (real_of_posnat n)) <= r";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   673
by (rtac real_less_imp_le 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   674
by (Simp_tac 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   675
qed "real_add_minus_inverse_real_of_posnat_le";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   676
Addsimps [real_add_minus_inverse_real_of_posnat_le];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   677
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   678
Goal "0 < r ==> r*(1r + (-inverse (real_of_posnat n))) < r";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   679
by (simp_tac (simpset() addsimps [real_add_mult_distrib2]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   680
by (res_inst_tac [("C","-r")] real_less_add_left_cancel 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   681
by (auto_tac (claset() addIs [real_mult_order],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   682
	      simpset() addsimps [real_add_assoc RS sym,
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   683
				  real_minus_zero_less_iff2]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   684
qed "real_mult_less_self";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   685
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   686
Goal "0 <= 1r + (-inverse (real_of_posnat n))";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   687
by (res_inst_tac [("C","inverse (real_of_posnat n)")] real_le_add_right_cancel 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   688
by (simp_tac (simpset() addsimps [real_add_assoc,
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   689
				  real_of_posnat_inverse_le_iff]) 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   690
qed "real_add_one_minus_inverse_ge_zero";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   691
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   692
Goal "0 < r ==> 0 <= r*(1r + (-inverse (real_of_posnat n)))";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   693
by (dtac (real_add_one_minus_inverse_ge_zero RS real_mult_le_less_mono1) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   694
by Auto_tac;
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   695
qed "real_mult_add_one_minus_ge_zero";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   696
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   697
Goal "(x*y = 0) = (x = 0 | y = (0::real))";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   698
by Auto_tac;
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   699
by (blast_tac (claset() addIs [ccontr] addDs [real_mult_not_zero]) 1);
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   700
qed "real_mult_is_0";
10712
351ba950d4d9 further tidying
paulson
parents: 10699
diff changeset
   701
AddIffs [real_mult_is_0];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   702
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   703
Goal "[| 0 <= x * y; 0 < x |] ==> (0::real) <= y";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   704
by (ftac real_inverse_gt_zero 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   705
by (dres_inst_tac [("x","inverse x")] real_less_le_mult_order 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   706
by (dtac (real_not_refl2 RS not_sym RS real_mult_inv_left) 2);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   707
by (auto_tac (claset(),
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   708
	      simpset() addsimps [real_mult_assoc RS sym]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   709
qed "real_mult_ge_zero_cancel";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   710
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   711
Goal "[|x ~= 0; y ~= 0 |] ==> inverse x + inverse y = (x + y) * inverse (x * (y::real))";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   712
by (asm_full_simp_tac (simpset() addsimps 
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   713
		       [real_inverse_distrib,real_add_mult_distrib,
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   714
			real_mult_assoc RS sym]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   715
by (stac real_mult_assoc 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   716
by (rtac (real_mult_left_commute RS subst) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   717
by (asm_full_simp_tac (simpset() addsimps [real_add_commute]) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10043
diff changeset
   718
qed "real_inverse_add";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   719
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   720
(* 05/00 *)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   721
Goal "(0 <= -R) = (R <= (0::real))";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   722
by (auto_tac (claset() addDs [sym],
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   723
    simpset() addsimps [real_le_less]));
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   724
qed "real_minus_zero_le_iff";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   725
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   726
Goal "(-R <= 0) = ((0::real) <= R)";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   727
by (auto_tac (claset(),simpset() addsimps 
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   728
    [real_minus_zero_less_iff2,real_le_less]));
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   729
qed "real_minus_zero_le_iff2";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   730
9053
paulson
parents: 9043
diff changeset
   731
Addsimps [real_minus_zero_le_iff, real_minus_zero_le_iff2];
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   732
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   733
Goal "x * x + y * y = 0 ==> x = (0::real)";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   734
by (dtac real_add_minus_eq_minus 1);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   735
by (cut_inst_tac [("x","x")] real_le_square 1);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   736
by (Auto_tac THEN dtac real_le_anti_sym 1);
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   737
by Auto_tac;
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   738
qed "real_sum_squares_cancel";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   739
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   740
Goal "x * x + y * y = 0 ==> y = (0::real)";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   741
by (res_inst_tac [("y","x")] real_sum_squares_cancel 1);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   742
by (asm_full_simp_tac (simpset() addsimps [real_add_commute]) 1);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   743
qed "real_sum_squares_cancel2";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   744
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   745
(*----------------------------------------------------------------------------
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   746
     Some convenient biconditionals for products of signs (lcp)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   747
 ----------------------------------------------------------------------------*)
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   748
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   749
Goal "((0::real) < x*y) = (0 < x & 0 < y | x < 0 & y < 0)";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   750
by (auto_tac (claset(), 
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   751
              simpset() addsimps [order_le_less, linorder_not_less, 
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   752
                                  real_mult_order, real_mult_less_zero1]));
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   753
by (ALLGOALS (rtac ccontr)); 
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   754
by (auto_tac (claset(), simpset() addsimps [order_le_less, linorder_not_less]));
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   755
by (ALLGOALS (etac rev_mp)); 
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   756
by (ALLGOALS (dtac real_mult_less_zero THEN' assume_tac));
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   757
by (auto_tac (claset() addDs [order_less_not_sym], 
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   758
              simpset() addsimps [real_mult_commute]));  
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   759
qed "real_zero_less_mult_iff";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   760
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   761
Goal "((0::real) <= x*y) = (0 <= x & 0 <= y | x <= 0 & y <= 0)";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   762
by (auto_tac (claset(), 
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   763
              simpset() addsimps [order_le_less, linorder_not_less,  
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   764
                                  real_zero_less_mult_iff]));
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   765
qed "real_zero_le_mult_iff";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   766
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   767
Goal "(x*y < (0::real)) = (0 < x & y < 0 | x < 0 & 0 < y)";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   768
by (auto_tac (claset(), 
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   769
              simpset() addsimps [real_zero_le_mult_iff, 
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   770
                                  linorder_not_le RS sym]));
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   771
by (auto_tac (claset() addDs [order_less_not_sym],  
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   772
              simpset() addsimps [linorder_not_le]));
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   773
qed "real_mult_less_zero_iff";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   774
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   775
Goal "(x*y <= (0::real)) = (0 <= x & y <= 0 | x <= 0 & 0 <= y)";
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   776
by (auto_tac (claset() addDs [order_less_not_sym], 
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   777
              simpset() addsimps [real_zero_less_mult_iff, 
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   778
                                  linorder_not_less RS sym]));
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   779
qed "real_mult_le_zero_iff";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   780
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   781
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   782
(*----------------------------------------------------------------------------
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   783
     Another embedding of the naturals in the reals (see real_of_posnat)
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   784
 ----------------------------------------------------------------------------*)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   785
Goalw [real_of_nat_def] "real_of_nat 0 = 0";
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   786
by (simp_tac (simpset() addsimps [real_of_posnat_one]) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   787
qed "real_of_nat_zero";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   788
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   789
Goalw [real_of_nat_def] "real_of_nat 1 = 1r";
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   790
by (simp_tac (simpset() addsimps [real_of_posnat_two, real_add_assoc]) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   791
qed "real_of_nat_one";
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   792
Addsimps [real_of_nat_zero, real_of_nat_one];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   793
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   794
Goalw [real_of_nat_def]
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   795
     "real_of_nat (m + n) = real_of_nat m + real_of_nat n";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   796
by (simp_tac (simpset() addsimps 
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   797
              [real_of_posnat_add,real_add_assoc RS sym]) 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   798
qed "real_of_nat_add";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   799
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   800
Goalw [real_of_nat_def] "real_of_nat (Suc n) = real_of_nat n + 1r";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   801
by (simp_tac (simpset() addsimps [real_of_posnat_Suc] @ real_add_ac) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   802
qed "real_of_nat_Suc";
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   803
Addsimps [real_of_nat_Suc];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   804
    
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   805
Goalw [real_of_nat_def] "(real_of_nat n < real_of_nat m) = (n < m)";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   806
by Auto_tac;
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   807
qed "real_of_nat_less_iff";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   808
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   809
AddIffs [real_of_nat_less_iff];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   810
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   811
Goal "inj real_of_nat";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   812
by (rtac injI 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   813
by (auto_tac (claset() addSIs [inj_real_of_posnat RS injD],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   814
	      simpset() addsimps [real_of_nat_def,real_add_right_cancel]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   815
qed "inj_real_of_nat";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   816
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 9013
diff changeset
   817
Goalw [real_of_nat_def] "0 <= real_of_nat n";
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   818
by (res_inst_tac [("C","1r")] real_le_add_right_cancel 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   819
by (asm_full_simp_tac (simpset() addsimps [real_add_assoc]) 1);
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   820
qed "real_of_nat_ge_zero";
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   821
AddIffs [real_of_nat_ge_zero];
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   822
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   823
Goal "real_of_nat (m * n) = real_of_nat m * real_of_nat n";
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   824
by (induct_tac "m" 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   825
by (auto_tac (claset(),
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   826
	      simpset() addsimps [real_of_nat_add,
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   827
				  real_add_mult_distrib, real_add_commute]));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   828
qed "real_of_nat_mult";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   829
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   830
Goal "(real_of_nat n = real_of_nat m) = (n = m)";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   831
by (auto_tac (claset() addDs [inj_real_of_nat RS injD],
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   832
              simpset()));
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   833
qed "real_of_nat_eq_cancel";
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   834
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   835
Goal "n <= m --> real_of_nat (m - n) = real_of_nat m + (-real_of_nat n)";
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   836
by (induct_tac "m" 1);
7334
a90fc1e5fb19 Real/Real.thy main entry point;
wenzelm
parents:
diff changeset
   837
by (auto_tac (claset(),
8867
06dcd62f65ad deleted a lot of obsolete arithmetic lemmas
paulson
parents: 8856
diff changeset
   838
	      simpset() addsimps [Suc_diff_le, le_Suc_eq, real_of_nat_Suc, 
06dcd62f65ad deleted a lot of obsolete arithmetic lemmas
paulson
parents: 8856
diff changeset
   839
				  real_of_nat_zero] @ real_add_ac));
06dcd62f65ad deleted a lot of obsolete arithmetic lemmas
paulson
parents: 8856
diff changeset
   840
qed_spec_mp "real_of_nat_minus";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   841
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   842
(* 05/00 *)
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   843
Goal "n < m ==> real_of_nat (m - n) = \
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   844
\     real_of_nat m + -real_of_nat n";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   845
by (auto_tac (claset() addIs [real_of_nat_minus],simpset()));
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   846
qed "real_of_nat_minus2";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   847
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   848
Goalw [real_diff_def]
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   849
     "n < m ==> real_of_nat (m - n) = real_of_nat m - real_of_nat n";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   850
by (etac real_of_nat_minus2 1);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   851
qed "real_of_nat_diff";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   852
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   853
Goalw [real_diff_def]
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   854
     "n <= m ==> real_of_nat (m - n) = real_of_nat m - real_of_nat n";
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   855
by (etac real_of_nat_minus 1);
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   856
qed "real_of_nat_diff2";
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   857
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   858
Goal "(real_of_nat n = 0) = (n = 0)";
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   859
by (auto_tac (claset() addIs [inj_real_of_nat RS injD], simpset()));
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   860
qed "real_of_nat_zero_iff";
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   861
AddIffs [real_of_nat_zero_iff];
9013
9dd0274f76af Updated files to remove 0r and 1r from theorems in descendant theories
fleuriot
parents: 8867
diff changeset
   862
9069
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   863
Goal "neg z ==> real_of_nat (nat z) = 0";
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   864
by (asm_simp_tac (simpset() addsimps [neg_nat, real_of_nat_zero]) 1);
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   865
qed "real_of_nat_neg_int";
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   866
Addsimps [real_of_nat_neg_int];
e8d530582061 a big tidy-up
paulson
parents: 9053
diff changeset
   867