src/HOL/Real/RealDef.ML
author wenzelm
Thu, 01 Jul 1999 21:19:45 +0200
changeset 6874 747f656e04ec
parent 5588 a3ab526bb891
child 7077 60b098bb8b8a
permissions -rw-r--r--
renamed with/APP to of/OF;
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
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     2
    Author      : Jacques D. Fleuriot
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     3
    Copyright   : 1998  University of Cambridge
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     4
    Description : The reals
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     5
*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     6
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     7
(*** Proving that realrel is an equivalence relation ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     8
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
     9
Goal "[| (x1::preal) + y2 = x2 + y1; x2 + y3 = x3 + y2 |] \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    10
\            ==> x1 + y3 = x3 + y1";        
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    11
by (res_inst_tac [("C","y2")] preal_add_right_cancel 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    12
by (rotate_tac 1 1 THEN dtac sym 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    13
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    14
by (rtac (preal_add_left_commute RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    15
by (res_inst_tac [("x1","x1")] (preal_add_assoc RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    16
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    17
qed "preal_trans_lemma";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    18
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    19
(** Natural deduction for realrel **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    20
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    21
Goalw [realrel_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    22
    "(((x1,y1),(x2,y2)): realrel) = (x1 + y2 = x2 + y1)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    23
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    24
qed "realrel_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    25
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    26
Goalw [realrel_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    27
    "[| x1 + y2 = x2 + y1 |] ==> ((x1,y1),(x2,y2)): realrel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    28
by (Blast_tac  1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    29
qed "realrelI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    30
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    31
Goalw [realrel_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    32
  "p: realrel --> (EX x1 y1 x2 y2. \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    33
\                  p = ((x1,y1),(x2,y2)) & x1 + y2 = x2 + y1)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    34
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    35
qed "realrelE_lemma";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    36
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    37
val [major,minor] = goal thy
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    38
  "[| p: realrel;  \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    39
\     !!x1 y1 x2 y2. [| p = ((x1,y1),(x2,y2));  x1+y2 = x2+y1 \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    40
\                    |] ==> Q |] ==> Q";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    41
by (cut_facts_tac [major RS (realrelE_lemma RS mp)] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    42
by (REPEAT (eresolve_tac [asm_rl,exE,conjE,minor] 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    43
qed "realrelE";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    44
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    45
AddSIs [realrelI];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    46
AddSEs [realrelE];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    47
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    48
Goal "(x,x): realrel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    49
by (stac surjective_pairing 1 THEN rtac (refl RS realrelI) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    50
qed "realrel_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    51
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    52
Goalw [equiv_def, refl_def, sym_def, trans_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    53
    "equiv {x::(preal*preal).True} realrel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    54
by (fast_tac (claset() addSIs [realrel_refl] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    55
                      addSEs [sym,preal_trans_lemma]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    56
qed "equiv_realrel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    57
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    58
val equiv_realrel_iff =
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    59
    [TrueI, TrueI] MRS 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    60
    ([CollectI, CollectI] MRS 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    61
    (equiv_realrel RS eq_equiv_class_iff));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    62
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    63
Goalw  [real_def,realrel_def,quotient_def] "realrel^^{(x,y)}:real";
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
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    67
Goal "inj_on Abs_real real";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    68
by (rtac inj_on_inverseI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    69
by (etac Abs_real_inverse 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    70
qed "inj_on_Abs_real";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    71
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    72
Addsimps [equiv_realrel_iff,inj_on_Abs_real RS inj_on_iff,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    73
          realrel_iff, realrel_in_real, Abs_real_inverse];
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];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    76
val eq_realrelD = equiv_realrel RSN (2,eq_equiv_class);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    77
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    78
Goal "inj(Rep_real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    79
by (rtac inj_inverseI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    80
by (rtac Rep_real_inverse 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    81
qed "inj_Rep_real";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    82
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    83
(** real_preal: the injection from preal to real **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    84
Goal "inj(real_preal)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    85
by (rtac injI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    86
by (rewtac real_preal_def);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    87
by (dtac (inj_on_Abs_real RS inj_onD) 1);
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);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    92
by Safe_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    93
by (Asm_full_simp_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    94
qed "inj_real_preal";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    95
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    96
val [prem] = goal thy
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    97
    "(!!x y. z = Abs_real(realrel^^{(x,y)}) ==> P) ==> P";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    98
by (res_inst_tac [("x1","z")] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
    99
    (rewrite_rule [real_def] Rep_real RS quotientE) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   100
by (dres_inst_tac [("f","Abs_real")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   101
by (res_inst_tac [("p","x")] PairE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   102
by (rtac prem 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   103
by (asm_full_simp_tac (simpset() addsimps [Rep_real_inverse]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   104
qed "eq_Abs_real";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   105
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   106
(**** real_minus: additive inverse on real ****)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   107
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   108
Goalw [congruent_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   109
  "congruent realrel (%p. split (%x y. realrel^^{(y,x)}) p)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   110
by Safe_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   111
by (asm_full_simp_tac (simpset() addsimps [preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   112
qed "real_minus_congruent";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   113
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   114
(*Resolve th against the corresponding facts for real_minus*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   115
val real_minus_ize = RSLIST [equiv_realrel, real_minus_congruent];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   116
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   117
Goalw [real_minus_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   118
      "- (Abs_real(realrel^^{(x,y)})) = Abs_real(realrel ^^ {(y,x)})";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   119
by (res_inst_tac [("f","Abs_real")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   120
by (simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   121
   [realrel_in_real RS Abs_real_inverse,real_minus_ize UN_equiv_class]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   122
qed "real_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   123
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   124
Goal "- (- z) = (z::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   125
by (res_inst_tac [("z","z")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   126
by (asm_simp_tac (simpset() addsimps [real_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   127
qed "real_minus_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   128
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   129
Addsimps [real_minus_minus];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   130
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   131
Goal "inj(%r::real. -r)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   132
by (rtac injI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   133
by (dres_inst_tac [("f","uminus")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   134
by (asm_full_simp_tac (simpset() addsimps [real_minus_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   135
qed "inj_real_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   136
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   137
Goalw [real_zero_def] "-0r = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   138
by (simp_tac (simpset() addsimps [real_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   139
qed "real_minus_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   140
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   141
Addsimps [real_minus_zero];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   142
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   143
Goal "(-x = 0r) = (x = 0r)"; 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   144
by (res_inst_tac [("z","x")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   145
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   146
	      simpset() addsimps [real_zero_def, real_minus] @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   147
qed "real_minus_zero_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   148
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   149
Addsimps [real_minus_zero_iff];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   150
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   151
Goal "(-x ~= 0r) = (x ~= 0r)"; 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   152
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   153
qed "real_minus_not_zero_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   154
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   155
(*** Congruence property for addition ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   156
Goalw [congruent2_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   157
    "congruent2 realrel (%p1 p2.                  \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   158
\         split (%x1 y1. split (%x2 y2. realrel^^{(x1+x2, y1+y2)}) p2) p1)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   159
by Safe_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   160
by (asm_simp_tac (simpset() addsimps [preal_add_assoc]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   161
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
   162
by (asm_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   163
by (asm_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   164
qed "real_add_congruent2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   165
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   166
(*Resolve th against the corresponding facts for real_add*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   167
val real_add_ize = RSLIST [equiv_realrel, real_add_congruent2];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   168
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   169
Goalw [real_add_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   170
  "Abs_real(realrel^^{(x1,y1)}) + Abs_real(realrel^^{(x2,y2)}) = \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   171
\  Abs_real(realrel^^{(x1+x2, y1+y2)})";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   172
by (asm_simp_tac (simpset() addsimps [real_add_ize UN_equiv_class2]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   173
qed "real_add";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   174
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   175
Goal "(z::real) + w = w + z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   176
by (res_inst_tac [("z","z")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   177
by (res_inst_tac [("z","w")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   178
by (asm_simp_tac (simpset() addsimps preal_add_ac @ [real_add]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   179
qed "real_add_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   180
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   181
Goal "((z1::real) + z2) + z3 = z1 + (z2 + z3)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   182
by (res_inst_tac [("z","z1")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   183
by (res_inst_tac [("z","z2")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   184
by (res_inst_tac [("z","z3")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   185
by (asm_simp_tac (simpset() addsimps [real_add, preal_add_assoc]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   186
qed "real_add_assoc";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   187
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   188
(*For AC rewriting*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   189
Goal "(x::real)+(y+z)=y+(x+z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   190
by (rtac (real_add_commute RS trans) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   191
by (rtac (real_add_assoc RS trans) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   192
by (rtac (real_add_commute RS arg_cong) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   193
qed "real_add_left_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   194
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   195
(* real addition is an AC operator *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   196
val real_add_ac = [real_add_assoc,real_add_commute,real_add_left_commute];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   197
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   198
Goalw [real_preal_def,real_zero_def] "0r + z = z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   199
by (res_inst_tac [("z","z")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   200
by (asm_full_simp_tac (simpset() addsimps [real_add] @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   201
qed "real_add_zero_left";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   202
Addsimps [real_add_zero_left];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   203
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   204
Goal "z + 0r = z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   205
by (simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   206
qed "real_add_zero_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   207
Addsimps [real_add_zero_right];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   208
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   209
Goalw [real_zero_def] "z + -z = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   210
by (res_inst_tac [("z","z")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   211
by (asm_full_simp_tac (simpset() addsimps [real_minus,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   212
        real_add, preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   213
qed "real_add_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   214
Addsimps [real_add_minus];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   215
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   216
Goal "-z + z = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   217
by (simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   218
qed "real_add_minus_left";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   219
Addsimps [real_add_minus_left];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   220
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   221
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   222
Goal "z + (- z + w) = (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   223
by (simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   224
qed "real_add_minus_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   225
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   226
Goal "(-z) + (z + w) = (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   227
by (simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   228
qed "real_minus_add_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   229
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   230
Addsimps [real_add_minus_cancel, real_minus_add_cancel];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   231
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   232
Goal "? y. (x::real) + y = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   233
by (blast_tac (claset() addIs [real_add_minus]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   234
qed "real_minus_ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   235
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   236
Goal "?! y. (x::real) + y = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   237
by (auto_tac (claset() addIs [real_add_minus],simpset()));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   238
by (dres_inst_tac [("f","%x. ya+x")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   239
by (asm_full_simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   240
by (asm_full_simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   241
qed "real_minus_ex1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   242
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   243
Goal "?! y. y + (x::real) = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   244
by (auto_tac (claset() addIs [real_add_minus_left],simpset()));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   245
by (dres_inst_tac [("f","%x. x+ya")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   246
by (asm_full_simp_tac (simpset() addsimps [real_add_assoc]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   247
by (asm_full_simp_tac (simpset() addsimps [real_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   248
qed "real_minus_left_ex1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   249
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   250
Goal "x + y = 0r ==> x = -y";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   251
by (cut_inst_tac [("z","y")] real_add_minus_left 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   252
by (res_inst_tac [("x1","y")] (real_minus_left_ex1 RS ex1E) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   253
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   254
qed "real_add_minus_eq_minus";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   255
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   256
Goal "-(x + y) = -x + -(y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   257
by (res_inst_tac [("z","x")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   258
by (res_inst_tac [("z","y")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   259
by (auto_tac (claset(),simpset() addsimps [real_minus,real_add]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   260
qed "real_minus_add_distrib";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   261
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   262
Addsimps [real_minus_add_distrib];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   263
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   264
Goal "((x::real) + y = x + z) = (y = z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   265
by (Step_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   266
by (dres_inst_tac [("f","%t.-x + t")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   267
by (asm_full_simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   268
qed "real_add_left_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   269
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   270
Goal "(y + (x::real)= z + x) = (y = z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   271
by (simp_tac (simpset() addsimps [real_add_commute,real_add_left_cancel]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   272
qed "real_add_right_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   273
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   274
Goal "0r - x = -x";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   275
by (simp_tac (simpset() addsimps [real_diff_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   276
qed "real_diff_0";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   277
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   278
Goal "x - 0r = x";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   279
by (simp_tac (simpset() addsimps [real_diff_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   280
qed "real_diff_0_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   281
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   282
Goal "x - x = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   283
by (simp_tac (simpset() addsimps [real_diff_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   284
qed "real_diff_self";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   285
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   286
Addsimps [real_diff_0, real_diff_0_right, real_diff_self];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   287
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   288
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   289
(*** Congruence property for multiplication ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   290
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   291
Goal "!!(x1::preal). [| x1 + y2 = x2 + y1 |] ==> \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   292
\         x * x1 + y * y1 + (x * y2 + x2 * y) = \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   293
\         x * x2 + y * y2 + (x * y1 + x1 * y)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   294
by (asm_full_simp_tac (simpset() addsimps [preal_add_left_commute,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   295
    preal_add_assoc RS sym,preal_add_mult_distrib2 RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   296
by (rtac (preal_mult_commute RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   297
by (res_inst_tac [("y1","x2")] (preal_mult_commute RS subst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   298
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   299
    preal_add_mult_distrib2 RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   300
by (asm_full_simp_tac (simpset() addsimps [preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   301
qed "real_mult_congruent2_lemma";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   302
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   303
Goal 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   304
    "congruent2 realrel (%p1 p2.                  \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   305
\         split (%x1 y1. split (%x2 y2. realrel^^{(x1*x2 + y1*y2, x1*y2+x2*y1)}) p2) p1)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   306
by (rtac (equiv_realrel RS congruent2_commuteI) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   307
by Safe_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   308
by (rewtac split_def);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   309
by (asm_simp_tac (simpset() addsimps [preal_mult_commute,preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   310
by (auto_tac (claset(),simpset() addsimps [real_mult_congruent2_lemma]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   311
qed "real_mult_congruent2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   312
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   313
(*Resolve th against the corresponding facts for real_mult*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   314
val real_mult_ize = RSLIST [equiv_realrel, real_mult_congruent2];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   315
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   316
Goalw [real_mult_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   317
   "Abs_real((realrel^^{(x1,y1)})) * Abs_real((realrel^^{(x2,y2)})) =   \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   318
\   Abs_real(realrel ^^ {(x1*x2+y1*y2,x1*y2+x2*y1)})";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   319
by (simp_tac (simpset() addsimps [real_mult_ize UN_equiv_class2]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   320
qed "real_mult";
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 "(z::real) * w = w * z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   323
by (res_inst_tac [("z","z")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   324
by (res_inst_tac [("z","w")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   325
by (asm_simp_tac
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   326
    (simpset() addsimps [real_mult] @ preal_add_ac @ preal_mult_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   327
qed "real_mult_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   328
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   329
Goal "((z1::real) * z2) * z3 = z1 * (z2 * z3)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   330
by (res_inst_tac [("z","z1")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   331
by (res_inst_tac [("z","z2")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   332
by (res_inst_tac [("z","z3")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   333
by (asm_simp_tac (simpset() addsimps [preal_add_mult_distrib2,real_mult] @ 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   334
                                     preal_add_ac @ preal_mult_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   335
qed "real_mult_assoc";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   336
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   337
qed_goal "real_mult_left_commute" thy
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   338
    "(z1::real) * (z2 * z3) = z2 * (z1 * z3)"
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   339
 (fn _ => [rtac (real_mult_commute RS trans) 1, rtac (real_mult_assoc RS trans) 1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   340
           rtac (real_mult_commute RS arg_cong) 1]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   341
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   342
(* real multiplication is an AC operator *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   343
val real_mult_ac = [real_mult_assoc, real_mult_commute, real_mult_left_commute];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   344
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   345
Goalw [real_one_def,pnat_one_def] "1r * z = z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   346
by (res_inst_tac [("z","z")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   347
by (asm_full_simp_tac
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   348
    (simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   349
			 preal_add_mult_distrib2,preal_mult_1_right] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   350
                        @ preal_mult_ac @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   351
qed "real_mult_1";
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];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   354
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   355
Goal "z * 1r = z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   356
by (simp_tac (simpset() addsimps [real_mult_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   357
qed "real_mult_1_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   358
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   359
Addsimps [real_mult_1_right];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   360
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   361
Goalw [real_zero_def,pnat_one_def] "0r * z = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   362
by (res_inst_tac [("z","z")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   363
by (asm_full_simp_tac (simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   364
    preal_add_mult_distrib2,preal_mult_1_right] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   365
    @ preal_mult_ac @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   366
qed "real_mult_0";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   367
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   368
Goal "z * 0r = 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   369
by (simp_tac (simpset() addsimps [real_mult_commute, real_mult_0]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   370
qed "real_mult_0_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   371
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   372
Addsimps [real_mult_0_right, real_mult_0];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   373
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   374
Goal "-(x * y) = -x * (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   375
by (res_inst_tac [("z","x")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   376
by (res_inst_tac [("z","y")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   377
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   378
	      simpset() addsimps [real_minus,real_mult] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   379
    @ preal_mult_ac @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   380
qed "real_minus_mult_eq1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   381
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   382
Goal "-(x * y) = x * -(y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   383
by (res_inst_tac [("z","x")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   384
by (res_inst_tac [("z","y")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   385
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   386
	      simpset() addsimps [real_minus,real_mult] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   387
    @ preal_mult_ac @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   388
qed "real_minus_mult_eq2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   389
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   390
Goal "- 1r * z = -z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   391
by (simp_tac (simpset() addsimps [real_minus_mult_eq1 RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   392
qed "real_mult_minus_1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   393
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   394
Addsimps [real_mult_minus_1];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   395
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   396
Goal "z * - 1r = -z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   397
by (stac real_mult_commute 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   398
by (Simp_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   399
qed "real_mult_minus_1_right";
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_mult_minus_1_right];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   402
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   403
Goal "-x * -y = x * (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   404
by (full_simp_tac (simpset() addsimps [real_minus_mult_eq2 RS sym,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   405
    real_minus_mult_eq1 RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   406
qed "real_minus_mult_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   407
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   408
Addsimps [real_minus_mult_cancel];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   409
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   410
Goal "-x * y = x * -(y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   411
by (full_simp_tac (simpset() addsimps [real_minus_mult_eq2 RS sym,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   412
    real_minus_mult_eq1 RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   413
qed "real_minus_mult_commute";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   414
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   415
(*-----------------------------------------------------------------------------
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   416
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   417
 -----------------------------------------------------------------------------*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   418
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   419
(** Lemmas **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   420
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   421
qed_goal "real_add_assoc_cong" thy
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   422
    "!!z. (z::real) + v = z' + v' ==> z + (v + w) = z' + (v' + w)"
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   423
 (fn _ => [(asm_simp_tac (simpset() addsimps [real_add_assoc RS sym]) 1)]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   424
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   425
qed_goal "real_add_assoc_swap" thy "(z::real) + (v + w) = v + (z + w)"
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   426
 (fn _ => [(REPEAT (ares_tac [real_add_commute RS real_add_assoc_cong] 1))]);
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 "((z1::real) + z2) * w = (z1 * w) + (z2 * w)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   429
by (res_inst_tac [("z","z1")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   430
by (res_inst_tac [("z","z2")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   431
by (res_inst_tac [("z","w")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   432
by (asm_simp_tac 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   433
    (simpset() addsimps [preal_add_mult_distrib2, real_add, real_mult] @ 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   434
                        preal_add_ac @ preal_mult_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   435
qed "real_add_mult_distrib";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   436
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   437
val real_mult_commute'= read_instantiate [("z","w")] real_mult_commute;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   438
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   439
Goal "(w::real) * (z1 + z2) = (w * z1) + (w * z2)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   440
by (simp_tac (simpset() addsimps [real_mult_commute',real_add_mult_distrib]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   441
qed "real_add_mult_distrib2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   442
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   443
(*** one and zero are distinct ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   444
Goalw [real_zero_def,real_one_def] "0r ~= 1r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   445
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   446
         simpset() addsimps [preal_self_less_add_left RS preal_not_refl2]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   447
qed "real_zero_not_eq_one";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   448
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   449
(*** existence of inverse ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   450
(** lemma -- alternative definition for 0r **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   451
Goalw [real_zero_def] "0r = Abs_real (realrel ^^ {(x, x)})";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   452
by (auto_tac (claset(),simpset() addsimps [preal_add_commute]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   453
qed "real_zero_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   454
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   455
Goalw [real_zero_def,real_one_def] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   456
          "!!(x::real). x ~= 0r ==> ? y. x*y = 1r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   457
by (res_inst_tac [("z","x")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   458
by (cut_inst_tac [("r1.0","xa"),("r2.0","y")] preal_linear 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   459
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   460
           simpset() addsimps [real_zero_iff RS sym]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   461
by (res_inst_tac [("x","Abs_real (realrel ^^ {(@#$#1p,pinv(D)+@#$#1p)})")] exI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   462
by (res_inst_tac [("x","Abs_real (realrel ^^ {(pinv(D)+@#$#1p,@#$#1p)})")] exI 2);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   463
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   464
	      simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   465
    pnat_one_def,preal_mult_1_right,preal_add_mult_distrib2,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   466
    preal_add_mult_distrib,preal_mult_1,preal_mult_inv_right] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   467
    @ preal_add_ac @ preal_mult_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   468
qed "real_mult_inv_right_ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   469
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   470
Goal "!!(x::real). x ~= 0r ==> ? y. y*x = 1r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   471
by (asm_simp_tac (simpset() addsimps [real_mult_commute,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   472
    real_mult_inv_right_ex]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   473
qed "real_mult_inv_left_ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   474
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   475
Goalw [rinv_def] "!!(x::real). x ~= 0r ==> rinv(x)*x = 1r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   476
by (forward_tac [real_mult_inv_left_ex] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   477
by (Step_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   478
by (rtac selectI2 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   479
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   480
qed "real_mult_inv_left";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   481
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   482
Goal "!!(x::real). x ~= 0r ==> x*rinv(x) = 1r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   483
by (auto_tac (claset() addIs [real_mult_commute RS subst],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   484
              simpset() addsimps [real_mult_inv_left]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   485
qed "real_mult_inv_right";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   486
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   487
Goal "(c::real) ~= 0r ==> (c*a=c*b) = (a=b)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   488
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   489
by (dres_inst_tac [("f","%x. x*rinv c")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   490
by (asm_full_simp_tac (simpset() addsimps [real_mult_inv_right] @ real_mult_ac)  1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   491
qed "real_mult_left_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   492
    
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   493
Goal "(c::real) ~= 0r ==> (a*c=b*c) = (a=b)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   494
by (Step_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   495
by (dres_inst_tac [("f","%x. x*rinv c")] arg_cong 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   496
by (asm_full_simp_tac (simpset() addsimps [real_mult_inv_right] @ real_mult_ac)  1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   497
qed "real_mult_right_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   498
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   499
Goalw [rinv_def] "x ~= 0r ==> rinv(x) ~= 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   500
by (forward_tac [real_mult_inv_left_ex] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   501
by (etac exE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   502
by (rtac selectI2 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   503
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   504
	      simpset() addsimps [real_mult_0,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   505
    real_zero_not_eq_one]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   506
qed "rinv_not_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   507
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   508
Addsimps [real_mult_inv_left,real_mult_inv_right];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   509
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   510
Goal "x ~= 0r ==> rinv(rinv x) = x";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   511
by (res_inst_tac [("c1","rinv x")] (real_mult_right_cancel RS iffD1) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   512
by (etac rinv_not_zero 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   513
by (auto_tac (claset() addDs [rinv_not_zero],simpset()));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   514
qed "real_rinv_rinv";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   515
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   516
Goalw [rinv_def] "rinv(1r) = 1r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   517
by (cut_facts_tac [real_zero_not_eq_one RS 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   518
       not_sym RS real_mult_inv_left_ex] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   519
by (etac exE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   520
by (rtac selectI2 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   521
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   522
	      simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   523
    [real_zero_not_eq_one RS not_sym]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   524
qed "real_rinv_1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   525
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   526
Goal "x ~= 0r ==> rinv(-x) = -rinv(x)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   527
by (res_inst_tac [("c1","-x")] (real_mult_right_cancel RS iffD1) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   528
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   529
qed "real_minus_rinv";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   530
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   531
      (*** theorems for ordering ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   532
(* prove introduction and elimination rules for real_less *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   533
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   534
(* real_less is a strong order i.e nonreflexive and transitive *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   535
(*** lemmas ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   536
Goal "!!(x::preal). [| x = y; x1 = y1 |] ==> x + y1 = x1 + y";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   537
by (asm_simp_tac (simpset() addsimps [preal_add_commute]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   538
qed "preal_lemma_eq_rev_sum";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   539
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   540
Goal "!!(b::preal). x + (b + y) = x1 + (b + y1) ==> x + y = x1 + y1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   541
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   542
qed "preal_add_left_commute_cancel";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   543
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   544
Goal "!!(x::preal). [| x + y2a = x2a + y; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   545
\                      x + y2b = x2b + y |] \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   546
\                   ==> x2a + y2b = x2b + y2a";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   547
by (dtac preal_lemma_eq_rev_sum 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   548
by (assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   549
by (thin_tac "x + y2b = x2b + y" 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   550
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   551
by (dtac preal_add_left_commute_cancel 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   552
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   553
qed "preal_lemma_for_not_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   554
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   555
Goal "~ (R::real) < R";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   556
by (res_inst_tac [("z","R")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   557
by (auto_tac (claset(),simpset() addsimps [real_less_def]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   558
by (dtac preal_lemma_for_not_refl 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   559
by (assume_tac 1 THEN rotate_tac 2 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   560
by (auto_tac (claset(),simpset() addsimps [preal_less_not_refl]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   561
qed "real_less_not_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   562
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   563
(*** y < y ==> P ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   564
bind_thm("real_less_irrefl", real_less_not_refl RS notE);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   565
AddSEs [real_less_irrefl];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   566
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   567
Goal "!!(x::real). x < y ==> x ~= y";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   568
by (auto_tac (claset(),simpset() addsimps [real_less_not_refl]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   569
qed "real_not_refl2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   570
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   571
(* lemma re-arranging and eliminating terms *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   572
Goal "!! (a::preal). [| a + b = c + d; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   573
\            x2b + d + (c + y2e) < a + y2b + (x2e + b) |] \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   574
\         ==> x2b + y2e < x2e + y2b";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   575
by (asm_full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   576
by (res_inst_tac [("C","c+d")] preal_add_left_less_cancel 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   577
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   578
qed "preal_lemma_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   579
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   580
(** heavy re-writing involved*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   581
Goal "!!(R1::real). [| R1 < R2; R2 < R3 |] ==> R1 < R3";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   582
by (res_inst_tac [("z","R1")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   583
by (res_inst_tac [("z","R2")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   584
by (res_inst_tac [("z","R3")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   585
by (auto_tac (claset(),simpset() addsimps [real_less_def]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   586
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   587
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   588
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   589
by (dtac preal_lemma_for_not_refl 1 THEN assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   590
by (blast_tac (claset() addDs [preal_add_less_mono] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   591
    addIs [preal_lemma_trans]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   592
qed "real_less_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   593
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   594
Goal "!! (R1::real). [| R1 < R2; R2 < R1 |] ==> P";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   595
by (dtac real_less_trans 1 THEN assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   596
by (asm_full_simp_tac (simpset() addsimps [real_less_not_refl]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   597
qed "real_less_asym";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   598
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   599
(****)(****)(****)(****)(****)(****)(****)(****)(****)(****)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   600
    (****** Map and more real_less ******)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   601
(*** mapping from preal into real ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   602
Goalw [real_preal_def] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   603
            "%#((z1::preal) + z2) = %#z1 + %#z2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   604
by (asm_simp_tac (simpset() addsimps [real_add,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   605
       preal_add_mult_distrib,preal_mult_1] addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   606
qed "real_preal_add";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   607
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   608
Goalw [real_preal_def] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   609
            "%#((z1::preal) * z2) = %#z1* %#z2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   610
by (full_simp_tac (simpset() addsimps [real_mult,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   611
        preal_add_mult_distrib2,preal_mult_1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   612
        preal_mult_1_right,pnat_one_def] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   613
        @ preal_add_ac @ preal_mult_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   614
qed "real_preal_mult";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   615
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   616
Goalw [real_preal_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   617
      "!!(x::preal). y < x ==> ? m. Abs_real (realrel ^^ {(x,y)}) = %#m";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   618
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   619
    simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   620
qed "real_preal_ExI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   621
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   622
Goalw [real_preal_def]
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   623
      "!!(x::preal). ? m. Abs_real (realrel ^^ {(x,y)}) = %#m ==> y < x";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   624
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   625
	      simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   626
    [preal_add_commute,preal_add_assoc]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   627
by (asm_full_simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   628
    [preal_add_assoc RS sym,preal_self_less_add_left]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   629
qed "real_preal_ExD";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   630
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   631
Goal "(? m. Abs_real (realrel ^^ {(x,y)}) = %#m) = (y < x)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   632
by (blast_tac (claset() addSIs [real_preal_ExI,real_preal_ExD]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   633
qed "real_preal_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   634
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   635
(*** Gleason prop 9-4.4 p 127 ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   636
Goalw [real_preal_def,real_zero_def] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   637
      "? m. (x::real) = %#m | x = 0r | x = -(%#m)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   638
by (res_inst_tac [("z","x")] eq_Abs_real 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   639
by (auto_tac (claset(),simpset() addsimps [real_minus] @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   640
by (cut_inst_tac [("r1.0","x"),("r2.0","y")] preal_linear 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   641
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   642
    simpset() addsimps [preal_add_assoc RS sym]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   643
by (auto_tac (claset(),simpset() addsimps [preal_add_commute]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   644
qed "real_preal_trichotomy";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   645
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   646
Goal "!!P. [| !!m. x = %#m ==> P; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   647
\             x = 0r ==> P; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   648
\             !!m. x = -(%#m) ==> P |] ==> P";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   649
by (cut_inst_tac [("x","x")] real_preal_trichotomy 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   650
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   651
qed "real_preal_trichotomyE";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   652
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   653
Goalw [real_preal_def] "%#m1 < %#m2 ==> m1 < m2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   654
by (auto_tac (claset(),simpset() addsimps [real_less_def] @ preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   655
by (auto_tac (claset(),simpset() addsimps [preal_add_assoc RS sym]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   656
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   657
qed "real_preal_lessD";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   658
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   659
Goal "m1 < m2 ==> %#m1 < %#m2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   660
by (dtac preal_less_add_left_Ex 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   661
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   662
	      simpset() addsimps [real_preal_add,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   663
    real_preal_def,real_less_def]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   664
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   665
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   666
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   667
by (simp_tac (simpset() addsimps [preal_self_less_add_left] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   668
    delsimps [preal_add_less_iff2]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   669
qed "real_preal_lessI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   670
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   671
Goal "(%#m1 < %#m2) = (m1 < m2)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   672
by (blast_tac (claset() addIs [real_preal_lessI,real_preal_lessD]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   673
qed "real_preal_less_iff1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   674
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   675
Addsimps [real_preal_less_iff1];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   676
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   677
Goal "- %#m < %#m";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   678
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   679
	      simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   680
    [real_preal_def,real_less_def,real_minus]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   681
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   682
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   683
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   684
by (full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   685
by (full_simp_tac (simpset() addsimps [preal_self_less_add_right,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   686
    preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   687
qed "real_preal_minus_less_self";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   688
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   689
Goalw [real_zero_def] "- %#m < 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   690
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   691
	      simpset() addsimps [real_preal_def,real_less_def,real_minus]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   692
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   693
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   694
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   695
by (full_simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   696
  [preal_self_less_add_right] @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   697
qed "real_preal_minus_less_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   698
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   699
Goal "~ 0r < - %#m";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   700
by (cut_facts_tac [real_preal_minus_less_zero] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   701
by (fast_tac (claset() addDs [real_less_trans] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   702
                        addEs [real_less_irrefl]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   703
qed "real_preal_not_minus_gt_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   704
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   705
Goalw [real_zero_def] "0r < %#m";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   706
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   707
	      simpset() addsimps [real_preal_def,real_less_def,real_minus]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   708
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   709
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   710
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   711
by (full_simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   712
		   [preal_self_less_add_right] @ preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   713
qed "real_preal_zero_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   714
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   715
Goal "~ %#m < 0r";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   716
by (cut_facts_tac [real_preal_zero_less] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   717
by (blast_tac (claset() addDs [real_less_trans] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   718
               addEs [real_less_irrefl]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   719
qed "real_preal_not_less_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   720
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   721
Goal "0r < - - %#m";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   722
by (simp_tac (simpset() addsimps 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   723
    [real_preal_zero_less]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   724
qed "real_minus_minus_zero_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   725
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   726
(* another lemma *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   727
Goalw [real_zero_def] "0r < %#m + %#m1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   728
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   729
	      simpset() addsimps [real_preal_def,real_less_def,real_add]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   730
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   731
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   732
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   733
by (full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   734
by (full_simp_tac (simpset() addsimps [preal_self_less_add_right,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   735
    preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   736
qed "real_preal_sum_zero_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   737
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   738
Goal "- %#m < %#m1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   739
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   740
	      simpset() addsimps [real_preal_def,real_less_def,real_minus]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   741
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   742
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   743
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   744
by (full_simp_tac (simpset() addsimps preal_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   745
by (full_simp_tac (simpset() addsimps [preal_self_less_add_right,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   746
    preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   747
qed "real_preal_minus_less_all";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   748
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   749
Goal "~ %#m < - %#m1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   750
by (cut_facts_tac [real_preal_minus_less_all] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   751
by (blast_tac (claset() addDs [real_less_trans] 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   752
               addEs [real_less_irrefl]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   753
qed "real_preal_not_minus_gt_all";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   754
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   755
Goal "- %#m1 < - %#m2 ==> %#m2 < %#m1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   756
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   757
	      simpset() addsimps [real_preal_def,real_less_def,real_minus]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   758
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   759
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   760
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   761
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   762
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   763
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   764
qed "real_preal_minus_less_rev1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   765
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   766
Goal "%#m1 < %#m2 ==> - %#m2 < - %#m1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   767
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   768
	      simpset() addsimps [real_preal_def,real_less_def,real_minus]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   769
by (REPEAT(rtac exI 1));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   770
by (EVERY[rtac conjI 1, rtac conjI 2]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   771
by (REPEAT(Blast_tac 2));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   772
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   773
by (asm_full_simp_tac (simpset() addsimps [preal_add_assoc RS sym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   774
by (auto_tac (claset(),simpset() addsimps preal_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   775
qed "real_preal_minus_less_rev2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   776
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   777
Goal "(- %#m1 < - %#m2) = (%#m2 < %#m1)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   778
by (blast_tac (claset() addSIs [real_preal_minus_less_rev1,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   779
               real_preal_minus_less_rev2]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   780
qed "real_preal_minus_less_rev_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   781
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   782
Addsimps [real_preal_minus_less_rev_iff];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   783
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   784
(*** linearity ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   785
Goal "(R1::real) < R2 | R1 = R2 | R2 < R1";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   786
by (res_inst_tac [("x","R1")]  real_preal_trichotomyE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   787
by (ALLGOALS(res_inst_tac [("x","R2")]  real_preal_trichotomyE));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   788
by (auto_tac (claset() addSDs [preal_le_anti_sym],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   789
              simpset() addsimps [preal_less_le_iff,real_preal_minus_less_zero,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   790
               real_preal_zero_less,real_preal_minus_less_all]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   791
qed "real_linear";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   792
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   793
Goal "!!w::real. (w ~= z) = (w<z | z<w)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   794
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   795
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   796
qed "real_neq_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   797
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   798
Goal "!!(R1::real). [| R1 < R2 ==> P;  R1 = R2 ==> P; \
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   799
\                      R2 < R1 ==> P |] ==> P";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   800
by (cut_inst_tac [("R1.0","R1"),("R2.0","R2")] real_linear 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   801
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   802
qed "real_linear_less2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   803
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   804
(*** Properties of <= ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   805
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   806
Goalw [real_le_def] "~(w < z) ==> z <= (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   807
by (assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   808
qed "real_leI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   809
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   810
Goalw [real_le_def] "z<=w ==> ~(w<(z::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   811
by (assume_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   812
qed "real_leD";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   813
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   814
val real_leE = make_elim real_leD;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   815
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   816
Goal "(~(w < z)) = (z <= (w::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   817
by (blast_tac (claset() addSIs [real_leI,real_leD]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   818
qed "real_less_le_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   819
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   820
Goalw [real_le_def] "~ z <= w ==> w<(z::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   821
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   822
qed "not_real_leE";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   823
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   824
Goalw [real_le_def] "z < w ==> z <= (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   825
by (blast_tac (claset() addEs [real_less_asym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   826
qed "real_less_imp_le";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   827
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   828
Goalw [real_le_def] "!!(x::real). x <= y ==> x < y | x = y";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   829
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   830
by (blast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   831
qed "real_le_imp_less_or_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   832
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   833
Goalw [real_le_def] "z<w | z=w ==> z <=(w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   834
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   835
by (fast_tac (claset() addEs [real_less_irrefl,real_less_asym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   836
qed "real_less_or_eq_imp_le";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   837
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   838
Goal "(x <= (y::real)) = (x < y | x=y)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   839
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
   840
qed "real_le_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   841
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   842
Goal "w <= (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   843
by (simp_tac (simpset() addsimps [real_le_less]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   844
qed "real_le_refl";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   845
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   846
AddIffs [real_le_refl];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   847
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   848
(* Axiom 'linorder_linear' of class 'linorder': *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   849
Goal "(z::real) <= w | w <= z";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   850
by (simp_tac (simpset() addsimps [real_le_less]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   851
by (cut_facts_tac [real_linear] 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   852
by (Blast_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   853
qed "real_le_linear";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   854
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   855
Goal "[| i <= j; j < k |] ==> i < (k::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   856
by (dtac real_le_imp_less_or_eq 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   857
by (blast_tac (claset() addIs [real_less_trans]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   858
qed "real_le_less_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   859
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   860
Goal "!! (i::real). [| i < j; j <= k |] ==> i < k";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   861
by (dtac real_le_imp_less_or_eq 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   862
by (blast_tac (claset() addIs [real_less_trans]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   863
qed "real_less_le_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   864
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   865
Goal "[| i <= j; j <= k |] ==> i <= (k::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   866
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
   867
            rtac real_less_or_eq_imp_le, blast_tac (claset() addIs [real_less_trans])]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   868
qed "real_le_trans";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   869
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   870
Goal "[| z <= w; w <= z |] ==> z = (w::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   871
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
   872
            fast_tac (claset() addEs [real_less_irrefl,real_less_asym])]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   873
qed "real_le_anti_sym";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   874
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   875
Goal "[| ~ y < x; y ~= x |] ==> x < (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   876
by (rtac not_real_leE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   877
by (blast_tac (claset() addDs [real_le_imp_less_or_eq]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   878
qed "not_less_not_eq_real_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   879
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   880
(* Axiom 'order_less_le' of class 'order': *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   881
Goal "(w::real) < z = (w <= z & w ~= z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   882
by (simp_tac (simpset() addsimps [real_le_def, real_neq_iff]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   883
by (blast_tac (claset() addSEs [real_less_asym]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   884
qed "real_less_le";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   885
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   886
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   887
Goal "(0r < -R) = (R < 0r)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   888
by (res_inst_tac [("x","R")]  real_preal_trichotomyE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   889
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   890
	      simpset() addsimps [real_preal_not_minus_gt_zero,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   891
                        real_preal_not_less_zero,real_preal_zero_less,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   892
                        real_preal_minus_less_zero]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   893
qed "real_minus_zero_less_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   894
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   895
Addsimps [real_minus_zero_less_iff];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   896
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   897
Goal "(-R < 0r) = (0r < R)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   898
by (res_inst_tac [("x","R")]  real_preal_trichotomyE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   899
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   900
	      simpset() addsimps [real_preal_not_minus_gt_zero,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   901
                        real_preal_not_less_zero,real_preal_zero_less,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   902
                        real_preal_minus_less_zero]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   903
qed "real_minus_zero_less_iff2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   904
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   905
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   906
(*Alternative definition for real_less*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   907
Goal "!!(R::real). R < S ==> ? T. 0r < T & R + T = S";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   908
by (res_inst_tac [("x","R")]  real_preal_trichotomyE 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   909
by (ALLGOALS(res_inst_tac [("x","S")]  real_preal_trichotomyE));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   910
by (auto_tac (claset() addSDs [preal_less_add_left_Ex],
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   911
	      simpset() addsimps [real_preal_not_minus_gt_all,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   912
				  real_preal_add, real_preal_not_less_zero,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   913
				  real_less_not_refl,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   914
				  real_preal_not_minus_gt_zero]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   915
by (res_inst_tac [("x","%#D")] exI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   916
by (res_inst_tac [("x","%#m+%#ma")] exI 2);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   917
by (res_inst_tac [("x","%#m")] exI 3);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   918
by (res_inst_tac [("x","%#D")] exI 4);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   919
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   920
	      simpset() addsimps [real_preal_zero_less,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   921
				  real_preal_sum_zero_less,real_add_assoc]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   922
qed "real_less_add_positive_left_Ex";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   923
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   924
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   925
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   926
(** change naff name(s)! **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   927
Goal "(W < S) ==> (0r < S + -W)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   928
by (dtac real_less_add_positive_left_Ex 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   929
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   930
	      simpset() addsimps [real_add_minus,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   931
    real_add_zero_right] @ real_add_ac));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   932
qed "real_less_sum_gt_zero";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   933
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   934
Goal "!!S::real. T = S + W ==> S = T + -W";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   935
by (asm_simp_tac (simpset() addsimps real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   936
qed "real_lemma_change_eq_subj";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   937
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   938
(* FIXME: long! *)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   939
Goal "(0r < S + -W) ==> (W < S)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   940
by (rtac ccontr 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   941
by (dtac (real_leI RS real_le_imp_less_or_eq) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   942
by (auto_tac (claset(),
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   943
	      simpset() addsimps [real_less_not_refl]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   944
by (EVERY1[dtac real_less_add_positive_left_Ex, etac exE, etac conjE]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   945
by (Asm_full_simp_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   946
by (dtac real_lemma_change_eq_subj 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   947
by Auto_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   948
by (dtac real_less_sum_gt_zero 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   949
by (asm_full_simp_tac (simpset() addsimps real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   950
by (EVERY1[rotate_tac 1, dtac (real_add_left_commute RS ssubst)]);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   951
by (auto_tac (claset() addEs [real_less_asym], simpset()));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   952
qed "real_sum_gt_zero_less";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   953
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   954
Goal "(0r < S + -W) = (W < S)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   955
by (blast_tac (claset() addIs [real_less_sum_gt_zero,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   956
			       real_sum_gt_zero_less]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   957
qed "real_less_sum_gt_0_iff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   958
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   959
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   960
Goalw [real_diff_def] "(x<y) = (x-y < 0r)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   961
by (stac (real_minus_zero_less_iff RS sym) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   962
by (simp_tac (simpset() addsimps [real_add_commute,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   963
				  real_less_sum_gt_0_iff]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   964
qed "real_less_eq_diff";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   965
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   966
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   967
(*** Subtraction laws ***)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   968
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   969
Goal "x + (y - z) = (x + y) - (z::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   970
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   971
qed "real_add_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   972
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   973
Goal "(x - y) + z = (x + z) - (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   974
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   975
qed "real_diff_add_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   976
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   977
Goal "(x - y) - z = x - (y + (z::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   978
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   979
qed "real_diff_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   980
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   981
Goal "x - (y - z) = (x + z) - (y::real)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   982
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   983
qed "real_diff_diff_eq2";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   984
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   985
Goal "(x-y < z) = (x < z + (y::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   986
by (stac real_less_eq_diff 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   987
by (res_inst_tac [("y1", "z")] (real_less_eq_diff RS ssubst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   988
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   989
qed "real_diff_less_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   990
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   991
Goal "(x < z-y) = (x + (y::real) < z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   992
by (stac real_less_eq_diff 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   993
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
   994
by (simp_tac (simpset() addsimps real_diff_def::real_add_ac) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   995
qed "real_less_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   996
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   997
Goalw [real_le_def] "(x-y <= z) = (x <= z + (y::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   998
by (simp_tac (simpset() addsimps [real_less_diff_eq]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
   999
qed "real_diff_le_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1000
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1001
Goalw [real_le_def] "(x <= z-y) = (x + (y::real) <= z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1002
by (simp_tac (simpset() addsimps [real_diff_less_eq]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1003
qed "real_le_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1004
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1005
Goalw [real_diff_def] "(x-y = z) = (x = z + (y::real))";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1006
by (auto_tac (claset(), simpset() addsimps [real_add_assoc]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1007
qed "real_diff_eq_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1008
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1009
Goalw [real_diff_def] "(x = z-y) = (x + (y::real) = z)";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1010
by (auto_tac (claset(), simpset() addsimps [real_add_assoc]));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1011
qed "real_eq_diff_eq";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1012
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1013
(*This list of rewrites simplifies (in)equalities by bringing subtractions
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1014
  to the top and then moving negative terms to the other side.  
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1015
  Use with real_add_ac*)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1016
val real_compare_rls = 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1017
  [symmetric real_diff_def,
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1018
   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
  1019
   real_diff_less_eq, real_less_diff_eq, real_diff_le_eq, real_le_diff_eq, 
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1020
   real_diff_eq_eq, real_eq_diff_eq];
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1021
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1022
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1023
(** For the cancellation simproc.
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1024
    The idea is to cancel like terms on opposite sides by subtraction **)
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1025
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1026
Goal "(x::real) - y = x' - y' ==> (x<y) = (x'<y')";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1027
by (stac real_less_eq_diff 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1028
by (res_inst_tac [("y1", "y")] (real_less_eq_diff RS ssubst) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1029
by (Asm_simp_tac 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1030
qed "real_less_eqI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1031
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1032
Goal "(x::real) - y = x' - y' ==> (y<=x) = (y'<=x')";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1033
by (dtac real_less_eqI 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1034
by (asm_simp_tac (simpset() addsimps [real_le_def]) 1);
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1035
qed "real_le_eqI";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1036
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1037
Goal "(x::real) - y = x' - y' ==> (x=y) = (x'=y')";
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1038
by Safe_tac;
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1039
by (ALLGOALS
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1040
    (asm_full_simp_tac
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1041
     (simpset() addsimps [real_eq_diff_eq, real_diff_eq_eq])));
a3ab526bb891 Revised version with Abelian group simprocs
paulson
parents:
diff changeset
  1042
qed "real_eq_eqI";