Theory TransNumberDerivations

Up to index of Isabelle/HOL/HOL-Complex/transnumber

theory TransNumberDerivations
imports TransNumberAxclass
begin

header {* Transarithmetic Theorems *} 

theory TransNumberDerivations

imports TransNumberAxclass 

begin

declare  A3[simp] A4[simp] A7[simp] A9[simp] A11[simp]   
            A14[simp] A15[simp] A16[simp] 
          A20[simp] A21[simp] A22[simp] A25[simp]; 

constdefs 
  reals :: "('a::trans_reals) set"
  "reals == {x. x ≠ Φ ∧ x ≠ ∞ ∧ x ≠ -∞}"; 

text{*Note : following subclassing allows reuse of standard add\_ac, etc. *} 

instance trans_reals ⊆  comm_monoid_add .. ; 

subsection{* Very elementary equations *} 

lemma additive_identity_right[simp]:" (x ::'a::trans_reals) + 0 = x"; 
  by (subst A2, simp); 

lemma multiplicative_identity_right[simp]:" (x ::'a::trans_reals) * 1 = x"; 
  by (subst A13, simp); 

lemma additive_nullity_right[simp]:" (x ::'a::trans_reals) + Φ = Φ"; 
  by (subst A2, simp);

lemma additive_infinity_right:"[| x ≠ -∞; x ≠ Φ |] ==> (x ::'a::trans_reals) + ∞ = ∞ "; 
  by (subst A2, subst A5, auto); 

lemma minus_minus[simp]: "(x ::'a::trans_reals) - - y = x + y"; 
  by (simp add: A6); 

lemma zero_mult_infinity[simp]: 
    "0 * (∞ ::'a::trans_reals) = Φ"; 
  by (subst A13, rule A16); 

lemma nullity_minus_left[simp]: "Φ - (x::'a::trans_reals) = Φ"; 
  by (simp add: A6); 

lemma nullity_minus_right[simp]: " (x::'a::trans_reals) - Φ = Φ"; 
  by (simp add: A6); 

lemma zero_minus_eq_uminus[simp]: "(0::'a::trans_reals) - x = -x"; 
  by (simp add: A6); 

lemma uminus_eq_uminus[simp]: "(-(x::'a::trans_reals) = -y) = (x = y)"; 
  by (safe, drule_tac  f="λ x. - x" in arg_cong, simp);   

lemma uminus_add_eq_minus: "-x + y = y - (x::'a::trans_reals)"; 
  by (subst A2, simp add: A6); 

lemma uminus_minus_commute: "-x - y = - y - (x::'a::trans_reals)"; 
  by (simp add: A6 A2); 

lemma x_add_y_minus_y: 
   "[| y ≠ Φ; y ≠ ∞; y ≠ -∞ |] ==> x + y - y = (x::'a::trans_reals)"; 
  apply  (subst A6, subst A1[THEN sym]); 
  by (simp add: A6[THEN sym] A8);

lemma uminus_x_add_x: "[| x≠ ∞; x≠ -∞; x≠ Φ |] ==>  -x + x = (0::'a::trans_reals)"; 
  by (subst A2, simp add: A6[THEN sym] A8);  

lemma x_minus_y_add_y: 
   "[| y ≠ Φ; y ≠ ∞; y ≠ -∞ |] ==> x - y + y = (x::'a::trans_reals)"; 
  apply  (subst A6, subst A1[THEN sym]); 
  by (simp add: uminus_x_add_x); 

lemma uminus_eq_nullity_iff[simp]: "!! x::'a::trans_reals. (-x = Φ) = (x = Φ)"; 
  by (auto, drule_tac f="λ x. -x" in arg_cong, simp); 

lemma uminus_eq_infinity_iff[simp]: "!! x::'a::trans_reals. (-x = ∞) = (x = -∞)"; 
  by (auto, drule_tac f="λ x. -x" in arg_cong, simp);

lemma infinity_minus: "[| x ≠ Φ; x ≠ ∞ |] ==> ∞ - x = (∞::'a::trans_reals)"; 
  by (subst A6, subst A5, simp_all); 

subsection{*Distinctness of six basic constants: 0, nullity, +1,-1, plus/minus infinity *} 

lemma not_zero_less_zero[simp]: "¬ 0 < (0::'a::trans_reals)"; 
  by (cut_tac a="0::'a" in A28, auto); 

lemma zero_noteq_nullity[simp]: "(0 ::'a::trans_reals) ≠ Φ"; 
  by (cut_tac a="Φ::'a" in A28, auto); 

lemmas nullity_noteq_zero[simp] = zero_noteq_nullity[THEN not_sym]; 

lemma zero_noteq_infinity[simp]: "(0 ::'a::trans_reals) ≠ ∞"; 
  by (cut_tac a="(∞::'a)" in A28, simp); 

lemmas infinity_noteq_zero[simp] = zero_noteq_infinity[THEN not_sym]; 

lemma nullity_not_less_zero[simp]: "¬ Φ < (0 ::'a::trans_reals)"; 
  by (cut_tac a="(Φ::'a)" in A28, simp); 

lemma zero_not_less_nullity[simp]: "¬ 0 < (Φ ::'a::trans_reals)"; 
  by (cut_tac a="(Φ::'a)" in A28, simp); 

lemma infinity_noteq_nullity[simp]: "(∞::'a::trans_reals) ≠ Φ"; 
  by (rule notI, drule_tac f="λ x. 0 < x" in arg_cong, simp); 

lemmas nullity_noteq_infinity[simp] = infinity_noteq_nullity[THEN not_sym]; 

lemma zero_less_one[simp]: "(0 ::'a::trans_reals) < 1"; 
  by (simp add: A23[THEN sym]); 

lemma not_one_less_zero[simp]: "¬ (1 < (0::'a::trans_reals))"; 
  by (cut_tac a="(1::'a)" in A28, auto);  

lemma zero_noteq_one[simp]: "(0 ::'a::trans_reals) ≠ 1"; 
  by (cut_tac a="(1::'a)" in A28, auto); 

lemmas one_noteq_zero[simp] = zero_noteq_one[THEN not_sym]; 

lemma one_noteq_infinity[simp]:  "(1 ::'a::trans_reals) ≠ ∞"; 
  apply (rule classical, simp); 
  by (drule_tac f="λ y. y * 0" in arg_cong, simp); 

lemmas infinity_noteq_one[simp] = one_noteq_infinity [THEN not_sym]; 

lemma nullity_noteq_one[simp]: "Φ ≠ (1 ::'a::trans_reals)"; 
  by (rule notI, drule_tac f="λ x. 0 < x" in arg_cong, simp); 

lemmas one_not_nullity [simp] = nullity_noteq_one [THEN not_sym]; 

lemma minus_one_less_zero[simp]: "(- 1 ::'a::trans_reals) < 0"; 
  by (subst A26[THEN sym], simp); 

lemma minus_one_mult_infinity[simp]: "(- 1 ::'a::trans_reals) * ∞ = - ∞"; 
  by (subst A13, rule A24[THEN iffD2], rule minus_one_less_zero); 

lemma zero_noteq_minus_one[simp]: "(0::'a::trans_reals) ≠ - 1"; 
  by (cut_tac a="- (1::'a)" in A28, auto); 

lemmas minus_one_noteq_zero[simp] = zero_noteq_minus_one [THEN not_sym]; 

lemma not_one_less_minus_one[simp]: "¬ ((0::'a::trans_reals) < - 1)"; 
  by (cut_tac a="- (1::'a)" in A28, auto); 
  
lemma one_noteq_minus_one[simp]: "(1::'a::trans_reals) ≠ - 1"; 
  by (rule notI, drule_tac f="λ x. x < 0" in arg_cong, simp); 

lemmas minus_one_noteq_one[simp] = one_noteq_minus_one [THEN not_sym]; 

lemma infinity_noteq_minus_one[simp]: "∞ ≠ (- 1 ::'a::trans_reals)"; 
  by (rule notI, drule_tac f="λ x. 0 < x" in arg_cong, simp); 

lemmas minus_one_not_infinity [simp] = infinity_noteq_minus_one [THEN not_sym]; 

lemma nullity_noteq_minus_one[simp]: "Φ ≠ (- 1 ::'a::trans_reals)"; 
  by (rule notI, drule_tac f="λ x. x < 0" in arg_cong, simp); 

lemmas minus_one_not_nullity [simp] = nullity_noteq_minus_one [THEN not_sym]; 

lemma zero_noteq_minus_infinity[simp]: "0 ≠ (- ∞ ::'a::trans_reals)"; 
  apply (cut_tac a="- (∞ ::'a)" in A28, simp,safe); 
  apply (erule notE); 
  apply (rule A26[THEN iffD1]); 
  by (subst A6, subst A7, simp);   

lemmas minus_infinity_noteq_zero[simp] = zero_noteq_minus_infinity[THEN not_sym]; 

lemma uminus_zero[simp]: "-(0 ::'a::trans_reals) = 0"; 
  by (cut_tac a="0::'a" in A8, simp_all add: A6); 

lemma uminus_eq_zero_iff[simp]: "!! x::'a::trans_reals. (-x = 0) = (x = 0)"; 
  by (auto, drule_tac f="λ x. -x" in arg_cong, simp); 

lemma minus_infinity_less_zero[simp]: "(-∞ ::'a::trans_reals) < 0"; 
  by (rule A26 [THEN iffD1], simp);  

lemma minus_infinity_mult_infinity[simp]: "(-∞ ::'a::trans_reals) * ∞ = - ∞"; 
  by (subst A13, rule A24[THEN iffD2], rule minus_infinity_less_zero); 

lemma not_zero_less_minus_infinity[simp]:  "¬ 0 <  (-∞ ::'a::trans_reals)"; 
  by (cut_tac a="- (∞ ::'a)" in A28, auto); 
  
lemma one_noteq_minus_infinity[simp]: "1 ≠ (-∞ ::'a::trans_reals)"; 
  apply (rule notI, drule_tac f="λ x. - x" in arg_cong);
  by (simp only: A7  minus_one_not_infinity); 

lemmas minus_infinity_noteq_one[simp] = one_noteq_minus_infinity [THEN not_sym]; 

lemma infinity_noteq_minus_infinity[simp]: "∞ ≠ (-∞ ::'a::trans_reals)"; 
  by (rule notI, drule_tac f="λ x. 0 < x" in arg_cong, simp); 

lemmas minus_infinity_noteq_infinity[simp]
        = infinity_noteq_minus_infinity[THEN not_sym]; 

lemma nullity_noteq_minus_infinity[simp]: "Φ ≠ (-∞ ::'a::trans_reals)"; 
  by (rule notI, drule_tac f="λ x. - x" in arg_cong, simp); 

lemmas minus_infinity_noteq_nullity[simp]
        = nullity_noteq_minus_infinity[THEN not_sym]; 

lemma one_minus_one_eq_zero[simp]: "(1::'a::trans_reals) - 1 = 0"; 
  by (subst A8, auto); 

lemma less_irreflexive[simp]: "¬ x < (x::'a::trans_reals)"; 
  apply (subst A26[THEN sym]); 
  apply (case_tac "x = ∞", simp); 
  apply (case_tac "x = -∞", simp add: A2 A6[THEN sym]); 
  apply (case_tac "x=Φ", simp add: A6); 
  by (subst A8, auto); 

text {* TODO: less\_transitive *}  

lemma not_less_zero_and_zero_less: 
    "[| x < (0 ::'a::trans_reals); 0 < x |] ==> P"; 
  by (cut_tac a="(x::'a)" in A28, auto); 

lemma less_zero_imp_not_zero: "x < (0 ::'a::trans_reals) ==> x ≠ 0"; 
  by auto; 

lemma zero_less_imp_not_zero: "(0 ::'a::trans_reals) < x ==> x ≠ 0"; 
  by auto; 

subsection{* sign equivalences *} 

lemma sgn_negative_iff: 
  "!! a ::'a::trans_reals. (sgn a = - 1) = (a < 0)"; 
  apply (unfold trans_sgn, auto); 
  by (erule not_less_zero_and_zero_less, auto); 

lemma sgn_positive_iff: 
   "!! a ::'a::trans_reals.  (sgn a = 1) = (0 < a)"; 
  by (unfold trans_sgn, auto); 

lemma sgn_zero[simp]: "sgn (0 ::'a::trans_reals) = 0"; 
  by (unfold trans_sgn, simp); 

lemma sgn_zero_iff: "(sgn (x ::'a::trans_reals) = 0) = (x = 0)"; 
  by (unfold trans_sgn, simp); 

lemma sgn_nullity[simp]: "sgn (Φ ::'a::trans_reals) = Φ"; 
  by (unfold trans_sgn, simp); 

lemma sgn_nullity_iff: "(sgn (x ::'a::trans_reals) = Φ) = (x = Φ)"; 
  apply (unfold trans_sgn, simp); 
  by (cut_tac a="(x::'a)" in A28, auto); 

subsection{* Algebraic stuff and inequalities... *} 

lemma infinity_add_infinity[simp]: "(∞ ::'a::trans_reals) + ∞ = ∞"; 
  by (simp add: A5);

lemma minus_infinity_minus_infinity[simp]: "-(∞ ::'a::trans_reals) - ∞ = -∞"; 
  by (simp add: A10); 

lemma minus_infinity_add_infinity[simp]: "-(∞ ::'a::trans_reals) + ∞ = Φ"; 
  by (subst A2, simp add: A6[THEN sym]); 

lemma not_nullity_less[simp]: "¬ Φ  < (x::'a::trans_reals)"; 
  apply (subst A26[THEN sym]); 
  apply (simp add: A23[THEN sym] A6); 
  by (subst A13, simp); 

lemma not_less_nullity[simp]: "¬ x  < (Φ::'a::trans_reals)"; 
  apply (subst A26[THEN sym]); 
  apply (simp add: A23[THEN sym] A6); 
  by (subst A13, simp); 

lemma not_nullity_le_infinity: "x ≠ Φ ==> x < ∞ | x = (∞::'a::trans_reals)";
  by (subst A26[THEN sym], clarsimp simp: infinity_minus); 

lemma less_infinity_iff: "(x < ∞) = (x ≠ (∞::'a::trans_reals) ∧ x ≠ Φ)"; 
  by (auto dest: not_nullity_le_infinity);

lemma not_nullity_minus_infinity_le: "x ≠ Φ ==>   -∞  < x | x = (-∞::'a::trans_reals)";
  by (subst A26[THEN sym], clarsimp simp: infinity_minus additive_infinity_right); 

lemma minus_infinity_less_iff: "(-∞ < x) = (x ≠ (-∞::'a::trans_reals) ∧ x ≠ Φ)"; 
  by (auto dest: not_nullity_minus_infinity_le);

lemma infinity_add_eq_nullity: 
   "(∞ + x = Φ) = (x = - (∞ ::'a::trans_reals) ∨ x = Φ)"; 
  apply (safe, simp_all add: A6[THEN sym]); 
  apply (case_tac "x=∞", simp); 
  apply (drule_tac f="λ a. a - x" in arg_cong); 
  apply (erule_tac Q="?x = ?y" in contrapos_pp); 
  apply (simp add: A1[THEN sym] A6); 
  by(simp add: A6[THEN sym] A8);   

lemma infinity_minus_eq_nullity: 
   "(x - ∞ = Φ) = (x =  (∞ ::'a::trans_reals) ∨ x = Φ)"; 
  apply (safe, simp_all add: A6[THEN sym]); 
  apply (case_tac "x=-∞", simp); 
  apply (drule_tac f="λ a. -x + a" in arg_cong); 
  apply (erule_tac Q="?x = ?y" in contrapos_pp); 
  by (simp add: A1 A6 uminus_x_add_x); 

lemma add_eq_nullity_iff:
    "(x + y = (Φ::'a::trans_reals)) = 
            (x = Φ ∨ y = Φ ∨ (x=∞ ∧ y = - ∞) ∨ (x= - ∞ ∧ y = ∞))"; 
  apply auto; 
  apply (simp_all add: A6[THEN sym]); 

  apply (drule_tac f="λ a. - x + a" in arg_cong); 
  apply (erule_tac Q="?x = ?y" in contrapos_pp); 
  apply (simp add: A1 uminus_x_add_x); 

  apply (case_tac "x=∞", simp add: infinity_add_eq_nullity); 
  apply (drule_tac f="λ a. - x + a" in arg_cong); 
  apply (erule_tac Q="?x = ?y" in contrapos_pp); 
  apply (simp add: A1 uminus_x_add_x);

  apply (case_tac "y=-∞", simp add: A6[THEN sym] infinity_minus_eq_nullity); 
  apply (drule_tac f="λ a. a - y" in arg_cong); 
  apply (erule_tac Q="?x = ?y" in contrapos_pp); 
  apply (simp add: x_add_y_minus_y); 

  apply (drule_tac f="λ a. a - y" in arg_cong); 
  apply (erule_tac Q="?x = ?y" in contrapos_pp); 
  by (simp add: x_add_y_minus_y); 

lemma minus_nullity_eq_iff: 
   "(x - y = (Φ ::'a::trans_reals)) = 
            (x = Φ ∨ y = Φ ∨ (x=∞ ∧ y = ∞) ∨ (x= - ∞ ∧ y = -∞))"; 

  by (simp add: A6 add_eq_nullity_iff); 

lemma add_infinity:
    "x + (∞ ::'a::trans_reals) =  (if x = Φ | x = -∞  then Φ else ∞)"; 
  apply (case_tac "x=Φ", simp); 
  apply (case_tac "x=-∞", subst A2, simp add: A6[THEN sym]); 
  by (subst A2, simp add: A5); 

lemma add_infinity_not_eq[simp]: 
   "(x ::'a::trans_reals) + ∞ ≠ 0 ∧ (x ::'a::trans_reals) + ∞ ≠ -∞"; 
  by (simp add: add_infinity); 

lemma subtract_infinity: 
     "x - (∞ ::'a::trans_reals) = (if x = Φ | x = ∞  then Φ else -∞)"; 
  apply (case_tac "x=Φ", simp); 
  apply (case_tac "x=∞", simp); 
  by (simp add: A10); 

lemma subtract_infinity_not_eq[simp]: 
   "(x ::'a::trans_reals) - ∞ ≠ 0 ∧ (x ::'a::trans_reals) - ∞ ≠ ∞"; 
  by (simp add: subtract_infinity); 

lemma minus_nullD: "x - y = (0 ::'a::trans_reals) ==> x = y"; 
  apply (case_tac "y = Φ", simp); 
  apply (case_tac "y=∞", simp); 
  apply (case_tac "y = -∞", simp); 
  apply (drule_tac f="λ a. a + y" in arg_cong); 
  apply (erule_tac Q="?x = ?y" in contrapos_pp);
  by (simp add: A6 A1[THEN sym] uminus_x_add_x);

lemma add_cancel_right: "[|  x + a = y + a; a ≠ Φ; a ≠ ∞; a ≠ -∞ |] 
         ==> x = (y ::'a::trans_reals)"; 
  apply (drule_tac f = "λ x. x - a" in arg_cong);
  by (simp add: x_add_y_minus_y);  

lemma add_cancel_left: "[|  a + x = a + y; a ≠ Φ; a ≠ ∞; a ≠ -∞ |] 
         ==> x = (y ::'a::trans_reals)"; 
  apply (drule_tac f = "λ x. x - a" in arg_cong);
  apply (simp add: A6); 
  apply (erule_tac Q="?a = ?b" in contrapos_pp); 
  apply (subst add_commute); 
  apply (subst add_commute [where a=a]); 
  apply (simp add: add_assoc);  
  by (simp add: A6[THEN sym] A8); 

lemma add_eq_infinity_iff:
    "(x + y = (∞::'a::trans_reals)) = 
            ((x = ∞  ∧ y ≠  Φ ∧ y ≠ -∞) ∨ (y = ∞  ∧  x ≠  Φ ∧ x ≠ -∞))"; 
  apply safe; 
  apply (simp_all add: A6[THEN sym] A5 uminus_add_eq_minus); defer; 
  apply (subst A2, simp add: A5); 
  apply (case_tac "y=Φ", simp); 
  apply (case_tac "y=-∞", simp add: A6[THEN sym]); 
  apply (rule_tac a="y" in add_cancel_right);  
  by (simp add: A5, assumption+); 

lemma add_eq_minus_infinity_iff:
    "(x + y = (-∞::'a::trans_reals)) = 
            ((x = -∞  ∧ y ≠  Φ ∧ y ≠ ∞) ∨ (y = -∞  ∧  x ≠  Φ ∧ x ≠ ∞))"; 
   apply safe; 
  apply (simp_all add: A6[THEN sym] A10 uminus_add_eq_minus); defer; 
  apply (erule contrapos_pp, subst A2, simp); 
  apply (case_tac "y=Φ", simp); 
  apply (case_tac "y=∞", simp add: A6[THEN sym]); 
  apply (rule_tac a="y" in add_cancel_right); 
  by (simp add: uminus_add_eq_minus A10,  assumption+); 

lemma reals_add: "!! x::'a::trans_reals.
    [|  x ≠ Φ; x ≠ ∞; x ≠ -∞;  y ≠ Φ; y ≠ ∞; y ≠ -∞
      |] ==> (x + y) ≠ Φ ∧ (x + y) ≠ ∞  ∧ (x + y) ≠ -∞ "; 
  apply safe; 
  apply (simp add: add_eq_nullity_iff); 
  apply (simp add: add_eq_infinity_iff); 
  by (simp add: add_eq_minus_infinity_iff); 

subsection {* Closure of reals under addition *} 
lemma reals_add_closed: "[| x ∈ reals; y ∈ reals |] ==> x + y ∈ reals"; 

  by (unfold reals_def, simp add: reals_add); 

text {* Distributivity of uminus over addition *} 

lemma uminus_distrib_add: "-(x + y) = - x - (y ::'a::trans_reals)"; 
   apply (case_tac "x=Φ", simp); 
  apply (tactic "ALLGOALS(case_tac \"y=Φ\")", simp_all); 
  apply (case_tac "x=∞", simp); 
  apply (tactic "ALLGOALS(case_tac \"y=∞\")", simp_all); 
  apply (tactic "ALLGOALS(case_tac \"x=-∞\")", simp_all); 
  apply (tactic "ALLGOALS(case_tac \"y=-∞\")"); 
  apply (simp_all add: A6[THEN sym]  uminus_add_eq_minus infinity_minus A10); 

  apply (simp add: A5, subst uminus_minus_commute); 
  apply (simp add: A10); 
  apply (subst A2, simp add: A5); 

  apply (rule_tac a = "x" in add_cancel_left); 
  apply (simp add: A6 A1); 
  apply (simp add: A6[THEN sym] A8); 

  apply (rule_tac a = "y" in add_cancel_left); 
  apply (simp add: A6[THEN sym] A8); 
  apply (simp add: A6); 
  apply (subst  A1[where a = y]); 
  apply (simp add: A6[THEN sym]); 
  apply (subst A2 [where a=y]); 
  apply (rule A8); 
  by (simp_all add: reals_add); 

lemma uminus_distrib_minus: "-(x - y) = - x + (y ::'a::trans_reals)"; 
  by (simp add: A6 uminus_distrib_add); 

lemma ordering_opp: "(x - y < 0) = (x < (y::'a::trans_reals))"; 
  apply (subst A26 [THEN sym]); 
  apply (simp add: A6 uminus_distrib_add uminus_add_eq_minus); 
  by (simp add: A26 A6[THEN sym]); 

text {* Trichotomy *} 
lemma trichotomy: 
       "[| x ≠ Φ; y ≠ (Φ::'a::trans_reals) |] ==> (x < y) | (x = y) | (y < x)";  
  apply (cut_tac a="((x-y)::'a)" in A28, auto); 
  apply (simp_all add: A26); 
  apply (simp add: minus_nullity_eq_iff, safe); 
  apply (erule minus_nullD); 
  by (simp add: ordering_opp);

lemma reals_uminus: "!! x::'a::trans_reals.
    [|  x ≠ Φ; x ≠ ∞; x ≠ -∞ |] ==> -x  ≠ Φ ∧ -x ≠ ∞  ∧ -x ≠ -∞ "; 
  by (safe, simp_all); 

subsection{* Closure of reals under uminus *} 
lemma reals_uminus_closed: " x ∈ reals ==> -x ∈ reals"; 
  by (unfold reals_def, simp add: reals_add); 

text{* Closure of positives transreals under addition *} 
lemma zero_less_add: 
  "!! a ::'a::trans_reals. [| 0 < a; 0 < b |] ==> 0 < a + b"; 
  apply (subst A23[THEN sym]); 
  apply (subst A29, auto); 
  apply (simp add: sgn_positive_iff[THEN iffD2]); 
  by (simp add: A23[THEN iffD2]); 

lemma reals_interval: "reals = {x. -∞ < x ∧ x < ∞}"; 
  by (auto simp: reals_def less_infinity_iff minus_infinity_less_iff);

lemma reals_cases: "x ∈ reals ==> (x < 0) | x = 0 | (0 < x)"; 
  apply (unfold reals_def, clarsimp); 
  by (cut_tac A28 [where a="x"], simp); 

lemma not_infinity_less[simp]: "¬ (∞ < (x::'a::trans_reals))"; 
  by (subst A26[THEN sym], simp add: subtract_infinity); 

lemma not_less_minus_infinity[simp]: "¬ ((x::'a::trans_reals) < -∞)"; 
  apply (subst A26[THEN sym]); 
  apply (subst uminus_minus_commute); 
  by (simp add: subtract_infinity); 

text {* Left distributivy of multiplication over addition *} 
lemma distrib_left: 
     "¬ ((c = ∞ ∨ c = - ∞) ∧ sgn a ≠ sgn b ∧ (a + b ∉ {0,Φ})) 
         ==>  (a+b) * c = (a * c)+(b * (c::'a::trans_reals))";   

   apply (subst A13[where a="a+b"]); 
   apply (subst A13[where a="a"]); 
   apply (subst A13[where a="b"]); 
  by (simp add: A29);

lemma zero_mult_not_less_zero:"¬ ((0::'a::trans_reals) * x < 0)"; 
  by (simp add: A24[THEN sym] A12); 

lemma not_zero_less_zero_mult:"¬ (0 < (0::'a::trans_reals) * x)"; 
  by (simp add: A23[THEN sym] A12); 

lemma zero_mult_eq_zero_or_nullity: "(0::'a::trans_reals) * x = 0 ∨ 0 * x = Φ"; 
  apply (cut_tac A28 [where a="0 * x"]); 
  by (auto simp: zero_mult_not_less_zero not_zero_less_zero_mult); 

lemma zero_mult_minus_one: "(0::'a::trans_reals) * - 1 = 0"; 
  apply (cut_tac zero_mult_eq_zero_or_nullity [where x="- 1::'a"], clarsimp); 
  apply (drule_tac f ="λ x. x + 0 * (1 + 1)" in arg_cong);
  by (simp add: A29[THEN sym] A1 uminus_add_eq_minus A8); 

lemma zero_mult_zero: "(0::'a::trans_reals) * 0 = 0"; 
  apply (subgoal_tac "(0::'a::trans_reals) * (1 + - 1) = 0"); 
  apply (simp add: A6 [THEN sym]); 
  by (simp add: A29 zero_mult_minus_one); 

text {* Multiplicative inverse *} 
lemma mult_inverse: "[| a ≠ 0; a: reals |] ==> a * inverse a = (1::'a::trans_reals)"; 
  by (unfold reals_def, clarsimp, drule A18, assumption+, simp add: A17); 

lemma zero_mult_real_not_zero: "[| (x::'a::trans_reals): reals; x ≠ 0 |] ==> 0 * x = 0"; 
  apply (cut_tac zero_mult_eq_zero_or_nullity [where x="x"], safe); 
  apply (drule_tac f="λ y. y * inverse x" in arg_cong); 
  by (simp add: A12 [THEN sym] mult_inverse); 

text {* Multiplication with zero *} 
lemma zero_mult_reals: "x : reals ==> 0 * x = (0::'a::trans_reals) ∧ x * 0 = 0"; 
  apply (rule context_conjI); 
  apply (case_tac "x=0"); 
  apply (simp add: zero_mult_zero); 
  apply (erule zero_mult_real_not_zero, assumption); 
  by (subst A13, assumption); 

lemmas zero_mult  = zero_mult_reals [unfolded reals_def, simplified]; 

lemma mult_zero: "x ≠ Φ ∧ x ≠ ∞ ∧ x ≠ - ∞ ==> x * (0::'a::trans_reals) = 0"; 
  apply (rule trans); defer; 
  apply (rule zero_mult [THEN conjunct1], assumption); 
  by (rule A13); 

text {* Multiplication with -1 *} 
lemma minus_one_mult_uminus_reals:  
    "x : reals ==>  (- 1 ::'a::trans_reals) * x = -x"; 
  apply (rule_tac a="x" in add_cancel_right, unfold reals_def, safe); 
  apply (simp add: uminus_add_eq_minus A8); 
  apply (subst A14[where a="x", THEN sym]); back; 
  apply (subst A13); 
  apply (subst A13); back; 
  apply (subst A29[THEN sym]); 
  apply simp; 
  by (simp add:  uminus_add_eq_minus A8 mult_zero); 

lemma minus_one_mult_minus_one[simp]: "(- 1 ::'a::trans_reals) * - 1 = 1"; 
  by (simp add: minus_one_mult_uminus_reals reals_def); 

lemma minus_one_mult_uminus:  
      "(- 1 ::'a::trans_reals) * x = -x"; 
  apply (case_tac "x=Φ", simp add: A13); 
  apply (case_tac "x=∞", simp); 
  apply (case_tac "x=-∞", clarsimp); 
  apply (subst minus_one_mult_infinity[THEN sym]); 
  apply (subst A12); 
  apply (subst minus_one_mult_minus_one, simp); 
  apply (rule minus_one_mult_uminus_reals); 
  by (simp add: reals_def);

lemma minus_one_mult_minus_infinity[simp]: "(- 1 ::'a::trans_reals) * - ∞ = ∞"; 
  by (simp add: minus_one_mult_uminus); 

lemma mult_nullity_right[simp]: "(x::'a::trans_reals) * Φ = Φ"; 
  by (subst A13, rule A15); 

lemma zero_mult_minus_infinity[simp]: "(0::'a::trans_reals) * - ∞ = Φ"; 
  apply (subst minus_one_mult_infinity[THEN sym]); 
  apply (subst A12); 
  by (simp add: zero_mult); 

lemma minus_infinity_mult_zero[simp]: "- ∞ * (0::'a::trans_reals) = Φ"; 
  by (subst A13, rule zero_mult_minus_infinity);

lemma uminus_mult_left: "-((x::'a::trans_reals) * y) = (- x) * y"; 
  apply (subst minus_one_mult_uminus[THEN sym]); 
  apply (subst A12); 
  by (simp add: minus_one_mult_uminus);

lemma uminus_mult_right: "-((x::'a::trans_reals) * y) = x * (- y)"; 
  apply (subst minus_one_mult_uminus[THEN sym]);
  apply (subst A13);  
  apply (subst A12 [THEN sym]); 
  apply (subst A13 [where a="y"]); 
  by (simp add: minus_one_mult_uminus); 

lemma uminus_mult_uminus [simp]: "-(x::'a::trans_reals) * (- y) = x * y"; 
  apply (subst uminus_mult_left[THEN sym]); 
  by (simp add: uminus_mult_right); 

lemma zero_less_uminus_iff_less_zero: "(0 < - x) = ((x::'a::trans_reals) < 0)"; 
   apply (simp add: A23[THEN sym] A24[THEN sym], auto); 
   apply (drule_tac f ="λ x. -x" in arg_cong); 
   apply (simp add: uminus_mult_right); 
   apply (drule_tac f ="λ x. -x" in arg_cong); 
   by (simp add: uminus_mult_right); 

lemma uminus_less_zero_iff_zero_less: "(-x < 0) = (0 < (x::'a::trans_reals))"; 
   apply (simp add: A23[THEN sym] A24[THEN sym], auto); 
   apply (drule_tac f ="λ x. -x" in arg_cong); 
   apply (simp add: uminus_mult_right); 
   apply (drule_tac f ="λ x. -x" in arg_cong); 
   by (simp add: uminus_mult_right); 

lemma less_not_sym: "(x::'a::trans_reals) < y ==> ¬ (y < x)"; 
  apply (rule notI, drule A26[THEN iffD2], drule A26[THEN iffD2]); 
  apply (drule  uminus_less_zero_iff_zero_less[THEN iffD2]);  
   apply (simp add: uminus_distrib_minus uminus_add_eq_minus); 
  by (erule not_less_zero_and_zero_less, assumption); 

text{* Closure of positive transreals under multiplication *} 

lemma mult_gt_zero_gt_zero: 
  "!! a ::'a::trans_reals. [| 0 < a; 0 < b |] ==> 0 < a * b"; 
  apply (subst A23[THEN sym]); 
  apply (subst A12); 
  apply (subst A23[THEN iffD2], assumption); 
  by (erule A23[THEN iffD2]);

text{* Mixed-sign multiplication *} 

lemma mult_gt_zero_less_zero: 
     "!! a::'a::trans_reals. [| 0 < a; b < 0 |] ==> a * b < 0"; 
  apply (subst A24[THEN sym]); 
  apply (subst A12); 
  apply (subst A23[THEN iffD2], assumption); 
  by (erule A24[THEN iffD2]);

lemma mult_less_zero_gt_zero: 
     "!! a::'a::trans_reals. [| a < 0; 0 < b |] ==> a * b < 0"; 
  by (subst A13, erule mult_gt_zero_less_zero, assumption); 

text{* Multiplication of two negative transreals *} 

lemma mult_less_zero_less_zero: 
     "!! a::'a::trans_reals. [| a < 0; b < 0 |] ==> 0 < a * b"; 
  apply (subst A23[THEN sym]); 
  apply (subst A12); 
  apply (subst A24[THEN iffD2], assumption); 
  apply (subst minus_one_mult_infinity [THEN sym]); 
  apply (subst A12[THEN sym]); 
  by (subst A24 [THEN iffD2], auto);

lemma infinity_mult: 
   "∞ * (x::'a::trans_reals) = 
     (if x < 0 then -∞ else if 0 < x then ∞ else Φ)"; 
  apply (auto simp add: A23 A24); 
  by (cut_tac A28 [where a="x"], auto); 

lemma mult_infinity: 
   "(x::'a::trans_reals) * ∞ = 
     (if x < 0 then -∞ else if 0 < x then ∞ else Φ)"; 
  by (subst A13, rule infinity_mult); 

lemma minus_infinity_mult: 
   "-∞ * (x::'a::trans_reals) =
    (if x < 0 then ∞ else if 0 < x then -∞ else Φ)"; 
  apply (subst minus_one_mult_infinity[THEN sym]); 
  apply (subst A12 [THEN sym]); 
  apply (subst infinity_mult); 
  by (auto simp: minus_one_mult_uminus);    

lemma mult_minus_infinity: 
 "(x::'a::trans_reals) * -∞= 
    (if x < 0 then ∞ else if 0 < x then -∞ else Φ)"; 
  by (subst A13, rule minus_infinity_mult); 

text{* Some inverse rules *} 

lemma inverse_infinity[simp]: "inverse (∞)  = (0 ::'a::trans_reals)";
  apply (subst A20[THEN sym]); 
  apply (rule A19); 
  by (cut_tac a="(∞::'a)" in A28, auto); 

lemma inverse_nullity_iff: 
  "!! x::'a::trans_reals. (inverse x = Φ) = (x = Φ)"; 
  apply (safe, simp_all); 
  apply (frule_tac f="inverse" in arg_cong);
  apply (case_tac "x=-∞", simp);
  by (thin_tac "inverse x = Φ", simp add: A19);

 lemma inverse_noteq_zero: 
   "!! x::'a::trans_reals. [| x ≠ ∞; x ≠ -∞ |]  ==> inverse x ≠ 0"; 
  apply (case_tac "x=Φ", simp); 
  apply (subst inverse_infinity[THEN sym]); 
  apply (rule notI); 
  by (drule_tac f="inverse" in arg_cong, simp add: A19); 

lemma inverse_zero_iff[simp]: 
    "!! x::'a::trans_reals. (inverse x = 0) = (x = ∞ | x = -∞)"; 
  by (auto, rule classical, cut_tac x="x" in inverse_noteq_zero, auto); 

lemma inverse_infinity_iff[simp]: 
    "!! x::'a::trans_reals. (inverse x = ∞) = (x = 0)"; 
  apply (case_tac "x=Φ", simp); 
  apply (case_tac "x=∞", simp); 
  apply (case_tac "x=-∞", simp); 
  apply (case_tac "x=0", auto); 
  apply (drule_tac f= "λ a. x * a" in arg_cong); 
  apply (simp add: mult_inverse reals_def mult_infinity); 
  apply (case_tac "x < 0", simp); 
  by (case_tac "0 < x", simp_all); 

lemma inverse_minus_infinity_iff[simp]: "!! x::'a::trans_reals. (inverse x ≠ -∞)"; 
  apply (case_tac "x=Φ", simp); 
  apply (case_tac "x=∞", simp); 
  apply (case_tac "x=-∞", simp); 
  apply (case_tac "x=0", auto); 
  apply (drule_tac f= "λ a. x * a" in arg_cong); 
  apply (simp add: mult_inverse reals_def mult_minus_infinity); 
  apply (case_tac "x < 0", simp); 
  by (case_tac "0 < x", simp_all); 

subsection{* Closure of positive reals under inverse *} 

lemma zero_less_inverse: 
  "!! x ::'a::trans_reals. [| 0 < x; x ≠ ∞ |] ==> 0 < inverse x"  
  apply (case_tac "x=Φ", simp); 
  apply (case_tac "x=0", simp); 
  apply (case_tac "x=-∞", simp); 
  apply (cut_tac a="x" in A18, assumption+); 
  apply (simp add: A17); 
  apply (subgoal_tac "inverse x ≠ Φ"); defer; 
  apply (simp add: inverse_nullity_iff); 
  apply (drule_tac trichotomy[where y = "0"]); back; 
  apply (auto); 
  by (drule_tac mult_gt_zero_less_zero, assumption, simp); 

lemma inverse_less_zero: 
  "[| (x::'a::trans_reals) < 0; x ≠ -∞ |] ==> inverse x < 0"  
  apply (case_tac "x=Φ", simp); 
  apply (case_tac "x=0", simp); 
  apply (case_tac "x=∞", simp);
  apply (cut_tac a="x" in A18, assumption+); 
  apply (simp add: A17); 
  apply (subgoal_tac "inverse x ≠ Φ"); defer; 
  apply (simp add: inverse_nullity_iff);
  apply (cut_tac reals_cases [where x = "inverse x"],auto); 
  apply (drule_tac mult_less_zero_gt_zero, assumption, simp); 
  by (auto simp: reals_def); 

lemma inverse_less_zero_iff[simp]: 
   "(x::'a::trans_reals) ≠ -∞ ==> (inverse x < 0) = (x < 0)"  
  apply (rule iffI); 
  apply (drule_tac inverse_less_zero, simp); 
  apply (simp add: A19); 
  by (erule inverse_less_zero, assumption); 

lemma zero_less_inverse_iff[simp]: 
   "[| (x::'a::trans_reals) ≠ ∞; x ≠ 0 |] ==> (0 < inverse x) = (0 < x)"; 
  apply (case_tac "x=-∞", simp); 
  apply (rule iffI); 
  apply (drule_tac zero_less_inverse, simp); 
  apply (simp add: A19); 
  by (erule zero_less_inverse, assumption); 

lemma less_not_nullity: 
    "(x::'a::trans_reals) < y ==> x ≠ Φ ∧ y ≠ Φ ∧ x ≠ ∞ ∧ y ≠ -∞"; 
  by (auto); 

subsection{* Closure of reals under multiplication *} 

lemma reals_mult_closed: "[| x : reals; y : reals |] ==> x * y : reals"; 
  apply (frule_tac x="x" in reals_cases, frule_tac x="y" in reals_cases, safe); 
  apply (simp_all add: zero_mult_reals);
  (* case <,< *)  
  apply (frule mult_less_zero_less_zero, assumption); back; 
  apply (subst reals_def, clarsimp simp: less_not_nullity);
  apply (drule_tac f = "λ a. a * inverse y" in arg_cong); 
  apply (simp add: A12 [THEN sym] 
     mult_inverse less_zero_imp_not_zero infinity_mult reals_def); 
  (* case <,> *)  
  apply (frule mult_less_zero_gt_zero, assumption); 
  apply (subst reals_def, clarsimp simp: less_not_nullity);
  apply (drule_tac f = "λ a. a * inverse y" in arg_cong);
  apply (frule_tac y="y" in less_not_sym); 
  apply (simp add: A12 [THEN sym] 
     mult_inverse zero_less_imp_not_zero minus_infinity_mult reals_def);
  (* case >,< *)  
  apply (frule mult_gt_zero_less_zero, assumption); 
  apply (subst reals_def, clarsimp simp: less_not_nullity);
  apply (drule_tac f = "λ a. a * inverse y" in arg_cong);
  apply (simp add: A12 [THEN sym] 
     mult_inverse less_zero_imp_not_zero minus_infinity_mult reals_def);
 (* case >,> *) 
   apply (frule mult_gt_zero_gt_zero, assumption); back; 
  apply (subst reals_def, clarsimp simp: less_not_nullity);
  apply (drule_tac f = "λ a. a * inverse y" in arg_cong);
  apply (frule_tac y="y" in less_not_sym); 
  by (simp add: A12 [THEN sym] 
     mult_inverse zero_less_imp_not_zero infinity_mult reals_def); 


end 


   


   






Very elementary equations

lemma additive_identity_right:

  x + (0::'a) = x

lemma multiplicative_identity_right:

  x * (1::'a) = x

lemma additive_nullity_right:

  x + Φ = Φ

lemma additive_infinity_right:

  [| x ≠ - ∞; x ≠ Φ |] ==> x + ∞ = ∞

lemma minus_minus:

  x - - y = x + y

lemma zero_mult_infinity:

  (0::'a) * ∞ = Φ

lemma nullity_minus_left:

  Φ - x = Φ

lemma nullity_minus_right:

  x - Φ = Φ

lemma zero_minus_eq_uminus:

  (0::'a) - x = - x

lemma uminus_eq_uminus:

  (- x = - y) = (x = y)

lemma uminus_add_eq_minus:

  - x + y = y - x

lemma uminus_minus_commute:

  - x - y = - y - x

lemma x_add_y_minus_y:

  [| y ≠ Φ; y ≠ ∞; y ≠ - ∞ |] ==> x + y - y = x

lemma uminus_x_add_x:

  [| x ≠ ∞; x ≠ - ∞; x ≠ Φ |] ==> - x + x = (0::'a)

lemma x_minus_y_add_y:

  [| y ≠ Φ; y ≠ ∞; y ≠ - ∞ |] ==> x - y + y = x

lemma uminus_eq_nullity_iff:

  (- x = Φ) = (x = Φ)

lemma uminus_eq_infinity_iff:

  (- x = ∞) = (x = - ∞)

lemma infinity_minus:

  [| x ≠ Φ; x ≠ ∞ |] ==> ∞ - x = ∞

Distinctness of six basic constants: 0, nullity, +1,-1, plus/minus infinity

lemma not_zero_less_zero:

  ¬ (0::'a) < (0::'a)

lemma zero_noteq_nullity:

  (0::'a) ≠ Φ

lemmas nullity_noteq_zero:

  Φ ≠ (0::'a1)

lemmas nullity_noteq_zero:

  Φ ≠ (0::'a1)

lemma zero_noteq_infinity:

  (0::'a) ≠ ∞

lemmas infinity_noteq_zero:

  ∞ ≠ (0::'a1)

lemmas infinity_noteq_zero:

  ∞ ≠ (0::'a1)

lemma nullity_not_less_zero:

  ¬ Φ < (0::'a)

lemma zero_not_less_nullity:

  ¬ (0::'a) < Φ

lemma infinity_noteq_nullity:

  ∞ ≠ Φ

lemmas nullity_noteq_infinity:

  Φ ≠ ∞

lemmas nullity_noteq_infinity:

  Φ ≠ ∞

lemma zero_less_one:

  (0::'a) < (1::'a)

lemma not_one_less_zero:

  ¬ (1::'a) < (0::'a)

lemma zero_noteq_one:

  (0::'a) ≠ (1::'a)

lemmas one_noteq_zero:

  (1::'a1) ≠ (0::'a1)

lemmas one_noteq_zero:

  (1::'a1) ≠ (0::'a1)

lemma one_noteq_infinity:

  (1::'a) ≠ ∞

lemmas infinity_noteq_one:

  ∞ ≠ (1::'a1)

lemmas infinity_noteq_one:

  ∞ ≠ (1::'a1)

lemma nullity_noteq_one:

  Φ ≠ (1::'a)

lemmas one_not_nullity:

  (1::'a1) ≠ Φ

lemmas one_not_nullity:

  (1::'a1) ≠ Φ

lemma minus_one_less_zero:

  - (1::'a) < (0::'a)

lemma minus_one_mult_infinity:

  - (1::'a) * ∞ = - ∞

lemma zero_noteq_minus_one:

  (0::'a) ≠ - (1::'a)

lemmas minus_one_noteq_zero:

  - (1::'a1) ≠ (0::'a1)

lemmas minus_one_noteq_zero:

  - (1::'a1) ≠ (0::'a1)

lemma not_one_less_minus_one:

  ¬ (0::'a) < - (1::'a)

lemma one_noteq_minus_one:

  (1::'a) ≠ - (1::'a)

lemmas minus_one_noteq_one:

  - (1::'a1) ≠ (1::'a1)

lemmas minus_one_noteq_one:

  - (1::'a1) ≠ (1::'a1)

lemma infinity_noteq_minus_one:

  ∞ ≠ - (1::'a)

lemmas minus_one_not_infinity:

  - (1::'a1) ≠ ∞

lemmas minus_one_not_infinity:

  - (1::'a1) ≠ ∞

lemma nullity_noteq_minus_one:

  Φ ≠ - (1::'a)

lemmas minus_one_not_nullity:

  - (1::'a1) ≠ Φ

lemmas minus_one_not_nullity:

  - (1::'a1) ≠ Φ

lemma zero_noteq_minus_infinity:

  (0::'a) ≠ - ∞

lemmas minus_infinity_noteq_zero:

  - ∞ ≠ (0::'a1)

lemmas minus_infinity_noteq_zero:

  - ∞ ≠ (0::'a1)

lemma uminus_zero:

  - (0::'a) = (0::'a)

lemma uminus_eq_zero_iff:

  (- x = (0::'a)) = (x = (0::'a))

lemma minus_infinity_less_zero:

  - ∞ < (0::'a)

lemma minus_infinity_mult_infinity:

  - ∞ * ∞ = - ∞

lemma not_zero_less_minus_infinity:

  ¬ (0::'a) < - ∞

lemma one_noteq_minus_infinity:

  (1::'a) ≠ - ∞

lemmas minus_infinity_noteq_one:

  - ∞ ≠ (1::'a1)

lemmas minus_infinity_noteq_one:

  - ∞ ≠ (1::'a1)

lemma infinity_noteq_minus_infinity:

  ∞ ≠ - ∞

lemmas minus_infinity_noteq_infinity:

  - ∞ ≠ ∞

lemmas minus_infinity_noteq_infinity:

  - ∞ ≠ ∞

lemma nullity_noteq_minus_infinity:

  Φ ≠ - ∞

lemmas minus_infinity_noteq_nullity:

  - ∞ ≠ Φ

lemmas minus_infinity_noteq_nullity:

  - ∞ ≠ Φ

lemma one_minus_one_eq_zero:

  (1::'a) - (1::'a) = (0::'a)

lemma less_irreflexive:

  ¬ x < x

lemma not_less_zero_and_zero_less:

  [| x < (0::'a); (0::'a) < x |] ==> P

lemma less_zero_imp_not_zero:

  x < (0::'a) ==> x ≠ (0::'a)

lemma zero_less_imp_not_zero:

  (0::'a) < x ==> x ≠ (0::'a)

sign equivalences

lemma sgn_negative_iff:

  (sgn a = - (1::'a)) = (a < (0::'a))

lemma sgn_positive_iff:

  (sgn a = (1::'a)) = ((0::'a) < a)

lemma sgn_zero:

  sgn (0::'a) = (0::'a)

lemma sgn_zero_iff:

  (sgn x = (0::'a)) = (x = (0::'a))

lemma sgn_nullity:

  sgn Φ = Φ

lemma sgn_nullity_iff:

  (sgn x = Φ) = (x = Φ)

Algebraic stuff and inequalities...

lemma infinity_add_infinity:

  ∞ + ∞ = ∞

lemma minus_infinity_minus_infinity:

  - ∞ - ∞ = - ∞

lemma minus_infinity_add_infinity:

  - ∞ + ∞ = Φ

lemma not_nullity_less:

  ¬ Φ < x

lemma not_less_nullity:

  ¬ x < Φ

lemma not_nullity_le_infinity:

  x ≠ Φ ==> x < ∞ ∨ x = ∞

lemma less_infinity_iff:

  (x < ∞) = (x ≠ ∞ ∧ x ≠ Φ)

lemma not_nullity_minus_infinity_le:

  x ≠ Φ ==> - ∞ < xx = - ∞

lemma minus_infinity_less_iff:

  (- ∞ < x) = (x ≠ - ∞ ∧ x ≠ Φ)

lemma infinity_add_eq_nullity:

  (∞ + x = Φ) = (x = - ∞ ∨ x = Φ)

lemma infinity_minus_eq_nullity:

  (x - ∞ = Φ) = (x = ∞ ∨ x = Φ)

lemma add_eq_nullity_iff:

  (x + y = Φ) = (x = Φ ∨ y = Φ ∨ x = ∞ ∧ y = - ∞ ∨ x = - ∞ ∧ y = ∞)

lemma minus_nullity_eq_iff:

  (x - y = Φ) = (x = Φ ∨ y = Φ ∨ x = ∞ ∧ y = ∞ ∨ x = - ∞ ∧ y = - ∞)

lemma add_infinity:

  x + ∞ = (if x = Φ ∨ x = - ∞ then Φ else ∞)

lemma add_infinity_not_eq:

  x + ∞ ≠ (0::'a) ∧ x + ∞ ≠ - ∞

lemma subtract_infinity:

  x - ∞ = (if x = Φ ∨ x = ∞ then Φ else - ∞)

lemma subtract_infinity_not_eq:

  x - ∞ ≠ (0::'a) ∧ x - ∞ ≠ ∞

lemma minus_nullD:

  x - y = (0::'a) ==> x = y

lemma add_cancel_right:

  [| x + a = y + a; a ≠ Φ; a ≠ ∞; a ≠ - ∞ |] ==> x = y

lemma add_cancel_left:

  [| a + x = a + y; a ≠ Φ; a ≠ ∞; a ≠ - ∞ |] ==> x = y

lemma add_eq_infinity_iff:

  (x + y = ∞) = (x = ∞ ∧ y ≠ Φ ∧ y ≠ - ∞ ∨ y = ∞ ∧ x ≠ Φ ∧ x ≠ - ∞)

lemma add_eq_minus_infinity_iff:

  (x + y = - ∞) = (x = - ∞ ∧ y ≠ Φ ∧ y ≠ ∞ ∨ y = - ∞ ∧ x ≠ Φ ∧ x ≠ ∞)

lemma reals_add:

  [| x ≠ Φ; x ≠ ∞; x ≠ - ∞; y ≠ Φ; y ≠ ∞; y ≠ - ∞ |]
  ==> x + y ≠ Φ ∧ x + y ≠ ∞ ∧ x + y ≠ - ∞

Closure of reals under addition

lemma reals_add_closed:

  [| x ∈ reals; y ∈ reals |] ==> x + y ∈ reals

lemma uminus_distrib_add:

  - (x + y) = - x - y

lemma uminus_distrib_minus:

  - (x - y) = - x + y

lemma ordering_opp:

  (x - y < (0::'a)) = (x < y)

lemma trichotomy:

  [| x ≠ Φ; y ≠ Φ |] ==> x < yx = yy < x

lemma reals_uminus:

  [| x ≠ Φ; x ≠ ∞; x ≠ - ∞ |] ==> - x ≠ Φ ∧ - x ≠ ∞ ∧ - x ≠ - ∞

Closure of reals under uminus

lemma reals_uminus_closed:

  x ∈ reals ==> - x ∈ reals

lemma zero_less_add:

  [| (0::'a) < a; (0::'a) < b |] ==> (0::'a) < a + b

lemma reals_interval:

  reals = {x. - ∞ < xx < ∞}

lemma reals_cases:

  x ∈ reals ==> x < (0::'a) ∨ x = (0::'a) ∨ (0::'a) < x

lemma not_infinity_less:

  ¬ ∞ < x

lemma not_less_minus_infinity:

  ¬ x < - ∞

lemma distrib_left:

  ¬ ((c = ∞ ∨ c = - ∞) ∧ sgn a ≠ sgn ba + b ∉ {0::'a, Φ})
  ==> (a + b) * c = a * c + b * c

lemma zero_mult_not_less_zero:

  ¬ (0::'a) * x < (0::'a)

lemma not_zero_less_zero_mult:

  ¬ (0::'a) < (0::'a) * x

lemma zero_mult_eq_zero_or_nullity:

  (0::'a) * x = (0::'a) ∨ (0::'a) * x = Φ

lemma zero_mult_minus_one:

  (0::'a) * - (1::'a) = (0::'a)

lemma zero_mult_zero:

  (0::'a) * (0::'a) = (0::'a)

lemma mult_inverse:

  [| a ≠ (0::'a); a ∈ reals |] ==> a * inverse a = (1::'a)

lemma zero_mult_real_not_zero:

  [| x ∈ reals; x ≠ (0::'a) |] ==> (0::'a) * x = (0::'a)

lemma zero_mult_reals:

  x ∈ reals ==> (0::'a) * x = (0::'a) ∧ x * (0::'a) = (0::'a)

lemmas zero_mult:

  x ≠ Φ ∧ x ≠ ∞ ∧ x ≠ - ∞ ==> (0::'a) * x = (0::'a) ∧ x * (0::'a) = (0::'a)

lemmas zero_mult:

  x ≠ Φ ∧ x ≠ ∞ ∧ x ≠ - ∞ ==> (0::'a) * x = (0::'a) ∧ x * (0::'a) = (0::'a)

lemma mult_zero:

  x ≠ Φ ∧ x ≠ ∞ ∧ x ≠ - ∞ ==> x * (0::'a) = (0::'a)

lemma minus_one_mult_uminus_reals:

  x ∈ reals ==> - (1::'a) * x = - x

lemma minus_one_mult_minus_one:

  - (1::'a) * - (1::'a) = (1::'a)

lemma minus_one_mult_uminus:

  - (1::'a) * x = - x

lemma minus_one_mult_minus_infinity:

  - (1::'a) * - ∞ = ∞

lemma mult_nullity_right:

  x * Φ = Φ

lemma zero_mult_minus_infinity:

  (0::'a) * - ∞ = Φ

lemma minus_infinity_mult_zero:

  - ∞ * (0::'a) = Φ

lemma uminus_mult_left:

  - (x * y) = - x * y

lemma uminus_mult_right:

  - (x * y) = x * - y

lemma uminus_mult_uminus:

  - x * - y = x * y

lemma zero_less_uminus_iff_less_zero:

  ((0::'a) < - x) = (x < (0::'a))

lemma uminus_less_zero_iff_zero_less:

  (- x < (0::'a)) = ((0::'a) < x)

lemma less_not_sym:

  x < y ==> ¬ y < x

lemma mult_gt_zero_gt_zero:

  [| (0::'a) < a; (0::'a) < b |] ==> (0::'a) < a * b

lemma mult_gt_zero_less_zero:

  [| (0::'a) < a; b < (0::'a) |] ==> a * b < (0::'a)

lemma mult_less_zero_gt_zero:

  [| a < (0::'a); (0::'a) < b |] ==> a * b < (0::'a)

lemma mult_less_zero_less_zero:

  [| a < (0::'a); b < (0::'a) |] ==> (0::'a) < a * b

lemma infinity_mult:

  ∞ * x = (if x < (0::'a) then - ∞ else if (0::'a) < x then ∞ else Φ)

lemma mult_infinity:

  x * ∞ = (if x < (0::'a) then - ∞ else if (0::'a) < x then ∞ else Φ)

lemma minus_infinity_mult:

  - ∞ * x = (if x < (0::'a) then ∞ else if (0::'a) < x then - ∞ else Φ)

lemma mult_minus_infinity:

  x * - ∞ = (if x < (0::'a) then ∞ else if (0::'a) < x then - ∞ else Φ)

lemma inverse_infinity:

  inverse (∞) = (0::'a)

lemma inverse_nullity_iff:

  (inverse x = Φ) = (x = Φ)

lemma inverse_noteq_zero:

  [| x ≠ ∞; x ≠ - ∞ |] ==> inverse x ≠ (0::'a)

lemma inverse_zero_iff:

  (inverse x = (0::'a)) = (x = ∞ ∨ x = - ∞)

lemma inverse_infinity_iff:

  (inverse x = ∞) = (x = (0::'a))

lemma inverse_minus_infinity_iff:

  inverse x ≠ - ∞

Closure of positive reals under inverse

lemma zero_less_inverse:

  [| (0::'a) < x; x ≠ ∞ |] ==> (0::'a) < inverse x

lemma inverse_less_zero:

  [| x < (0::'a); x ≠ - ∞ |] ==> inverse x < (0::'a)

lemma inverse_less_zero_iff:

  x ≠ - ∞ ==> (inverse x < (0::'a)) = (x < (0::'a))

lemma zero_less_inverse_iff:

  [| x ≠ ∞; x ≠ (0::'a) |] ==> ((0::'a) < inverse x) = ((0::'a) < x)

lemma less_not_nullity:

  x < y ==> x ≠ Φ ∧ y ≠ Φ ∧ x ≠ ∞ ∧ y ≠ - ∞

Closure of reals under multiplication

lemma reals_mult_closed:

  [| x ∈ reals; y ∈ reals |] ==> x * y ∈ reals