src/HOL/Real/RealDef.ML
author nipkow
Wed, 31 Jul 2002 16:10:24 +0200
changeset 13438 527811f00c56
parent 12483 0a01efff43e9
child 13550 5a176b8dda84
permissions -rw-r--r--
added mk_left_commute to HOL.thy and used it "everywhere"
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     1
(*  Title       : Real/RealDef.ML
7219
4e3f386c2e37 inserted Id: lines
paulson
parents: 7127
diff changeset
     2
    ID          : $Id$
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     3
    Author      : Jacques D. Fleuriot
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     4
    Copyright   : 1998  University of Cambridge
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     5
    Description : The reals
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     6
*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     7
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
     8
(*Ensures that Blast_tac can cope with real*)
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
     9
Blast.overloaded ("RealDef.real", domain_type); 
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    10
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    11
(*** Proving that realrel is an equivalence relation ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    12
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    13
Goal "[| (x1::preal) + y2 = x2 + y1; x2 + y3 = x3 + y2 |] \
12018
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
    14
\     ==> x1 + y3 = x3 + y1";        
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    15
by (res_inst_tac [("C","y2")] preal_add_right_cancel 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    16
by (rotate_tac 1 1 THEN dtac sym 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    17
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    18
by (rtac (preal_add_left_commute RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    19
by (res_inst_tac [("x1","x1")] (preal_add_assoc RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    20
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    21
qed "preal_trans_lemma";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    22
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    23
(** Natural deduction for realrel **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    24
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    25
Goalw [realrel_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    26
    "(((x1,y1),(x2,y2)): realrel) = (x1 + y2 = x2 + y1)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    27
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    28
qed "realrel_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    29
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    30
Goalw [realrel_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    31
    "[| x1 + y2 = x2 + y1 |] ==> ((x1,y1),(x2,y2)): realrel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    32
by (Blast_tac  1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    33
qed "realrelI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    34
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    35
Goalw [realrel_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    36
  "p: realrel --> (EX x1 y1 x2 y2. \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    37
\                  p = ((x1,y1),(x2,y2)) & x1 + y2 = x2 + y1)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    38
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    39
qed "realrelE_lemma";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    40
9969
4753185f1dd2 renamed (most of...) the select rules
paulson
parents: 9422
diff changeset
    41
val [major,minor] = Goal
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    42
  "[| p: realrel;  \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    43
\     !!x1 y1 x2 y2. [| p = ((x1,y1),(x2,y2));  x1+y2 = x2+y1 \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    44
\                    |] ==> Q |] ==> Q";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    45
by (cut_facts_tac [major RS (realrelE_lemma RS mp)] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    46
by (REPEAT (eresolve_tac [asm_rl,exE,conjE,minor] 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    47
qed "realrelE";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    48
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    49
Goal "(x,x): realrel";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    50
by (case_tac "x" 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    51
by (asm_simp_tac (simpset() addsimps [realrel_def]) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    52
qed "realrel_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    53
9391
a6ab3a442da6 changed / to // for quotienting; general tidying
paulson
parents: 9369
diff changeset
    54
Goalw [equiv_def, refl_def, sym_def, trans_def] "equiv UNIV realrel";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    55
by (fast_tac (claset() addSIs [realrelI, realrel_refl] 
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    56
                       addSEs [sym, realrelE, preal_trans_lemma]) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    57
qed "equiv_realrel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    58
10834
a7897aebbffc *** empty log message ***
nipkow
parents: 10797
diff changeset
    59
(* (realrel `` {x} = realrel `` {y}) = ((x,y) : realrel) *)
9108
9fff97d29837 bind_thm(s);
wenzelm
parents: 9043
diff changeset
    60
bind_thm ("equiv_realrel_iff",
9391
a6ab3a442da6 changed / to // for quotienting; general tidying
paulson
parents: 9369
diff changeset
    61
    	  [equiv_realrel, UNIV_I, UNIV_I] MRS eq_equiv_class_iff);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    62
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    63
Goalw [REAL_def,realrel_def,quotient_def] "realrel``{(x,y)}: REAL";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    64
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    65
qed "realrel_in_real";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    66
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    67
Goal "inj_on Abs_REAL REAL";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    68
by (rtac inj_on_inverseI 1);
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    69
by (etac Abs_REAL_inverse 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    70
qed "inj_on_Abs_REAL";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    71
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    72
Addsimps [equiv_realrel_iff,inj_on_Abs_REAL RS inj_on_iff,
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    73
          realrel_iff, realrel_in_real, Abs_REAL_inverse];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    74
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    75
Addsimps [equiv_realrel RS eq_equiv_class_iff];
9108
9fff97d29837 bind_thm(s);
wenzelm
parents: 9043
diff changeset
    76
bind_thm ("eq_realrelD", equiv_realrel RSN (2,eq_equiv_class));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    77
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    78
Goal "inj Rep_REAL";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    79
by (rtac inj_inverseI 1);
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    80
by (rtac Rep_REAL_inverse 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    81
qed "inj_Rep_REAL";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    82
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
    83
(** real_of_preal: the injection from preal to real **)
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
    84
Goal "inj(real_of_preal)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    85
by (rtac injI 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
    86
by (rewtac real_of_preal_def);
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    87
by (dtac (inj_on_Abs_REAL RS inj_onD) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    88
by (REPEAT (rtac realrel_in_real 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    89
by (dtac eq_equiv_class 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    90
by (rtac equiv_realrel 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    91
by (Blast_tac 1);
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    92
by (asm_full_simp_tac (simpset() addsimps [realrel_def]) 1); 
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
    93
qed "inj_real_of_preal";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    94
9969
4753185f1dd2 renamed (most of...) the select rules
paulson
parents: 9422
diff changeset
    95
val [prem] = Goal
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    96
    "(!!x y. z = Abs_REAL(realrel``{(x,y)}) ==> P) ==> P";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    97
by (res_inst_tac [("x1","z")] 
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    98
    (rewrite_rule [REAL_def] Rep_REAL RS quotientE) 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
    99
by (dres_inst_tac [("f","Abs_REAL")] arg_cong 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   100
by (case_tac "x" 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   101
by (rtac prem 1);
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   102
by (asm_full_simp_tac (simpset() addsimps [Rep_REAL_inverse]) 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   103
qed "eq_Abs_REAL";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   104
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   105
(**** real_minus: additive inverse on real ****)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   106
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   107
Goalw [congruent_def]
10834
a7897aebbffc *** empty log message ***
nipkow
parents: 10797
diff changeset
   108
  "congruent realrel (%p. (%(x,y). realrel``{(y,x)}) p)";
10232
529c65b5dcde restoration of "equalityI"; renaming of contrapos rules
paulson
parents: 10043
diff changeset
   109
by (Clarify_tac 1); 
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   110
by (asm_full_simp_tac (simpset() addsimps [preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   111
qed "real_minus_congruent";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   112
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   113
Goalw [real_minus_def]
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   114
      "- (Abs_REAL(realrel``{(x,y)})) = Abs_REAL(realrel `` {(y,x)})";
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   115
by (res_inst_tac [("f","Abs_REAL")] arg_cong 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   116
by (simp_tac (simpset() addsimps [realrel_in_real RS Abs_REAL_inverse,
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   117
                [equiv_realrel, real_minus_congruent] MRS UN_equiv_class]) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   118
qed "real_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   119
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   120
Goal "- (- z) = (z::real)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   121
by (res_inst_tac [("z","z")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   122
by (asm_simp_tac (simpset() addsimps [real_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   123
qed "real_minus_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   124
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   125
Addsimps [real_minus_minus];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   126
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   127
Goal "inj(%r::real. -r)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   128
by (rtac injI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   129
by (dres_inst_tac [("f","uminus")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   130
by (asm_full_simp_tac (simpset() addsimps [real_minus_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   131
qed "inj_real_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   132
11701
3d51fbf81c17 sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
wenzelm
parents: 11655
diff changeset
   133
Goalw [real_zero_def] "- 0 = (0::real)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   134
by (simp_tac (simpset() addsimps [real_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   135
qed "real_minus_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   136
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   137
Addsimps [real_minus_zero];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   138
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   139
Goal "(-x = 0) = (x = (0::real))"; 
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   140
by (res_inst_tac [("z","x")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   141
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   142
	      simpset() addsimps [real_zero_def, real_minus] @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   143
qed "real_minus_zero_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   144
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   145
Addsimps [real_minus_zero_iff];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   146
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   147
(*** Congruence property for addition ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   148
Goalw [congruent2_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   149
    "congruent2 realrel (%p1 p2.                  \
10834
a7897aebbffc *** empty log message ***
nipkow
parents: 10797
diff changeset
   150
\         (%(x1,y1). (%(x2,y2). realrel``{(x1+x2, y1+y2)}) p2) p1)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   151
by (clarify_tac (claset() addSEs [realrelE]) 1); 
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   152
by (asm_simp_tac (simpset() addsimps [preal_add_assoc]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   153
by (res_inst_tac [("z1.1","x1a")] (preal_add_left_commute RS ssubst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   154
by (asm_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   155
by (asm_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   156
qed "real_add_congruent2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   157
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   158
Goalw [real_add_def]
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   159
  "Abs_REAL(realrel``{(x1,y1)}) + Abs_REAL(realrel``{(x2,y2)}) = \
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   160
\  Abs_REAL(realrel``{(x1+x2, y1+y2)})";
9391
a6ab3a442da6 changed / to // for quotienting; general tidying
paulson
parents: 9369
diff changeset
   161
by (simp_tac (simpset() addsimps 
a6ab3a442da6 changed / to // for quotienting; general tidying
paulson
parents: 9369
diff changeset
   162
              [[equiv_realrel, real_add_congruent2] MRS UN_equiv_class2]) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   163
qed "real_add";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   164
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   165
Goal "(z::real) + w = w + z";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   166
by (res_inst_tac [("z","z")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   167
by (res_inst_tac [("z","w")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   168
by (asm_simp_tac (simpset() addsimps preal_add_ac @ [real_add]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   169
qed "real_add_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   170
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   171
Goal "((z1::real) + z2) + z3 = z1 + (z2 + z3)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   172
by (res_inst_tac [("z","z1")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   173
by (res_inst_tac [("z","z2")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   174
by (res_inst_tac [("z","z3")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   175
by (asm_simp_tac (simpset() addsimps [real_add, preal_add_assoc]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   176
qed "real_add_assoc";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   177
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   178
(*For AC rewriting*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   179
Goal "(x::real)+(y+z)=y+(x+z)";
13438
527811f00c56 added mk_left_commute to HOL.thy and used it "everywhere"
nipkow
parents: 12483
diff changeset
   180
by(rtac ([real_add_assoc,real_add_commute] MRS
527811f00c56 added mk_left_commute to HOL.thy and used it "everywhere"
nipkow
parents: 12483
diff changeset
   181
         read_instantiate[("f","op +")](thm"mk_left_commute")) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   182
qed "real_add_left_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   183
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   184
(* real addition is an AC operator *)
7428
80838c2af97b bind_thms;
wenzelm
parents: 7292
diff changeset
   185
bind_thms ("real_add_ac", [real_add_assoc,real_add_commute,real_add_left_commute]);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   186
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   187
Goalw [real_of_preal_def,real_zero_def] "(0::real) + z = z";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   188
by (res_inst_tac [("z","z")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   189
by (asm_full_simp_tac (simpset() addsimps [real_add] @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   190
qed "real_add_zero_left";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   191
Addsimps [real_add_zero_left];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   192
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   193
Goal "z + (0::real) = z";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   194
by (simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   195
qed "real_add_zero_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   196
Addsimps [real_add_zero_right];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   197
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   198
Goalw [real_zero_def] "z + (-z) = (0::real)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   199
by (res_inst_tac [("z","z")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   200
by (asm_full_simp_tac (simpset() addsimps [real_minus,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   201
        real_add, preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   202
qed "real_add_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   203
Addsimps [real_add_minus];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   204
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   205
Goal "(-z) + z = (0::real)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   206
by (simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   207
qed "real_add_minus_left";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   208
Addsimps [real_add_minus_left];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   209
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   210
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   211
Goal "z + ((- z) + w) = (w::real)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   212
by (simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   213
qed "real_add_minus_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   214
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   215
Goal "(-z) + (z + w) = (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   216
by (simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   217
qed "real_minus_add_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   218
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   219
Addsimps [real_add_minus_cancel, real_minus_add_cancel];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   220
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   221
Goal "EX y. (x::real) + y = 0";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   222
by (blast_tac (claset() addIs [real_add_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   223
qed "real_minus_ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   224
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   225
Goal "EX! y. (x::real) + y = 0";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   226
by (auto_tac (claset() addIs [real_add_minus],simpset()));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   227
by (dres_inst_tac [("f","%x. ya+x")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   228
by (asm_full_simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   229
by (asm_full_simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   230
qed "real_minus_ex1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   231
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   232
Goal "EX! y. y + (x::real) = 0";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   233
by (auto_tac (claset() addIs [real_add_minus_left],simpset()));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   234
by (dres_inst_tac [("f","%x. x+ya")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   235
by (asm_full_simp_tac (simpset() addsimps [real_add_assoc]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   236
by (asm_full_simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   237
qed "real_minus_left_ex1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   238
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   239
Goal "x + y = (0::real) ==> x = -y";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   240
by (cut_inst_tac [("z","y")] real_add_minus_left 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   241
by (res_inst_tac [("x1","y")] (real_minus_left_ex1 RS ex1E) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   242
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   243
qed "real_add_minus_eq_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   244
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   245
Goal "EX (y::real). x = -y";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   246
by (cut_inst_tac [("x","x")] real_minus_ex 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   247
by (etac exE 1 THEN dtac real_add_minus_eq_minus 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   248
by (Fast_tac 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   249
qed "real_as_add_inverse_ex";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   250
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   251
Goal "-(x + y) = (-x) + (- y :: real)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   252
by (res_inst_tac [("z","x")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   253
by (res_inst_tac [("z","y")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   254
by (auto_tac (claset(),simpset() addsimps [real_minus,real_add]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   255
qed "real_minus_add_distrib";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   256
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   257
Addsimps [real_minus_add_distrib];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   258
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   259
Goal "((x::real) + y = x + z) = (y = z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   260
by (Step_tac 1);
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   261
by (dres_inst_tac [("f","%t. (-x) + t")] arg_cong 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   262
by (asm_full_simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   263
qed "real_add_left_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   264
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   265
Goal "(y + (x::real)= z + x) = (y = z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   266
by (simp_tac (simpset() addsimps [real_add_commute,real_add_left_cancel]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   267
qed "real_add_right_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   268
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   269
Goal "(0::real) - x = -x";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   270
by (simp_tac (simpset() addsimps [real_diff_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   271
qed "real_diff_0";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   272
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   273
Goal "x - (0::real) = x";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   274
by (simp_tac (simpset() addsimps [real_diff_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   275
qed "real_diff_0_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   276
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   277
Goal "x - x = (0::real)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   278
by (simp_tac (simpset() addsimps [real_diff_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   279
qed "real_diff_self";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   280
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   281
Addsimps [real_diff_0, real_diff_0_right, real_diff_self];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   282
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   283
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   284
(*** Congruence property for multiplication ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   285
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   286
Goal "!!(x1::preal). [| x1 + y2 = x2 + y1 |] ==> \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   287
\         x * x1 + y * y1 + (x * y2 + x2 * y) = \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   288
\         x * x2 + y * y2 + (x * y1 + x1 * y)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   289
by (asm_full_simp_tac (simpset() addsimps [preal_add_left_commute,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   290
    preal_add_assoc RS sym,preal_add_mult_distrib2 RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   291
by (rtac (preal_mult_commute RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   292
by (res_inst_tac [("y1","x2")] (preal_mult_commute RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   293
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   294
    preal_add_mult_distrib2 RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   295
by (asm_full_simp_tac (simpset() addsimps [preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   296
qed "real_mult_congruent2_lemma";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   297
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   298
Goal 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   299
    "congruent2 realrel (%p1 p2.                  \
10834
a7897aebbffc *** empty log message ***
nipkow
parents: 10797
diff changeset
   300
\         (%(x1,y1). (%(x2,y2). realrel``{(x1*x2 + y1*y2, x1*y2+x2*y1)}) p2) p1)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   301
by (rtac (equiv_realrel RS congruent2_commuteI) 1);
10232
529c65b5dcde restoration of "equalityI"; renaming of contrapos rules
paulson
parents: 10043
diff changeset
   302
by (Clarify_tac 1); 
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   303
by (rewtac split_def);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   304
by (asm_simp_tac (simpset() addsimps [preal_mult_commute,preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   305
by (auto_tac (claset(),simpset() addsimps [real_mult_congruent2_lemma]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   306
qed "real_mult_congruent2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   307
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   308
Goalw [real_mult_def]
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   309
   "Abs_REAL((realrel``{(x1,y1)})) * Abs_REAL((realrel``{(x2,y2)})) =   \
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   310
\   Abs_REAL(realrel `` {(x1*x2+y1*y2,x1*y2+x2*y1)})";
9391
a6ab3a442da6 changed / to // for quotienting; general tidying
paulson
parents: 9369
diff changeset
   311
by (simp_tac (simpset() addsimps
a6ab3a442da6 changed / to // for quotienting; general tidying
paulson
parents: 9369
diff changeset
   312
               [[equiv_realrel, real_mult_congruent2] MRS UN_equiv_class2]) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   313
qed "real_mult";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   314
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   315
Goal "(z::real) * w = w * z";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   316
by (res_inst_tac [("z","z")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   317
by (res_inst_tac [("z","w")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   318
by (asm_simp_tac
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   319
    (simpset() addsimps [real_mult] @ preal_add_ac @ preal_mult_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   320
qed "real_mult_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   321
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   322
Goal "((z1::real) * z2) * z3 = z1 * (z2 * z3)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   323
by (res_inst_tac [("z","z1")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   324
by (res_inst_tac [("z","z2")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   325
by (res_inst_tac [("z","z3")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   326
by (asm_simp_tac (simpset() addsimps [preal_add_mult_distrib2,real_mult] @ 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   327
                                     preal_add_ac @ preal_mult_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   328
qed "real_mult_assoc";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   329
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   330
Goal "(z1::real) * (z2 * z3) = z2 * (z1 * z3)";
13438
527811f00c56 added mk_left_commute to HOL.thy and used it "everywhere"
nipkow
parents: 12483
diff changeset
   331
by(rtac ([real_mult_assoc,real_mult_commute] MRS
527811f00c56 added mk_left_commute to HOL.thy and used it "everywhere"
nipkow
parents: 12483
diff changeset
   332
         read_instantiate[("f","op *")](thm"mk_left_commute")) 1);
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   333
qed "real_mult_left_commute";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   334
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   335
(* real multiplication is an AC operator *)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   336
bind_thms ("real_mult_ac", 
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   337
	   [real_mult_assoc, real_mult_commute, real_mult_left_commute]);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   338
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   339
Goalw [real_one_def,pnat_one_def] "(1::real) * z = z";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   340
by (res_inst_tac [("z","z")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   341
by (asm_full_simp_tac
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   342
    (simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   343
			 preal_add_mult_distrib2,preal_mult_1_right] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   344
                        @ preal_mult_ac @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   345
qed "real_mult_1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   346
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   347
Addsimps [real_mult_1];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   348
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   349
Goal "z * (1::real) = z";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   350
by (simp_tac (simpset() addsimps [real_mult_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   351
qed "real_mult_1_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   352
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   353
Addsimps [real_mult_1_right];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   354
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   355
Goalw [real_zero_def,pnat_one_def] "0 * z = (0::real)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   356
by (res_inst_tac [("z","z")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   357
by (asm_full_simp_tac (simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   358
    preal_add_mult_distrib2,preal_mult_1_right] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   359
    @ preal_mult_ac @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   360
qed "real_mult_0";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   361
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   362
Goal "z * 0 = (0::real)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   363
by (simp_tac (simpset() addsimps [real_mult_commute, real_mult_0]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   364
qed "real_mult_0_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   365
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   366
Addsimps [real_mult_0_right, real_mult_0];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   367
12483
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   368
Goal "(-x) * (y::real) = -(x * y)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   369
by (res_inst_tac [("z","x")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   370
by (res_inst_tac [("z","y")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   371
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   372
	      simpset() addsimps [real_minus,real_mult] 
9391
a6ab3a442da6 changed / to // for quotienting; general tidying
paulson
parents: 9369
diff changeset
   373
                                 @ preal_mult_ac @ preal_add_ac));
12483
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   374
qed "real_mult_minus_eq1";
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   375
Addsimps [real_mult_minus_eq1];
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   376
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   377
bind_thm("real_minus_mult_eq1", real_mult_minus_eq1 RS sym);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   378
12483
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   379
Goal "x * (- y :: real) = -(x * y)";
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   380
by (simp_tac (simpset() addsimps [inst "z" "x" real_mult_commute]) 1);
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   381
qed "real_mult_minus_eq2";
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   382
Addsimps [real_mult_minus_eq2];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   383
12483
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   384
bind_thm("real_minus_mult_eq2", real_mult_minus_eq2 RS sym);
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   385
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   386
Goal "(- (1::real)) * z = -z";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   387
by (Simp_tac 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   388
qed "real_mult_minus_1";
12018
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   389
Addsimps [real_mult_minus_1];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   390
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   391
Goal "z * (- (1::real)) = -z";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   392
by (stac real_mult_commute 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   393
by (Simp_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   394
qed "real_mult_minus_1_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   395
Addsimps [real_mult_minus_1_right];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   396
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   397
Goal "(-x) * (-y) = x * (y::real)";
12483
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   398
by (Simp_tac 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   399
qed "real_minus_mult_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   400
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   401
Addsimps [real_minus_mult_cancel];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   402
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   403
Goal "(-x) * y = x * (- y :: real)";
12483
0a01efff43e9 new rewrite rules for use by arith_tac to take care of uminus.
nipkow
parents: 12018
diff changeset
   404
by (Simp_tac 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   405
qed "real_minus_mult_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   406
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   407
(** Lemmas **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   408
9266
1b917b8b1b38 removal of batch style, and tidying
paulson
parents: 9167
diff changeset
   409
Goal "(z::real) + v = z' + v' ==> z + (v + w) = z' + (v' + w)";
1b917b8b1b38 removal of batch style, and tidying
paulson
parents: 9167
diff changeset
   410
by (asm_simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
1b917b8b1b38 removal of batch style, and tidying
paulson
parents: 9167
diff changeset
   411
qed "real_add_assoc_cong";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   412
9266
1b917b8b1b38 removal of batch style, and tidying
paulson
parents: 9167
diff changeset
   413
Goal "(z::real) + (v + w) = v + (z + w)";
1b917b8b1b38 removal of batch style, and tidying
paulson
parents: 9167
diff changeset
   414
by (REPEAT (ares_tac [real_add_commute RS real_add_assoc_cong] 1));
1b917b8b1b38 removal of batch style, and tidying
paulson
parents: 9167
diff changeset
   415
qed "real_add_assoc_swap";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   416
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   417
Goal "((z1::real) + z2) * w = (z1 * w) + (z2 * w)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   418
by (res_inst_tac [("z","z1")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   419
by (res_inst_tac [("z","z2")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   420
by (res_inst_tac [("z","w")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   421
by (asm_simp_tac 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   422
    (simpset() addsimps [preal_add_mult_distrib2, real_add, real_mult] @ 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   423
                        preal_add_ac @ preal_mult_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   424
qed "real_add_mult_distrib";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   425
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   426
val real_mult_commute'= inst "z" "w" real_mult_commute;
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   427
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   428
Goal "(w::real) * (z1 + z2) = (w * z1) + (w * z2)";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   429
by (simp_tac (simpset() addsimps [real_mult_commute',
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   430
				  real_add_mult_distrib]) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   431
qed "real_add_mult_distrib2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   432
8027
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   433
Goalw [real_diff_def] "((z1::real) - z2) * w = (z1 * w) - (z2 * w)";
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   434
by (simp_tac (simpset() addsimps [real_add_mult_distrib]) 1);
8027
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   435
qed "real_diff_mult_distrib";
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   436
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   437
Goal "(w::real) * (z1 - z2) = (w * z1) - (w * z2)";
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   438
by (simp_tac (simpset() addsimps [real_mult_commute', 
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   439
				  real_diff_mult_distrib]) 1);
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   440
qed "real_diff_mult_distrib2";
8a27d0579e37 distributive laws for * over -
paulson
parents: 7499
diff changeset
   441
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   442
(*** one and zero are distinct ***)
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   443
Goalw [real_zero_def,real_one_def] "0 ~= (1::real)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   444
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   445
         simpset() addsimps [preal_self_less_add_left RS preal_not_refl2]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   446
qed "real_zero_not_eq_one";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   447
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   448
(*** existence of inverse ***)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   449
(** lemma -- alternative definition of 0 **)
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   450
Goalw [real_zero_def] "0 = Abs_REAL (realrel `` {(x, x)})";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   451
by (auto_tac (claset(),simpset() addsimps [preal_add_commute]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   452
qed "real_zero_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   453
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   454
Goalw [real_zero_def,real_one_def] 
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   455
          "!!(x::real). x ~= 0 ==> EX y. x*y = (1::real)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   456
by (res_inst_tac [("z","x")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   457
by (cut_inst_tac [("r1.0","xa"),("r2.0","y")] preal_linear 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   458
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   459
           simpset() addsimps [real_zero_iff RS sym]));
12018
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   460
by (res_inst_tac [("x",
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   461
    "Abs_REAL (realrel `` \
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   462
\     {(preal_of_prat(prat_of_pnat 1),  \
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   463
\       pinv(D) + preal_of_prat(prat_of_pnat 1))})")] exI 1);
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   464
by (res_inst_tac [("x",
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   465
     "Abs_REAL (realrel `` \
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   466
\      {(pinv(D) + preal_of_prat(prat_of_pnat 1),\
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   467
\        preal_of_prat(prat_of_pnat 1))})")] exI 2);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   468
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   469
	      simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   470
    pnat_one_def,preal_mult_1_right,preal_add_mult_distrib2,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   471
    preal_add_mult_distrib,preal_mult_1,preal_mult_inv_right] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   472
    @ preal_add_ac @ preal_mult_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   473
qed "real_mult_inv_right_ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   474
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   475
Goal "x ~= 0 ==> EX y. y*x = (1::real)";
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   476
by (dtac real_mult_inv_right_ex 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   477
by (auto_tac (claset(), simpset() addsimps [real_mult_commute]));  
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   478
qed "real_mult_inv_left_ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   479
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   480
Goalw [real_inverse_def] "x ~= 0 ==> inverse(x)*x = (1::real)";
7499
23e090051cb8 isatool expandshort;
wenzelm
parents: 7428
diff changeset
   481
by (ftac real_mult_inv_left_ex 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   482
by (Step_tac 1);
9969
4753185f1dd2 renamed (most of...) the select rules
paulson
parents: 9422
diff changeset
   483
by (rtac someI2 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   484
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   485
qed "real_mult_inv_left";
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   486
Addsimps [real_mult_inv_left];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   487
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   488
Goal "x ~= 0 ==> x*inverse(x) = (1::real)";
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   489
by (stac real_mult_commute 1);
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   490
by (auto_tac (claset(), simpset() addsimps [real_mult_inv_left]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   491
qed "real_mult_inv_right";
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   492
Addsimps [real_mult_inv_right];
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   493
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   494
(** Inverse of zero!  Useful to simplify certain equations **)
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   495
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   496
Goalw [real_inverse_def] "inverse 0 = (0::real)";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   497
by (rtac someI2 1);
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   498
by (auto_tac (claset(), simpset() addsimps [real_zero_not_eq_one]));  
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   499
qed "INVERSE_ZERO";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   500
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   501
Goal "a / (0::real) = 0";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   502
by (simp_tac (simpset() addsimps [real_divide_def, INVERSE_ZERO]) 1);
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   503
qed "DIVISION_BY_ZERO";  (*NOT for adding to default simpset*)
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   504
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   505
fun real_div_undefined_case_tac s i =
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   506
  case_tac s i THEN 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   507
  asm_simp_tac (simpset() addsimps [DIVISION_BY_ZERO, INVERSE_ZERO]) i;
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   508
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   509
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   510
Goal "(c::real) ~= 0 ==> (c*a=c*b) = (a=b)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   511
by Auto_tac;
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   512
by (dres_inst_tac [("f","%x. x*inverse c")] arg_cong 1);
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   513
by (asm_full_simp_tac (simpset() addsimps real_mult_ac)  1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   514
qed "real_mult_left_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   515
    
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   516
Goal "(c::real) ~= 0 ==> (a*c=b*c) = (a=b)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   517
by (Step_tac 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   518
by (dres_inst_tac [("f","%x. x*inverse c")] arg_cong 1);
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   519
by (asm_full_simp_tac (simpset() addsimps real_mult_ac)  1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   520
qed "real_mult_right_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   521
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   522
Goal "c*a ~= c*b ==> a ~= b";
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   523
by Auto_tac;
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   524
qed "real_mult_left_cancel_ccontr";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   525
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   526
Goal "a*c ~= b*c ==> a ~= b";
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
   527
by Auto_tac;
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   528
qed "real_mult_right_cancel_ccontr";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   529
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   530
Goalw [real_inverse_def] "x ~= 0 ==> inverse(x::real) ~= 0";
7499
23e090051cb8 isatool expandshort;
wenzelm
parents: 7428
diff changeset
   531
by (ftac real_mult_inv_left_ex 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   532
by (etac exE 1);
9969
4753185f1dd2 renamed (most of...) the select rules
paulson
parents: 9422
diff changeset
   533
by (rtac someI2 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   534
by (auto_tac (claset(),
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   535
	      simpset() addsimps [real_mult_0, real_zero_not_eq_one]));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   536
qed "real_inverse_not_zero";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   537
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   538
Goal "[| x ~= 0; y ~= 0 |] ==> x * y ~= (0::real)";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   539
by (Step_tac 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   540
by (dres_inst_tac [("f","%z. inverse x*z")] arg_cong 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   541
by (asm_full_simp_tac (simpset() addsimps [real_mult_assoc RS sym]) 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   542
qed "real_mult_not_zero";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   543
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   544
Goal "inverse(inverse (x::real)) = x";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   545
by (real_div_undefined_case_tac "x=0" 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   546
by (res_inst_tac [("c1","inverse x")] (real_mult_right_cancel RS iffD1) 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   547
by (etac real_inverse_not_zero 1);
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   548
by (auto_tac (claset() addDs [real_inverse_not_zero],simpset()));
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   549
qed "real_inverse_inverse";
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   550
Addsimps [real_inverse_inverse];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   551
11713
883d559b0b8c sane numerals (stage 3): provide generic "1" on all number types;
wenzelm
parents: 11701
diff changeset
   552
Goalw [real_inverse_def] "inverse((1::real)) = (1::real)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   553
by (cut_facts_tac [real_zero_not_eq_one RS 
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   554
                   not_sym RS real_mult_inv_left_ex] 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   555
by (auto_tac (claset(),
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   556
	      simpset() addsimps [real_zero_not_eq_one RS not_sym]));
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   557
qed "real_inverse_1";
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   558
Addsimps [real_inverse_1];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   559
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   560
Goal "inverse(-x) = -inverse(x::real)";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   561
by (real_div_undefined_case_tac "x=0" 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   562
by (res_inst_tac [("c1","-x")] (real_mult_right_cancel RS iffD1) 1);
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   563
by (stac real_mult_inv_left 2);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   564
by Auto_tac;
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   565
qed "real_minus_inverse";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   566
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   567
Goal "inverse(x*y) = inverse(x)*inverse(y::real)";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   568
by (real_div_undefined_case_tac "x=0" 1);
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   569
by (real_div_undefined_case_tac "y=0" 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   570
by (forw_inst_tac [("y","y")] real_mult_not_zero 1 THEN assume_tac 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   571
by (res_inst_tac [("c1","x")] (real_mult_left_cancel RS iffD1) 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   572
by (auto_tac (claset(),simpset() addsimps [real_mult_assoc RS sym]));
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   573
by (res_inst_tac [("c1","y")] (real_mult_left_cancel RS iffD1) 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   574
by (auto_tac (claset(),simpset() addsimps [real_mult_left_commute]));
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   575
by (asm_simp_tac (simpset() addsimps [real_mult_assoc RS sym]) 1);
10606
e3229a37d53f converted rinv to inverse;
bauerg
parents: 10232
diff changeset
   576
qed "real_inverse_distrib";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   577
10648
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   578
Goal "(x::real) * (y/z) = (x*y)/z";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   579
by (simp_tac (simpset() addsimps [real_divide_def, real_mult_assoc]) 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   580
qed "real_times_divide1_eq";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   581
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   582
Goal "(y/z) * (x::real) = (y*x)/z";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   583
by (simp_tac (simpset() addsimps [real_divide_def]@real_mult_ac) 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   584
qed "real_times_divide2_eq";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   585
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   586
Addsimps [real_times_divide1_eq, real_times_divide2_eq];
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   587
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   588
Goal "(x::real) / (y/z) = (x*z)/y";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   589
by (simp_tac (simpset() addsimps [real_divide_def, real_inverse_distrib]@
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   590
                                 real_mult_ac) 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   591
qed "real_divide_divide1_eq";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   592
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   593
Goal "((x::real) / y) / z = x/(y*z)";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   594
by (simp_tac (simpset() addsimps [real_divide_def, real_inverse_distrib, 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   595
                                  real_mult_assoc]) 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   596
qed "real_divide_divide2_eq";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   597
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   598
Addsimps [real_divide_divide1_eq, real_divide_divide2_eq];
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   599
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   600
(** As with multiplication, pull minus signs OUT of the / operator **)
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   601
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   602
Goal "(-x) / (y::real) = - (x/y)";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   603
by (simp_tac (simpset() addsimps [real_divide_def]) 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   604
qed "real_minus_divide_eq";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   605
Addsimps [real_minus_divide_eq];
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   606
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   607
Goal "(x / -(y::real)) = - (x/y)";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   608
by (simp_tac (simpset() addsimps [real_divide_def, real_minus_inverse]) 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   609
qed "real_divide_minus_eq";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   610
Addsimps [real_divide_minus_eq];
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   611
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   612
Goal "(x+y)/(z::real) = x/z + y/z";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   613
by (simp_tac (simpset() addsimps [real_divide_def, real_add_mult_distrib]) 1); 
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   614
qed "real_add_divide_distrib";
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   615
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   616
(*The following would e.g. convert (x+y)/2 to x/2 + y/2.  Sometimes that
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   617
  leads to cancellations in x or y, but is also prevents "multiplying out"
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   618
  the 2 in e.g. (x+y)/2 = 5.
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   619
  
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   620
Addsimps [inst "z" "number_of ?w" real_add_divide_distrib];
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   621
**)
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   622
a8c647cfa31f first stage in tidying up Real and Hyperreal.
paulson
parents: 10606
diff changeset
   623
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   624
(*---------------------------------------------------------
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   625
     Theorems for ordering
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   626
 --------------------------------------------------------*)
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   627
(* prove introduction and elimination rules for real_less *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   628
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   629
(* real_less is a strong order i.e. nonreflexive and transitive *)
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   630
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   631
(*** lemmas ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   632
Goal "!!(x::preal). [| x = y; x1 = y1 |] ==> x + y1 = x1 + y";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   633
by (asm_simp_tac (simpset() addsimps [preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   634
qed "preal_lemma_eq_rev_sum";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   635
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   636
Goal "!!(b::preal). x + (b + y) = x1 + (b + y1) ==> x + y = x1 + y1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   637
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   638
qed "preal_add_left_commute_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   639
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   640
Goal "!!(x::preal). [| x + y2a = x2a + y; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   641
\                      x + y2b = x2b + y |] \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   642
\                   ==> x2a + y2b = x2b + y2a";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   643
by (dtac preal_lemma_eq_rev_sum 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   644
by (assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   645
by (thin_tac "x + y2b = x2b + y" 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   646
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   647
by (dtac preal_add_left_commute_cancel 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   648
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   649
qed "preal_lemma_for_not_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   650
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   651
Goal "~ (R::real) < R";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   652
by (res_inst_tac [("z","R")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   653
by (auto_tac (claset(),simpset() addsimps [real_less_def]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   654
by (dtac preal_lemma_for_not_refl 1);
10752
c4f1bf2acf4c tidying, and separation of HOL-Hyperreal from HOL-Real
paulson
parents: 10712
diff changeset
   655
by (assume_tac 1);
c4f1bf2acf4c tidying, and separation of HOL-Hyperreal from HOL-Real
paulson
parents: 10712
diff changeset
   656
by Auto_tac;
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   657
qed "real_less_not_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   658
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   659
(*** y < y ==> P ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   660
bind_thm("real_less_irrefl", real_less_not_refl RS notE);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   661
AddSEs [real_less_irrefl];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   662
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   663
Goal "!!(x::real). x < y ==> x ~= y";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   664
by (auto_tac (claset(),simpset() addsimps [real_less_not_refl]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   665
qed "real_not_refl2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   666
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   667
(* lemma re-arranging and eliminating terms *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   668
Goal "!! (a::preal). [| a + b = c + d; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   669
\            x2b + d + (c + y2e) < a + y2b + (x2e + b) |] \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   670
\         ==> x2b + y2e < x2e + y2b";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   671
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   672
by (res_inst_tac [("C","c+d")] preal_add_left_less_cancel 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   673
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   674
qed "preal_lemma_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   675
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   676
(** heavy re-writing involved*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   677
Goal "!!(R1::real). [| R1 < R2; R2 < R3 |] ==> R1 < R3";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   678
by (res_inst_tac [("z","R1")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   679
by (res_inst_tac [("z","R2")] eq_Abs_REAL 1);
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   680
by (res_inst_tac [("z","R3")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   681
by (auto_tac (claset(),simpset() addsimps [real_less_def]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   682
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   683
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   684
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   685
by (dtac preal_lemma_for_not_refl 1 THEN assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   686
by (blast_tac (claset() addDs [preal_add_less_mono] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   687
    addIs [preal_lemma_trans]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   688
qed "real_less_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   689
9167
5b6b65c90eeb got rid of weak elim rule
paulson
parents: 9108
diff changeset
   690
Goal "!! (R1::real). R1 < R2 ==> ~ (R2 < R1)";
5b6b65c90eeb got rid of weak elim rule
paulson
parents: 9108
diff changeset
   691
by (rtac notI 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   692
by (dtac real_less_trans 1 THEN assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   693
by (asm_full_simp_tac (simpset() addsimps [real_less_not_refl]) 1);
9167
5b6b65c90eeb got rid of weak elim rule
paulson
parents: 9108
diff changeset
   694
qed "real_less_not_sym";
5b6b65c90eeb got rid of weak elim rule
paulson
parents: 9108
diff changeset
   695
5b6b65c90eeb got rid of weak elim rule
paulson
parents: 9108
diff changeset
   696
(* [| x < y;  ~P ==> y < x |] ==> P *)
10232
529c65b5dcde restoration of "equalityI"; renaming of contrapos rules
paulson
parents: 10043
diff changeset
   697
bind_thm ("real_less_asym", real_less_not_sym RS contrapos_np);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   698
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   699
Goalw [real_of_preal_def] 
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   700
     "real_of_preal ((z1::preal) + z2) = \
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   701
\     real_of_preal z1 + real_of_preal z2";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   702
by (asm_simp_tac (simpset() addsimps [real_add,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   703
       preal_add_mult_distrib,preal_mult_1] addsimps preal_add_ac) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   704
qed "real_of_preal_add";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   705
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   706
Goalw [real_of_preal_def] 
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   707
     "real_of_preal ((z1::preal) * z2) = \
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   708
\     real_of_preal z1* real_of_preal z2";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   709
by (full_simp_tac (simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   710
        preal_add_mult_distrib2,preal_mult_1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   711
        preal_mult_1_right,pnat_one_def] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   712
        @ preal_add_ac @ preal_mult_ac) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   713
qed "real_of_preal_mult";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   714
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   715
Goalw [real_of_preal_def]
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   716
      "!!(x::preal). y < x ==> \
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   717
\      EX m. Abs_REAL (realrel `` {(x,y)}) = real_of_preal m";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   718
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   719
    simpset() addsimps preal_add_ac));
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   720
qed "real_of_preal_ExI";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   721
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   722
Goalw [real_of_preal_def]
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   723
      "!!(x::preal). EX m. Abs_REAL (realrel `` {(x,y)}) = \
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   724
\                    real_of_preal m ==> y < x";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   725
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   726
	      simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   727
    [preal_add_commute,preal_add_assoc]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   728
by (asm_full_simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   729
    [preal_add_assoc RS sym,preal_self_less_add_left]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   730
qed "real_of_preal_ExD";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   731
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   732
Goal "(EX m. Abs_REAL (realrel `` {(x,y)}) = real_of_preal m) = (y < x)";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   733
by (blast_tac (claset() addSIs [real_of_preal_ExI,real_of_preal_ExD]) 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   734
qed "real_of_preal_iff";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   735
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   736
(*** Gleason prop 9-4.4 p 127 ***)
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   737
Goalw [real_of_preal_def,real_zero_def] 
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   738
      "EX m. (x::real) = real_of_preal m | x = 0 | x = -(real_of_preal m)";
10919
144ede948e58 renamings: real_of_nat, real_of_int -> (overloaded) real
paulson
parents: 10834
diff changeset
   739
by (res_inst_tac [("z","x")] eq_Abs_REAL 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   740
by (auto_tac (claset(),simpset() addsimps [real_minus] @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   741
by (cut_inst_tac [("r1.0","x"),("r2.0","y")] preal_linear 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   742
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   743
    simpset() addsimps [preal_add_assoc RS sym]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   744
by (auto_tac (claset(),simpset() addsimps [preal_add_commute]));
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   745
qed "real_of_preal_trichotomy";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   746
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   747
Goal "!!P. [| !!m. x = real_of_preal m ==> P; \
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   748
\             x = 0 ==> P; \
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   749
\             !!m. x = -(real_of_preal m) ==> P |] ==> P";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   750
by (cut_inst_tac [("x","x")] real_of_preal_trichotomy 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   751
by Auto_tac;
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   752
qed "real_of_preal_trichotomyE";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   753
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   754
Goalw [real_of_preal_def] 
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   755
      "real_of_preal m1 < real_of_preal m2 ==> m1 < m2";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   756
by (auto_tac (claset(),simpset() addsimps [real_less_def] @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   757
by (auto_tac (claset(),simpset() addsimps [preal_add_assoc RS sym]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   758
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   759
qed "real_of_preal_lessD";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   760
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   761
Goal "m1 < m2 ==> real_of_preal m1 < real_of_preal m2";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   762
by (dtac preal_less_add_left_Ex 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   763
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   764
	      simpset() addsimps [real_of_preal_add,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   765
    real_of_preal_def,real_less_def]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   766
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   767
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   768
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   769
by (simp_tac (simpset() addsimps [preal_self_less_add_left] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   770
    delsimps [preal_add_less_iff2]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   771
qed "real_of_preal_lessI";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   772
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   773
Goal "(real_of_preal m1 < real_of_preal m2) = (m1 < m2)";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   774
by (blast_tac (claset() addIs [real_of_preal_lessI,real_of_preal_lessD]) 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   775
qed "real_of_preal_less_iff1";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   776
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   777
Addsimps [real_of_preal_less_iff1];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   778
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   779
Goal "- real_of_preal m < real_of_preal m";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   780
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   781
	      simpset() addsimps 
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   782
    [real_of_preal_def,real_less_def,real_minus]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   783
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   784
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   785
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   786
by (full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   787
by (full_simp_tac (simpset() addsimps [preal_self_less_add_right,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   788
    preal_add_assoc RS sym]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   789
qed "real_of_preal_minus_less_self";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   790
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   791
Goalw [real_zero_def] "- real_of_preal m < 0";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   792
by (auto_tac (claset(),
7292
dff3470c5c62 real literals using binary arithmetic
paulson
parents: 7219
diff changeset
   793
	      simpset() addsimps [real_of_preal_def,
dff3470c5c62 real literals using binary arithmetic
paulson
parents: 7219
diff changeset
   794
				  real_less_def,real_minus]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   795
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   796
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   797
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   798
by (full_simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   799
  [preal_self_less_add_right] @ preal_add_ac) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   800
qed "real_of_preal_minus_less_zero";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   801
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   802
Goal "~ 0 < - real_of_preal m";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   803
by (cut_facts_tac [real_of_preal_minus_less_zero] 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   804
by (fast_tac (claset() addDs [real_less_trans] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   805
                        addEs [real_less_irrefl]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   806
qed "real_of_preal_not_minus_gt_zero";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   807
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   808
Goalw [real_zero_def] "0 < real_of_preal m";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   809
by (auto_tac (claset(),simpset() addsimps 
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   810
   [real_of_preal_def,real_less_def,real_minus]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   811
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   812
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   813
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   814
by (full_simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   815
		   [preal_self_less_add_right] @ preal_add_ac) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   816
qed "real_of_preal_zero_less";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   817
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   818
Goal "~ real_of_preal m < 0";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   819
by (cut_facts_tac [real_of_preal_zero_less] 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   820
by (blast_tac (claset() addDs [real_less_trans] 
7292
dff3470c5c62 real literals using binary arithmetic
paulson
parents: 7219
diff changeset
   821
                        addEs [real_less_irrefl]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   822
qed "real_of_preal_not_less_zero";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   823
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   824
Goal "0 < - (- real_of_preal m)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   825
by (simp_tac (simpset() addsimps 
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   826
    [real_of_preal_zero_less]) 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   827
qed "real_minus_minus_zero_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   828
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   829
(* another lemma *)
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   830
Goalw [real_zero_def]
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   831
      "0 < real_of_preal m + real_of_preal m1";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   832
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   833
	      simpset() addsimps [real_of_preal_def,
7292
dff3470c5c62 real literals using binary arithmetic
paulson
parents: 7219
diff changeset
   834
				  real_less_def,real_add]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   835
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   836
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   837
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   838
by (full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   839
by (full_simp_tac (simpset() addsimps [preal_self_less_add_right,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   840
    preal_add_assoc RS sym]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   841
qed "real_of_preal_sum_zero_less";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   842
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   843
Goal "- real_of_preal m < real_of_preal m1";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   844
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   845
	      simpset() addsimps [real_of_preal_def,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   846
              real_less_def,real_minus]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   847
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   848
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   849
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   850
by (full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   851
by (full_simp_tac (simpset() addsimps [preal_self_less_add_right,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   852
    preal_add_assoc RS sym]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   853
qed "real_of_preal_minus_less_all";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   854
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   855
Goal "~ real_of_preal m < - real_of_preal m1";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   856
by (cut_facts_tac [real_of_preal_minus_less_all] 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   857
by (blast_tac (claset() addDs [real_less_trans] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   858
               addEs [real_less_irrefl]) 1);
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   859
qed "real_of_preal_not_minus_gt_all";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   860
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   861
Goal "- real_of_preal m1 < - real_of_preal m2 \
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   862
\     ==> real_of_preal m2 < real_of_preal m1";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   863
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   864
	      simpset() addsimps [real_of_preal_def,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   865
              real_less_def,real_minus]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   866
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   867
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   868
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   869
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   870
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   871
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   872
qed "real_of_preal_minus_less_rev1";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   873
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   874
Goal "real_of_preal m1 < real_of_preal m2 \
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   875
\     ==> - real_of_preal m2 < - real_of_preal m1";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   876
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   877
	      simpset() addsimps [real_of_preal_def,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   878
              real_less_def,real_minus]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   879
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   880
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   881
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   882
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   883
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   884
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   885
qed "real_of_preal_minus_less_rev2";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   886
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   887
Goal "(- real_of_preal m1 < - real_of_preal m2) = \
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   888
\     (real_of_preal m2 < real_of_preal m1)";
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   889
by (blast_tac (claset() addSIs [real_of_preal_minus_less_rev1,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   890
               real_of_preal_minus_less_rev2]) 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   891
qed "real_of_preal_minus_less_rev_iff";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   892
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   893
Addsimps [real_of_preal_minus_less_rev_iff];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   894
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   895
(*** linearity ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   896
Goal "(R1::real) < R2 | R1 = R2 | R2 < R1";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   897
by (res_inst_tac [("x","R1")]  real_of_preal_trichotomyE 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   898
by (ALLGOALS(res_inst_tac [("x","R2")]  real_of_preal_trichotomyE));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   899
by (auto_tac (claset() addSDs [preal_le_anti_sym],
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   900
              simpset() addsimps [preal_less_le_iff,real_of_preal_minus_less_zero,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   901
               real_of_preal_zero_less,real_of_preal_minus_less_all]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   902
qed "real_linear";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   903
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   904
Goal "!!w::real. (w ~= z) = (w<z | z<w)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   905
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   906
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   907
qed "real_neq_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   908
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   909
Goal "!!(R1::real). [| R1 < R2 ==> P;  R1 = R2 ==> P; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   910
\                      R2 < R1 ==> P |] ==> P";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   911
by (cut_inst_tac [("R1.0","R1"),("R2.0","R2")] real_linear 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   912
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   913
qed "real_linear_less2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   914
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   915
(*** Properties of <= ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   916
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   917
Goalw [real_le_def] "~(w < z) ==> z <= (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   918
by (assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   919
qed "real_leI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   920
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   921
Goalw [real_le_def] "z<=w ==> ~(w<(z::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   922
by (assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   923
qed "real_leD";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   924
7428
80838c2af97b bind_thms;
wenzelm
parents: 7292
diff changeset
   925
bind_thm ("real_leE", make_elim real_leD);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   926
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   927
Goal "(~(w < z)) = (z <= (w::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   928
by (blast_tac (claset() addSIs [real_leI,real_leD]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   929
qed "real_less_le_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   930
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   931
Goalw [real_le_def] "~ z <= w ==> w<(z::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   932
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   933
qed "not_real_leE";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   934
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   935
Goalw [real_le_def] "!!(x::real). x <= y ==> x < y | x = y";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   936
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   937
by (blast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   938
qed "real_le_imp_less_or_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   939
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   940
Goalw [real_le_def] "z<w | z=w ==> z <=(w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   941
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   942
by (fast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   943
qed "real_less_or_eq_imp_le";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   944
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   945
Goal "(x <= (y::real)) = (x < y | x=y)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   946
by (REPEAT(ares_tac [iffI, real_less_or_eq_imp_le, real_le_imp_less_or_eq] 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   947
qed "real_le_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   948
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   949
Goal "w <= (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   950
by (simp_tac (simpset() addsimps [real_le_less]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   951
qed "real_le_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   952
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   953
(* Axiom 'linorder_linear' of class 'linorder': *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   954
Goal "(z::real) <= w | w <= z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   955
by (simp_tac (simpset() addsimps [real_le_less]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   956
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   957
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   958
qed "real_le_linear";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   959
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   960
Goal "[| i <= j; j <= k |] ==> i <= (k::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   961
by (EVERY1 [dtac real_le_imp_less_or_eq, dtac real_le_imp_less_or_eq,
10752
c4f1bf2acf4c tidying, and separation of HOL-Hyperreal from HOL-Real
paulson
parents: 10712
diff changeset
   962
            rtac real_less_or_eq_imp_le, 
c4f1bf2acf4c tidying, and separation of HOL-Hyperreal from HOL-Real
paulson
parents: 10712
diff changeset
   963
            blast_tac (claset() addIs [real_less_trans])]);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   964
qed "real_le_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   965
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   966
Goal "[| z <= w; w <= z |] ==> z = (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   967
by (EVERY1 [dtac real_le_imp_less_or_eq, dtac real_le_imp_less_or_eq,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   968
            fast_tac (claset() addEs [real_less_irrefl,real_less_asym])]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   969
qed "real_le_anti_sym";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   970
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   971
Goal "[| ~ y < x; y ~= x |] ==> x < (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   972
by (rtac not_real_leE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   973
by (blast_tac (claset() addDs [real_le_imp_less_or_eq]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   974
qed "not_less_not_eq_real_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   975
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   976
(* Axiom 'order_less_le' of class 'order': *)
11655
923e4d0d36d5 tuned parentheses in relational expressions;
wenzelm
parents: 10919
diff changeset
   977
Goal "((w::real) < z) = (w <= z & w ~= z)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   978
by (simp_tac (simpset() addsimps [real_le_def, real_neq_iff]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   979
by (blast_tac (claset() addSEs [real_less_asym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   980
qed "real_less_le";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   981
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   982
Goal "(0 < -R) = (R < (0::real))";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   983
by (res_inst_tac [("x","R")]  real_of_preal_trichotomyE 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   984
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   985
	      simpset() addsimps [real_of_preal_not_minus_gt_zero,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   986
                        real_of_preal_not_less_zero,real_of_preal_zero_less,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   987
                        real_of_preal_minus_less_zero]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   988
qed "real_minus_zero_less_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   989
Addsimps [real_minus_zero_less_iff];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   990
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
   991
Goal "(-R < 0) = ((0::real) < R)";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   992
by (res_inst_tac [("x","R")]  real_of_preal_trichotomyE 1);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   993
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   994
	      simpset() addsimps [real_of_preal_not_minus_gt_zero,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   995
                        real_of_preal_not_less_zero,real_of_preal_zero_less,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
   996
                        real_of_preal_minus_less_zero]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   997
qed "real_minus_zero_less_iff2";
12018
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
   998
Addsimps [real_minus_zero_less_iff2];
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   999
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1000
(*Alternative definition for real_less*)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
  1001
Goal "R < S ==> EX T::real. 0 < T & R + T = S";
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1002
by (res_inst_tac [("x","R")]  real_of_preal_trichotomyE 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1003
by (ALLGOALS(res_inst_tac [("x","S")]  real_of_preal_trichotomyE));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1004
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1005
	      simpset() addsimps [real_of_preal_not_minus_gt_all,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1006
				  real_of_preal_add, real_of_preal_not_less_zero,
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1007
				  real_less_not_refl,
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1008
				  real_of_preal_not_minus_gt_zero]));
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1009
by (res_inst_tac [("x","real_of_preal D")] exI 1);
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1010
by (res_inst_tac [("x","real_of_preal m+real_of_preal ma")] exI 2);
12018
ec054019c910 Numerals and simprocs for types real and hypreal. The abstract
paulson
parents: 11713
diff changeset
  1011
by (res_inst_tac [("x","real_of_preal D")] exI 3);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1012
by (auto_tac (claset(),
7077
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1013
	      simpset() addsimps [real_of_preal_zero_less,
60b098bb8b8a heavily revised by Jacques: coercions have alphabetic names;
paulson
parents: 5588
diff changeset
  1014
				  real_of_preal_sum_zero_less,real_add_assoc]));
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1015
qed "real_less_add_positive_left_Ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1016
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1017
(** change naff name(s)! **)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
  1018
Goal "(W < S) ==> (0 < S + (-W::real))";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1019
by (dtac real_less_add_positive_left_Ex 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1020
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1021
	      simpset() addsimps [real_add_minus,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1022
    real_add_zero_right] @ real_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1023
qed "real_less_sum_gt_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1024
7127
48e235179ffb added parentheses to cope with a possible reduction of the precedence of unary
paulson
parents: 7077
diff changeset
  1025
Goal "!!S::real. T = S + W ==> S = T + (-W)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1026
by (asm_simp_tac (simpset() addsimps real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1027
qed "real_lemma_change_eq_subj";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1028
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1029
(* FIXME: long! *)
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
  1030
Goal "(0 < S + (-W::real)) ==> (W < S)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1031
by (rtac ccontr 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1032
by (dtac (real_leI RS real_le_imp_less_or_eq) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1033
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1034
	      simpset() addsimps [real_less_not_refl]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1035
by (EVERY1[dtac real_less_add_positive_left_Ex, etac exE, etac conjE]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1036
by (Asm_full_simp_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1037
by (dtac real_lemma_change_eq_subj 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1038
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1039
by (dtac real_less_sum_gt_zero 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1040
by (asm_full_simp_tac (simpset() addsimps real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1041
by (EVERY1[rotate_tac 1, dtac (real_add_left_commute RS ssubst)]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1042
by (auto_tac (claset() addEs [real_less_asym], simpset()));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1043
qed "real_sum_gt_zero_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1044
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
  1045
Goal "(0 < S + (-W::real)) = (W < S)";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1046
by (blast_tac (claset() addIs [real_less_sum_gt_zero,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1047
			       real_sum_gt_zero_less]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1048
qed "real_less_sum_gt_0_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1049
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1050
9043
ca761fe227d8 First round of changes, towards installation of simprocs
paulson
parents: 8027
diff changeset
  1051
Goalw [real_diff_def] "(x<y) = (x-y < (0::real))";
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1052
by (stac (real_minus_zero_less_iff RS sym) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1053
by (simp_tac (simpset() addsimps [real_add_commute,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1054
				  real_less_sum_gt_0_iff]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1055
qed "real_less_eq_diff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1056
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1057
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1058
(*** Subtraction laws ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1059
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1060
Goal "x + (y - z) = (x + y) - (z::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1061
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1062
qed "real_add_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1063
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1064
Goal "(x - y) + z = (x + z) - (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1065
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1066
qed "real_diff_add_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1067
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1068
Goal "(x - y) - z = x - (y + (z::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1069
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1070
qed "real_diff_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1071
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1072
Goal "x - (y - z) = (x + z) - (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1073
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1074
qed "real_diff_diff_eq2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1075
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1076
Goal "(x-y < z) = (x < z + (y::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1077
by (stac real_less_eq_diff 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1078
by (res_inst_tac [("y1", "z")] (real_less_eq_diff RS ssubst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1079
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1080
qed "real_diff_less_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1081
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1082
Goal "(x < z-y) = (x + (y::real) < z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1083
by (stac real_less_eq_diff 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1084
by (res_inst_tac [("y1", "z-y")] (real_less_eq_diff RS ssubst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1085
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1086
qed "real_less_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1087
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1088
Goalw [real_le_def] "(x-y <= z) = (x <= z + (y::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1089
by (simp_tac (simpset() addsimps [real_less_diff_eq]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1090
qed "real_diff_le_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1091
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1092
Goalw [real_le_def] "(x <= z-y) = (x + (y::real) <= z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1093
by (simp_tac (simpset() addsimps [real_diff_less_eq]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1094
qed "real_le_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1095
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1096
Goalw [real_diff_def] "(x-y = z) = (x = z + (y::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1097
by (auto_tac (claset(), simpset() addsimps [real_add_assoc]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1098
qed "real_diff_eq_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1099
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1100
Goalw [real_diff_def] "(x = z-y) = (x + (y::real) = z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1101
by (auto_tac (claset(), simpset() addsimps [real_add_assoc]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1102
qed "real_eq_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1103
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1104
(*This list of rewrites simplifies (in)equalities by bringing subtractions
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1105
  to the top and then moving negative terms to the other side.  
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1106
  Use with real_add_ac*)
9108
9fff97d29837 bind_thm(s);
wenzelm
parents: 9043
diff changeset
  1107
bind_thms ("real_compare_rls",
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1108
  [symmetric real_diff_def,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1109
   real_add_diff_eq, real_diff_add_eq, real_diff_diff_eq, real_diff_diff_eq2, 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1110
   real_diff_less_eq, real_less_diff_eq, real_diff_le_eq, real_le_diff_eq, 
9108
9fff97d29837 bind_thm(s);
wenzelm
parents: 9043
diff changeset
  1111
   real_diff_eq_eq, real_eq_diff_eq]);
5588
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1112
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1113
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1114
(** For the cancellation simproc.
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1115
    The idea is to cancel like terms on opposite sides by subtraction **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1116
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1117
Goal "(x::real) - y = x' - y' ==> (x<y) = (x'<y')";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1118
by (stac real_less_eq_diff 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1119
by (res_inst_tac [("y1", "y")] (real_less_eq_diff RS ssubst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1120
by (Asm_simp_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1121
qed "real_less_eqI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1122
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1123
Goal "(x::real) - y = x' - y' ==> (y<=x) = (y'<=x')";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1124
by (dtac real_less_eqI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1125
by (asm_simp_tac (simpset() addsimps [real_le_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1126
qed "real_le_eqI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1127
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1128
Goal "(x::real) - y = x' - y' ==> (x=y) = (x'=y')";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1129
by Safe_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1130
by (ALLGOALS
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1131
    (asm_full_simp_tac
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1132
     (simpset() addsimps [real_eq_diff_eq, real_diff_eq_eq])));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1133
qed "real_eq_eqI";