src/HOL/Integ/Barith.thy
changeset 15232 388a6f431d83
child 15239 fb73c8154b19
equal deleted inserted replaced
15231:96d5b6e2b6e4 15232:388a6f431d83
       
     1 theory Barith = Presburger
       
     2 files ("barith.ML") :
       
     3 
       
     4 lemma imp_commute: "(PROP P ==> PROP Q
       
     5 ==> PROP R) == (PROP Q ==>
       
     6 PROP P ==> PROP R)"
       
     7 proof
       
     8   assume h1: "PROP P \<Longrightarrow> PROP Q \<Longrightarrow>
       
     9 PROP R"
       
    10   assume h2: "PROP Q"
       
    11   assume h3: "PROP P"
       
    12   from h3 h2 show "PROP R" by (rule h1)
       
    13 next
       
    14   assume h1: "PROP Q \<Longrightarrow> PROP P \<Longrightarrow>
       
    15 PROP R"
       
    16  assume h2: "PROP P"
       
    17   assume h3: "PROP Q"
       
    18   from h3 h2 show "PROP R" by (rule h1)
       
    19 qed
       
    20 
       
    21 lemma imp_simplify: "(PROP P \<Longrightarrow> PROP P
       
    22 \<Longrightarrow> PROP Q) \<equiv> (PROP P \<Longrightarrow>
       
    23 PROP Q)"
       
    24 proof
       
    25   assume h1: "PROP P \<Longrightarrow> PROP P \<Longrightarrow>
       
    26 PROP Q"
       
    27   assume h2: "PROP P"
       
    28   from h2 h2 show "PROP Q" by (rule h1)
       
    29 next
       
    30   assume h: "PROP P \<Longrightarrow> PROP Q"
       
    31   assume "PROP P"
       
    32   then show "PROP Q" by (rule h)
       
    33 qed
       
    34 
       
    35 
       
    36 (* Abstraction of constants *)
       
    37 lemma abs_const: "(x::int) <= x \<and> x <= x"
       
    38 by simp
       
    39 
       
    40 (* Abstraction of Variables *)
       
    41 lemma abs_var: "l <= (x::int) \<and> x <= u \<Longrightarrow> l <= (x::int) \<and> x <= u"
       
    42 by simp
       
    43 
       
    44 
       
    45 (* Unary operators *)
       
    46 lemma abs_neg: "l <= (x::int) \<and> x <= u \<Longrightarrow>  -u <= -x \<and> -x <= -l"
       
    47 by arith
       
    48 
       
    49 
       
    50 (* Binary operations *)
       
    51 (* Addition*)
       
    52 lemma abs_add: "\<lbrakk> l1 <= (x1::int) \<and> x1 <= u1 ; l2 <= (x2::int) \<and> x2 <= u2\<rbrakk> 
       
    53   \<Longrightarrow>  l1 + l2 <= x1 + x2 \<and> x1 + x2 <= u1 + u2"
       
    54 by arith
       
    55 
       
    56 lemma abs_sub: "\<lbrakk> l1 <= (x1::int) \<and> x1 <= u1 ; l2 <= (x2::int) \<and> x2 <= u2\<rbrakk> 
       
    57   \<Longrightarrow>  l1 - u2 <= x1 - x2 \<and> x1 - x2 <= u1 - l2"
       
    58 by arith
       
    59 
       
    60 lemma abs_sub_x: "l <= (x::int) \<and> x <= u \<Longrightarrow> 0 <= x - x \<and> x - x <= 0"
       
    61 by arith
       
    62 
       
    63 (* For resolving the last step*)
       
    64 lemma subinterval: "\<lbrakk>l <= (e::int) \<and> e <= u ; l' <= l ; u <= u' \<rbrakk>
       
    65   \<Longrightarrow> l' <= e \<and> e <= u'"
       
    66 by arith
       
    67 
       
    68 lemma min_max_minus : "min (-a ::int) (-b) = - max a b"
       
    69 by arith
       
    70 
       
    71 lemma max_min_minus : " max (-a ::int) (-b) = - min a b"
       
    72 by arith
       
    73 
       
    74 lemma max_max_commute : "max (max (a::int) b) (max c d) = max (max a c) (max b d)"
       
    75 by arith
       
    76 
       
    77 lemma min_min_commute : "min (min (a::int) b) (min c d) = min (min a c) (min b d)"
       
    78 by arith
       
    79 
       
    80 lemma zintervals_min: "\<lbrakk> l1 <= (x1::int) \<and> x1<= u1 ; l2 <= x2 \<and> x2 <= u2 \<rbrakk> 
       
    81   \<Longrightarrow> min l1 l2 <= x1 \<and> x1 <= max u1 u2" by arith
       
    82 
       
    83 lemma zmult_zle_mono: "(i::int) \<le> j \<Longrightarrow> 0 \<le> k \<Longrightarrow> k * i \<le> k * j"
       
    84   apply (erule order_le_less [THEN iffD1, THEN disjE, of "0::int"])
       
    85   apply (erule order_le_less [THEN iffD1, THEN disjE])
       
    86   apply (rule order_less_imp_le)
       
    87   apply (rule zmult_zless_mono2)
       
    88   apply simp_all
       
    89   done
       
    90   
       
    91 lemma zmult_mono:
       
    92   assumes l1_pos : "0 <= l1"
       
    93   and l2_pos : "0 <= l2"
       
    94   and l1_le : "l1 <= (x1::int)"
       
    95   and l2_le : "l2 <= (x2::int)"
       
    96   shows "l1*l2 <= x1*x2"
       
    97 proof -
       
    98   from l1_pos and l1_le have x1_pos: "0 \<le> x1" by (rule order_trans)
       
    99   from l1_le and l2_pos
       
   100   have "l2 * l1 \<le> l2 * x1" by (rule zmult_zle_mono)
       
   101   then have "l1 * l2 \<le> x1 * l2" by (simp add: mult_ac)
       
   102   also from l2_le and x1_pos
       
   103   have "x1 * l2 \<le> x1 * x2" by (rule zmult_zle_mono)
       
   104   finally show ?thesis .
       
   105 qed
       
   106 
       
   107 lemma zinterval_lposlpos:
       
   108   assumes x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   109   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   110   and     l1_pos : "0 <= l1"
       
   111   and     l2_pos : "0 <= l2"
       
   112   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   113   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   114 proof-
       
   115   from x1_lu have l1_le : "l1 <= x1" by simp
       
   116   from x1_lu have x1_le : "x1 <= u1" by simp
       
   117   from x2_lu have l2_le : "l2 <= x2" by simp
       
   118   from x2_lu have x2_le : "x2 <= u2" by simp
       
   119   from x1_lu have l1_leu : "l1 <= u1" by arith
       
   120   from x2_lu have l2_leu : "l2 <= u2" by arith
       
   121   from l1_pos l2_pos l1_le l2_le 
       
   122   have l1l2_le : "l1*l2 <= x1*x2" by (simp add: zmult_mono)
       
   123   from l1_pos x1_lu have x1_pos : "0 <= x1" by arith
       
   124   from l2_pos x2_lu have x2_pos : "0 <= x2" by arith
       
   125   from l1_pos x1_lu have u1_pos : "0 <= u1" by arith
       
   126   from l2_pos x2_lu have u2_pos : "0 <= u2" by arith
       
   127   from x1_pos x2_pos x1_le x2_le 
       
   128   have x1x2_le : "x1*x2 <= u1*u2" by (simp add: zmult_mono)
       
   129   from l2_leu l1_pos have l1l2_leu2 : "l1*l2 <= l1*u2" 
       
   130     by (simp add: zmult_zle_mono)
       
   131   from l1l2_leu2 have min1 : "l1*l2 = min (l1*l2) (l1*u2)" by arith
       
   132   from l2_leu u1_pos have u1l2_le : "u1*l2 <=u1*u2" by (simp add: zmult_zle_mono)
       
   133   from u1l2_le have min2 : "u1*l2 = min (u1*l2) (u1*u2)" by arith
       
   134   from l1_leu l2_pos have "l2*l1 <= l2*u1" by (simp add:zmult_zle_mono) 
       
   135   then have l1l2_le_u1l2 : "l1*l2 <= u1*l2" by (simp add: mult_ac)
       
   136   from min1 min2 l1l2_le_u1l2 have  min_th : 
       
   137     "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) = (l1*l2)" by arith
       
   138   from l1l2_leu2 have max1 : "l1*u2 = max (l1*l2) (l1*u2)" by arith
       
   139   from u1l2_le have max2 : "u1*u2 = max (u1*l2) (u1*u2)" by arith
       
   140   from l1_leu u2_pos have "u2*l1 <= u2*u1" by (simp add:zmult_zle_mono) 
       
   141   then have l1u2_le_u1u2 : "l1*u2 <= u1*u2" by (simp add: mult_ac)
       
   142   from max1 max2 l1u2_le_u1u2 have  max_th : 
       
   143     "max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2)) = (u1*u2)" by arith
       
   144   from min_th have min_th' :  "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= l1*l2" by arith
       
   145   from max_th have max_th' : "u1*u2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))" by arith
       
   146   from min_th' max_th' l1l2_le x1x2_le 
       
   147   show ?thesis by simp
       
   148 qed
       
   149 
       
   150 lemma min_le_I1 : "min (a::int) b <= a" by arith
       
   151 lemma min_le_I2 : "min (a::int) b <= b" by arith
       
   152 lemma zinterval_lneglpos :
       
   153   assumes  x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   154   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   155   and     l1_neg : "l1 <= 0"
       
   156   and x1_pos : "0 <= x1" 
       
   157   and     l2_pos : "0 <= l2"
       
   158   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   159   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   160 
       
   161 proof-
       
   162     from x1_lu x1_pos have x1_0_u1 : "0 <= x1 \<and> x1 <= u1" by simp
       
   163     from l1_neg have ml1_pos : "0 <= -l1" by simp
       
   164     from x1_lu x1_pos have u1_pos : "0 <= u1" by arith
       
   165     from x2_lu l2_pos have u2_pos : "0 <= u2" by arith
       
   166     from x2_lu have l2_le_u2 : "l2 <= u2" by arith
       
   167     from l2_le_u2 u1_pos 
       
   168      have u1l2_le_u1u2 : "u1*l2 <= u1*u2" by (simp add: zmult_zle_mono)
       
   169     have trv_0 : "(0::int) <= 0" by simp
       
   170     have "0*0 <= u1*l2" 
       
   171       by (simp only: zmult_mono[OF trv_0 trv_0 u1_pos l2_pos])
       
   172     then have u1l2_pos : "0 <= u1*l2" by simp
       
   173       from l1_neg have ml1_pos : "0 <= -l1" by simp
       
   174       from ml1_pos l2_pos have "0*0 <= (-l1)*l2" 
       
   175 	by (simp only: zmult_mono[OF trv_0 trv_0 ml1_pos l2_pos])
       
   176       then have "0 <= -(l1*l2)" by simp  
       
   177       then have "0 - (-(l1*l2)) <= 0" by arith 
       
   178       then
       
   179       have l1l2_neg : "l1*l2 <= 0" by simp
       
   180       from ml1_pos u2_pos have "0*0 <= (-l1)*u2" 
       
   181 	by (simp only: zmult_mono[OF trv_0 trv_0 ml1_pos u2_pos])
       
   182       then have "0 <= -(l1*u2)" by simp  
       
   183       then have "0 - (-(l1*u2)) <= 0" by arith 
       
   184       then
       
   185       have l1u2_neg : "l1*u2 <= 0" by simp
       
   186       from l1l2_neg u1l2_pos have l1l2_le_u1l2: "l1*l2 <= u1*l2" by simp
       
   187       from l1u2_neg u1l2_pos have l1u2_le_u1l2 : "l1*u2 <= u1*l2" by simp
       
   188       from ml1_pos l2_le_u2 have "(-l1)*l2 <= (-l1)*u2"
       
   189 	by (simp only: zmult_zle_mono) 
       
   190       then have l1u2_le_l1l2 : "l1*u2 <= l1*l2" by simp
       
   191       from l1u2_le_l1l2 l1l2_le_u1l2 u1l2_le_u1u2 
       
   192       have min1 : "l1*u2 = min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2))" 
       
   193 	by arith
       
   194       from u1l2_pos u1l2_le_u1u2 have "0 = min (min (0 * l2) (0 * u2)) (min (u1 * l2) (u1 * u2))" by arith
       
   195       with l1u2_neg min1 have minth : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= min (min (0 * l2) (0 * u2)) (min (u1 * l2) (u1 * u2))" by simp
       
   196       from l1u2_le_l1l2 l1l2_le_u1l2 u1l2_le_u1u2 
       
   197       have max1 : "u1*u2 = max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))" 
       
   198 	by arith
       
   199       from u1l2_pos u1l2_le_u1u2 have "u1*u2 = max (max (0 * l2) (0 * u2)) (max (u1 * l2) (u1 * u2))" by arith 
       
   200       with  max1 have "max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2)) = max (max (0 * l2) (0 * u2)) (max (u1 * l2) (u1 * u2))" by simp
       
   201       then have maxth : " max (max (0 * l2) (0 * u2)) (max (u1 * l2) (u1 * u2)) <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))" by simp
       
   202     have x1x2_0_u : "min (min (0 * l2) (0 * u2)) (min (u1 * l2) (u1 * u2)) <= x1 * x2 &
       
   203 x1 * x2 <= max (max (0 * l2) (0 * u2)) (max (u1 * l2) (u1 * u2))" 
       
   204       by (simp only: zinterval_lposlpos[OF x1_0_u1 x2_lu trv_0 l2_pos],simp)
       
   205       from minth maxth x1x2_0_u show ?thesis by (simp add: subinterval[OF _ minth maxth])
       
   206 qed
       
   207 
       
   208 lemma zinterval_lneglneg :
       
   209   assumes  x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   210   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   211   and     l1_neg : "l1 <= 0"
       
   212   and     x1_pos : "0 <= x1" 
       
   213   and     l2_neg : "l2 <= 0"
       
   214   and     x2_pos : "0 <= x2"
       
   215   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   216   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   217 
       
   218 proof-
       
   219     from x1_lu x1_pos have x1_0_u1 : "0 <= x1 \<and> x1 <= u1" by simp
       
   220     from l1_neg have ml1_pos : "0 <= -l1" by simp
       
   221     from l1_neg have l1_le0 : "l1 <= 0" by simp
       
   222     from x1_lu x1_pos have u1_pos : "0 <= u1" by arith
       
   223     from x2_lu x2_pos have x2_0_u2 : "0 <= x2 \<and> x2 <= u2" by simp
       
   224     from l2_neg have ml2_pos : "0 <= -l2" by simp
       
   225     from l2_neg have l2_le0 : "l2 <= 0" by simp
       
   226     from x2_lu x2_pos have u2_pos : "0 <= u2" by arith
       
   227     have trv_0 : "(0::int) <= 0" by simp
       
   228 
       
   229     have x1x2_th1 : 
       
   230       "min (min (l1 * 0) (l1 * u2)) (min (u1 * 0) (u1 * u2)) \<le> x1 * x2 \<and>
       
   231       x1 * x2 \<le> max (max (l1 * 0) (l1 * u2)) (max (u1 * 0) (u1 * u2))"
       
   232       by (rule_tac  zinterval_lneglpos[OF x1_lu x2_0_u2 l1_le0 x1_pos trv_0])
       
   233     
       
   234     have x1x2_eq_x2x1 : "x1*x2 = x2*x1" by (simp add: mult_ac)
       
   235     have
       
   236       "min (min (l2 * 0) (l2 * u1)) (min (u2 * 0) (u2 * u1)) \<le> x2 * x1 \<and>
       
   237       x2 * x1 \<le> max (max (l2 * 0) (l2 * u1)) (max (u2 * 0) (u2 * u1))"
       
   238       by (rule_tac  zinterval_lneglpos[OF x2_lu x1_0_u1 l2_le0 x2_pos trv_0])
       
   239     
       
   240     then have x1x2_th2 : 
       
   241       "min (min (l2 * 0) (l2 * u1)) (min (u2 * 0) (u2 * u1)) \<le> x1 * x2 \<and>
       
   242       x1 * x2 \<le> max (max (l2 * 0) (l2 * u1)) (max (u2 * 0) (u2 * u1))"
       
   243       by (simp add: x1x2_eq_x2x1)
       
   244 
       
   245     from x1x2_th1 x1x2_th2 have x1x2_th3:
       
   246       "min (min (min (l1 * 0) (l1 * u2)) (min (u1 * 0) (u1 * u2)))
       
   247       (min (min (l2 * 0) (l2 * u1)) (min (u2 * 0) (u2 * u1)))
       
   248       \<le> x1 * x2 \<and>
       
   249       x1 * x2
       
   250       \<le> max (max (max (l1 * 0) (l1 * u2)) (max (u1 * 0) (u1 * u2)))
       
   251       (max (max (l2 * 0) (l2 * u1)) (max (u2 * 0) (u2 * u1)))"
       
   252       by (rule_tac zintervals_min[OF x1x2_th1 x1x2_th2])
       
   253 
       
   254     from ml1_pos u2_pos 
       
   255     have "0*0 <= -l1*u2" 
       
   256       by (simp only: zmult_mono[OF trv_0 trv_0 ml1_pos u2_pos]) 
       
   257     then have l1u2_neg : "l1*u2 <= 0" by simp
       
   258     from l1u2_neg have min_l1u2_0 : "min (0) (l1*u2) = l1*u2" by arith
       
   259     from l1u2_neg have max_l1u2_0 : "max (0) (l1*u2) = 0" by arith
       
   260     from u1_pos u2_pos 
       
   261     have "0*0 <= u1*u2" 
       
   262       by (simp only: zmult_mono[OF trv_0 trv_0 u1_pos u2_pos]) 
       
   263     then have u1u2_pos :"0 <= u1*u2" by simp
       
   264     from u1u2_pos have min_0_u1u2 : "min 0 (u1*u2) = 0" by arith
       
   265     from u1u2_pos have max_0_u1u2 : "max 0 (u1*u2) = u1*u2" by arith
       
   266     from ml2_pos u1_pos have "0*0 <= -l2*u1" 
       
   267       by (simp only: zmult_mono[OF trv_0 trv_0 ml2_pos u1_pos]) 
       
   268     then have l2u1_neg : "l2*u1 <= 0" by simp
       
   269     from l2u1_neg have min_l2u1_0 : "min 0 (l2*u1) = l2*u1" by arith
       
   270     from l2u1_neg have max_l2u1_0 : "max 0 (l2*u1) = 0" by arith
       
   271     from min_l1u2_0 min_0_u1u2 min_l2u1_0 
       
   272     have min_th1: 
       
   273       " min (l2*u1) (l1*u2) <= min (min (min (l1 * 0) (l1 * u2)) (min (u1 * 0) (u1 * u2)))
       
   274       (min (min (l2 * 0) (l2 * u1)) (min (u2 * 0) (u2 * u1)))"
       
   275       by (simp add: min_commute mult_ac)
       
   276     from max_l1u2_0 max_0_u1u2 max_l2u1_0 
       
   277     have max_th1: "max (max (max (l1 * 0) (l1 * u2)) (max (u1 * 0) (u1 * u2)))
       
   278       (max (max (l2 * 0) (l2 * u1)) (max (u2 * 0) (u2 * u1))) <= u1*u2"
       
   279       by (simp add: max_commute mult_ac)
       
   280     have x1x2_th4: "min (l2*u1) (l1*u2) <= x1*x2 \<and> x1*x2 <= u1*u2" 
       
   281       by (rule_tac subinterval[OF x1x2_th3 min_th1 max_th1])
       
   282     
       
   283     have " min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) = min (min (l1*l2) (u1*u2)) (min (l1*u2) (l2*u1))" by (simp add: min_min_commute min_commute mult_ac) 
       
   284     moreover 
       
   285     have " min (min (l1*l2) (u1*u2)) (min (l1*u2) (l2*u1)) <= min (l1*u2) (l2*u1)" 
       
   286       by 
       
   287     (rule_tac min_le_I2 [of "(min (l1*l2) (u1*u2))" "(min (l1*u2) (l2*u1))"]) 
       
   288     ultimately have "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= min (l1*u2) (l2*u1)" by simp 
       
   289     then 
       
   290     have min_le1: "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <=min (l2*u1) (l1*u2)" 
       
   291       by (simp add: min_commute mult_ac)
       
   292     have "u1*u2 <= max (u1*l2) (u1*u2)" 
       
   293       by (rule_tac le_maxI2[of  "u1*u2" "u1*l2"]) 
       
   294     
       
   295     moreover have "max (u1*l2) (u1*u2) <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   296       by(rule_tac le_maxI2[of "(max (u1*l2) (u1*u2))" "(max (l1*l2) (l1*u2))"])
       
   297     then 
       
   298     have max_le1:"u1*u2 <= max (max (l1 * l2) (l1 * u2)) (max (u1 * l2) (u1 * u2))" 
       
   299       by simp
       
   300     show ?thesis by (simp add: subinterval[OF x1x2_th4 min_le1 max_le1])
       
   301   qed
       
   302 
       
   303 lemma zinterval_lpos:
       
   304   assumes x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   305   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   306   and     l1_pos: "0 <= l1"
       
   307   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   308   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   309 proof-
       
   310   from x1_lu have l1_le : "l1 <= x1" by simp
       
   311   from x1_lu have x1_le : "x1 <= u1" by simp
       
   312   from x2_lu have l2_le : "l2 <= x2" by simp
       
   313   from x2_lu have x2_le : "x2 <= u2" by simp
       
   314   from x1_lu have l1_leu : "l1 <= u1" by arith
       
   315   from x2_lu have l2_leu : "l2 <= u2" by arith
       
   316   have "(0 <= l2) \<or> (l2 < 0 \<and> 0<= x2) \<or> (x2 <0 \<and> 0 <= u2) \<or> (u2 <0)" by arith
       
   317   moreover
       
   318   {
       
   319     assume l2_pos: "0 <= l2"
       
   320     have ?thesis by (simp add: zinterval_lposlpos[OF x1_lu x2_lu l1_pos l2_pos])
       
   321   }
       
   322 moreover
       
   323 {
       
   324   assume  l2_neg : "l2 < 0" and x2_pos: "0<= x2"
       
   325   from l2_neg have l2_le_0 : "l2 <= 0" by arith
       
   326   thm zinterval_lneglpos[OF x2_lu x1_lu l2_le_0 x2_pos l1_pos]
       
   327 have th1 : 
       
   328   "min (min (l2 * l1) (l2 * u1)) (min (u2 * l1) (u2 * u1)) \<le> x2 * x1 \<and>
       
   329   x2 * x1 \<le> max (max (l2 * l1) (l2 * u1)) (max (u2 * l1) (u2 * u1))" 
       
   330   by (simp add : zinterval_lneglpos[OF x2_lu x1_lu l2_le_0 x2_pos l1_pos])
       
   331 have mth1 : "min (min (l2 * l1) (l2 * u1)) (min (u2 * l1) (u2 * u1)) = min (min (l1 * l2) (l1 * u2)) (min (u1 * l2) (u1 * u2))" 
       
   332   by (simp add: min_min_commute mult_ac)
       
   333 have mth2: "max (max (l2 * l1) (l2 * u1)) (max (u2 * l1) (u2 * u1)) = max (max (l1 * l2) (l1 * u2)) (max (u1 * l2) (u1 * u2))"
       
   334   by (simp add: max_max_commute mult_ac)
       
   335 have x1x2_th : "x2*x1 = x1*x2" by (simp add: mult_ac)
       
   336 from th1 mth1 mth2 x1x2_th have 
       
   337    "min (min (l1 * l2) (l1 * u2)) (min (u1 * l2) (u1 * u2)) \<le> x1 * x2 \<and>
       
   338    x1 * x2 \<le> max (max (l1 * l2) (l1 * u2)) (max (u1 * l2) (u1 * u2))"
       
   339 by auto
       
   340     then have ?thesis by simp 
       
   341 }
       
   342 moreover
       
   343 {
       
   344   assume x2_neg : "x2 <0" and u2_pos : "0 <= u2"
       
   345   from x2_lu x2_neg have mx2_mu2_ml2 : "-u2 <= -x2 \<and> -x2 <= -l2" by simp
       
   346   from u2_pos have mu2_neg : "-u2 <= 0" by simp
       
   347   from x2_neg have mx2_pos : "0 <= -x2" by simp
       
   348 thm zinterval_lneglpos[OF mx2_mu2_ml2 x1_lu mu2_neg mx2_pos l1_pos]
       
   349     have mx1x2_lu : 
       
   350 "min (min (- u2 * l1) (- u2 * u1)) (min (- l2 * l1) (- l2 * u1))
       
   351 \<le> - x2 * x1 \<and>
       
   352 - x2 * x1 \<le> max (max (- u2 * l1) (- u2 * u1)) (max (- l2 * l1) (- l2 * u1))"      
       
   353       by (simp only: zinterval_lneglpos [OF  mx2_mu2_ml2 x1_lu mu2_neg mx2_pos l1_pos],simp)
       
   354     have min_eq_mmax : 
       
   355       "min (min (- u2 * l1) (- u2 * u1)) (min (- l2 * l1) (- l2 * u1)) = 
       
   356       - max (max (u2 * l1) (u2 * u1)) (max (l2 * l1) (l2 * u1))" 
       
   357       by (simp add: min_max_minus max_min_minus)
       
   358     have max_eq_mmin : 
       
   359       " max (max (- u2 * l1) (- u2 * u1)) (max (- l2 * l1) (- l2 * u1)) = 
       
   360       -min (min (u2 * l1) (u2 * u1)) (min (l2 * l1) (l2 * u1))"
       
   361       by (simp add: min_max_minus max_min_minus)
       
   362     from mx1x2_lu min_eq_mmax max_eq_mmin 
       
   363     have "- max (max (u2 * l1) (u2 * u1)) (max (l2 * l1) (l2 * u1))<= - x1 * x2 &
       
   364       - x1*x2 <=  -min (min (u2 * l1) (u2 * u1)) (min (l2 * l1) (l2 * u1))" by (simp add: mult_ac)
       
   365  then have ?thesis by (simp add: min_min_commute min_commute max_commute max_max_commute mult_ac) 
       
   366 
       
   367 }
       
   368 moreover
       
   369 {
       
   370   assume u2_neg : "u2 < 0"
       
   371   from x2_lu have mx2_lu : "-u2 <= -x2 \<and> -x2 <= -l2" by arith
       
   372   from u2_neg have mu2_pos : "0 <= -u2" by arith
       
   373 thm zinterval_lposlpos [OF x1_lu mx2_lu l1_pos mu2_pos]
       
   374 have "min (min (l1 * - u2) (l1 * - l2)) (min (u1 * - u2) (u1 * - l2))
       
   375 \<le> x1 * - x2 \<and>
       
   376 x1 * - x2 \<le> max (max (l1 * - u2) (l1 * - l2)) (max (u1 * - u2) (u1 * - l2))
       
   377   " by (rule_tac zinterval_lposlpos [OF x1_lu mx2_lu l1_pos mu2_pos])
       
   378 then have mx1x2_lu:
       
   379   "min (min (-l1 * u2) (- l1 * l2)) (min (- u1 * u2) (- u1 * l2)) \<le> - x1 * x2 \<and>
       
   380 - x1 * x2 \<le> max (max (- l1 * u2) (- l1 * l2)) (max (- u1 * u2) (- u1 * l2))
       
   381   " by simp
       
   382 moreover have "min (min (-l1 * u2) (- l1 * l2)) (min (- u1 * u2) (- u1 * l2)) =- max (max (l1 * u2) ( l1 * l2)) (max ( u1 * u2) ( u1 * l2)) " 
       
   383   by (simp add: min_max_minus max_min_minus)
       
   384 moreover 
       
   385 have 
       
   386 "max (max (- l1 * u2) (- l1 * l2)) (max (- u1 * u2) (- u1 * l2)) = - min (min (l1 * u2) (l1 * l2)) (min (u1 * u2) (u1 * l2))"
       
   387  by (simp add: min_max_minus max_min_minus)
       
   388 thm subinterval[OF mx1x2_lu]
       
   389 ultimately have "- max (max (l1 * u2) ( l1 * l2)) (max ( u1 * u2) ( u1 * l2))\<le> - x1 * x2 \<and>
       
   390 - x1 * x2 \<le> - min (min (l1 * u2) (l1 * l2)) (min (u1 * u2) (u1 * l2)) " by simp
       
   391  then have ?thesis by (simp add: max_commute min_commute)
       
   392 }
       
   393 ultimately show ?thesis by blast
       
   394 qed
       
   395 
       
   396 lemma zinterval_uneg :
       
   397 assumes x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   398   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   399   and     u1_neg: "u1 <= 0"
       
   400   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   401   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   402 proof-
       
   403   from x1_lu  have mx1_lu : "-u1 <= -x1 \<and> -x1 <= -l1" by arith
       
   404   from u1_neg have mu1_pos : "0 <= -u1" by arith
       
   405   thm zinterval_lpos [OF mx1_lu x2_lu mu1_pos]
       
   406   have mx1x2_lu : 
       
   407     "min (min (- u1 * l2) (- u1 * u2)) (min (- l1 * l2) (- l1 * u2))
       
   408     \<le> - x1 * x2 \<and> - x1 * x2 \<le> 
       
   409     max (max (- u1 * l2) (- u1 * u2)) (max (- l1 * l2) (- l1 * u2))"
       
   410 by (rule_tac zinterval_lpos [OF mx1_lu x2_lu mu1_pos])
       
   411 moreover have 
       
   412   "min (min (- u1 * l2) (- u1 * u2)) (min (- l1 * l2) (- l1 * u2)) = - max (max (u1 * l2) (u1 * u2)) (max (l1 * l2) (l1 * u2))" by (simp add: min_max_minus max_min_minus)
       
   413 moreover have 
       
   414   "max (max (- u1 * l2) (- u1 * u2)) (max (- l1 * l2) (- l1 * u2)) = - min (min (u1 * l2) ( u1 * u2)) (min (l1 * l2) (l1 * u2))" by (simp add: min_max_minus max_min_minus)
       
   415 ultimately have "- max (max (u1 * l2) (u1 * u2)) (max (l1 * l2) (l1 * u2))\<le> - x1 * x2 \<and> - x1 * x2 \<le>  - min (min (u1 * l2) ( u1 * u2)) (min (l1 * l2) (l1 * u2))" by simp
       
   416 then show ?thesis by (simp add: min_commute max_commute mult_ac)
       
   417 qed
       
   418 
       
   419 lemma zinterval_lnegxpos:
       
   420 assumes x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   421   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   422   and     l1_neg: "l1 <= 0"
       
   423   and     x1_pos: "0<= x1"
       
   424   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   425   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   426 proof-
       
   427   have "(0 <= l2) \<or> (l2 < 0 \<and> 0<= x2) \<or> (x2 <0 \<and> 0 <= u2) \<or> (u2 <= 0)" by arith
       
   428   moreover
       
   429   {
       
   430     assume l2_pos: "0 <= l2"
       
   431     thm zinterval_lpos [OF x2_lu x1_lu l2_pos]
       
   432     have 
       
   433       "min (min (l2 * l1) (l2 * u1)) (min (u2 * l1) (u2 * u1)) \<le> x2 * x1 \<and>
       
   434       x2 * x1 \<le> max (max (l2 * l1) (l2 * u1)) (max (u2 * l1) (u2 * u1))"
       
   435       by (rule_tac zinterval_lpos [OF x2_lu x1_lu l2_pos])
       
   436  moreover have "min (min (l2 * l1) (l2 * u1)) (min (u2 * l1) (u2 * u1)) = min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2))" by (simp add: mult_ac min_commute min_min_commute)
       
   437 moreover have "max (max (l2 * l1) (l2 * u1)) (max (u2 * l1) (u2 * u1)) = max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   438   by (simp add: mult_ac max_commute max_max_commute)
       
   439 ultimately have ?thesis by (simp add: mult_ac)
       
   440 
       
   441 }
       
   442 
       
   443 moreover
       
   444 {
       
   445   assume l2_neg: "l2 < 0" and x2_pos: " 0<= x2"
       
   446   from l1_neg have l1_le0 : "l1 <= 0" by simp
       
   447   from l2_neg have l2_le0 : "l2 <= 0" by simp
       
   448  have ?thesis by (simp add: zinterval_lneglneg [OF x1_lu x2_lu l1_le0 x1_pos l2_le0 x2_pos])
       
   449 }
       
   450 
       
   451 moreover
       
   452 {
       
   453  assume x2_neg: "x2 <0" and u2_pos: "0 <= u2"
       
   454  from x2_lu have mx2_lu: "-u2 <= -x2 \<and> -x2 <= -l2" by arith
       
   455  from x2_neg have mx2_pos: "0 <= -x2" by simp
       
   456  from u2_pos have mu2_neg: "-u2 <= 0" by simp
       
   457  from l1_neg have l1_le0 : "l1 <= 0" by simp
       
   458 thm zinterval_lneglneg [OF x1_lu mx2_lu l1_le0 x1_pos mu2_neg mx2_pos]
       
   459 have "min (min (l1 * - u2) (l1 * - l2)) (min (u1 * - u2) (u1 * - l2))
       
   460 \<le> x1 * - x2 \<and>
       
   461 x1 * - x2 \<le> max (max (l1 * - u2) (l1 * - l2)) (max (u1 * - u2) (u1 * - l2))" by (rule_tac zinterval_lneglneg [OF x1_lu mx2_lu l1_le0 x1_pos mu2_neg mx2_pos])
       
   462 then have "min (min (- l1 * u2) (- l1 * l2)) (min (- u1 * u2) (- u1 * l2))
       
   463 \<le> - x1 * x2 \<and>
       
   464 - x1 * x2 \<le> max (max (- l1 * u2) (- l1 * l2)) (max (- u1 * u2) (- u1 * l2))" by simp
       
   465 moreover have "min (min (- l1 * u2) (- l1 * l2)) (min (- u1 * u2) (- u1 * l2)) = - max (max (l1 * u2) (l1 * l2)) (max (u1 * u2) (u1 * l2))" by (simp add: min_max_minus max_min_minus)
       
   466 moreover have "max (max (- l1 * u2) (- l1 * l2)) (max (- u1 * u2) (- u1 * l2)) = - min (min (l1 * u2) (l1 * l2)) (min (u1 * u2) (u1 * l2))" by (simp add: min_max_minus max_min_minus)
       
   467 ultimately have "- max (max (l1 * u2) (l1 * l2)) (max (u1 * u2) (u1 * l2))\<le> - x1 * x2 \<and>
       
   468 - x1 * x2 \<le>  - min (min (l1 * u2) (l1 * l2)) (min (u1 * u2) (u1 * l2))" by simp
       
   469 
       
   470 then have ?thesis by (simp add: min_commute max_commute mult_ac) 
       
   471 }
       
   472 
       
   473 moreover
       
   474 {
       
   475  assume u2_neg: "u2 <= 0"
       
   476  thm zinterval_uneg[OF x2_lu x1_lu u2_neg]
       
   477 have "min (min (l2 * l1) (l2 * u1)) (min (u2 * l1) (u2 * u1)) \<le> x2 * x1 \<and>
       
   478 x2 * x1 \<le> max (max (l2 * l1) (l2 * u1)) (max (u2 * l1) (u2 * u1))" by (rule_tac zinterval_uneg[OF x2_lu x1_lu u2_neg])
       
   479 then have ?thesis by (simp add: mult_ac min_commute max_commute min_min_commute max_max_commute)
       
   480 }
       
   481 ultimately show ?thesis by blast
       
   482 
       
   483 qed
       
   484 
       
   485 lemma zinterval_xnegupos: 
       
   486 assumes x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   487   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   488   and     x1_neg: "x1 <= 0"
       
   489   and     u1_pos: "0<= u1"
       
   490   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   491   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   492 proof-
       
   493   from x1_lu have mx1_lu : "-u1 <= -x1 \<and> -x1 <= -l1" by arith 
       
   494   from u1_pos have mu1_neg : "-u1 <= 0" by simp
       
   495   from x1_neg have mx1_pos : "0 <= -x1" by simp
       
   496   thm zinterval_lnegxpos[OF mx1_lu x2_lu mu1_neg mx1_pos ]
       
   497   have "min (min (- u1 * l2) (- u1 * u2)) (min (- l1 * l2) (- l1 * u2))
       
   498 \<le> - x1 * x2 \<and>
       
   499 - x1 * x2 \<le> max (max (- u1 * l2) (- u1 * u2)) (max (- l1 * l2) (- l1 * u2))"
       
   500     by (rule_tac zinterval_lnegxpos[OF mx1_lu x2_lu mu1_neg mx1_pos ])
       
   501   moreover have 
       
   502     "min (min (- u1 * l2) (- u1 * u2)) (min (- l1 * l2) (- l1 * u2)) = - max (max (u1 * l2) (u1 * u2)) (max (l1 * l2) (l1 * u2))" 
       
   503     by (simp add: min_max_minus max_min_minus)
       
   504   moreover have 
       
   505     "max (max (- u1 * l2) (- u1 * u2)) (max (- l1 * l2) (- l1 * u2)) = - min (min (u1 * l2) (u1 * u2)) (min (l1 * l2) (l1 * u2))" 
       
   506     by (simp add: min_max_minus max_min_minus)
       
   507   ultimately have "- max (max (u1 * l2) (u1 * u2)) (max (l1 * l2) (l1 * u2))\<le> - x1 * x2 \<and>
       
   508 - x1 * x2 \<le> - min (min (u1 * l2) (u1 * u2)) (min (l1 * l2) (l1 * u2))" 
       
   509     by simp
       
   510 then show ?thesis by (simp add: mult_ac min_commute max_commute)
       
   511 qed
       
   512 
       
   513 lemma abs_mul: 
       
   514   assumes x1_lu : "l1 <= (x1::int) \<and> x1 <= u1"
       
   515   and     x2_lu : "l2 <= (x2::int) \<and> x2 <= u2"
       
   516   shows conc : "min (min (l1*l2) (l1*u2)) (min (u1*l2) (u1*u2)) <= x1 * x2 
       
   517   \<and> x1 * x2 <= max (max (l1*l2) (l1*u2)) (max (u1*l2) (u1*u2))"
       
   518 proof-
       
   519   have "(0 <= l1) \<or> (l1 <= 0 \<and> 0<= x1) \<or> (x1 <=0 \<and> 0 <= u1) \<or> (u1 <= 0)" 
       
   520     by arith
       
   521   moreover
       
   522   {
       
   523     assume l1_pos: "0 <= l1"
       
   524     have ?thesis by (rule_tac zinterval_lpos [OF x1_lu x2_lu l1_pos])
       
   525   }
       
   526   
       
   527   moreover
       
   528   {
       
   529     assume l1_neg :"l1 <= 0" and x1_pos: "0<= x1"
       
   530     have ?thesis by (rule_tac zinterval_lnegxpos[OF x1_lu x2_lu l1_neg x1_pos])
       
   531   }
       
   532   
       
   533   moreover
       
   534   {
       
   535     assume x1_neg : "x1 <= 0" and u1_pos: "0 <= u1"
       
   536     have ?thesis by (rule_tac zinterval_xnegupos [OF x1_lu x2_lu x1_neg u1_pos])
       
   537   }
       
   538   
       
   539   moreover
       
   540   {
       
   541     assume u1_neg: "u1 <= 0"
       
   542     have ?thesis by (rule_tac zinterval_uneg [OF x1_lu x2_lu u1_neg])
       
   543   }
       
   544   
       
   545   ultimately show ?thesis by blast
       
   546 qed
       
   547 
       
   548 lemma mult_x_mono_lpos : 
       
   549 assumes l_pos : "0 <= (l::int)"
       
   550   and   x_lu : "l <= (x::int) \<and> x <= u"
       
   551   shows "l*l <= x*x \<and> x*x <= u*u"
       
   552 
       
   553 proof-
       
   554   from x_lu have x_l : "l <= x" by arith
       
   555   thm zmult_mono[OF l_pos l_pos x_l x_l]
       
   556   then have xx_l : "l*l <= x*x"
       
   557     by (simp add: zmult_mono[OF l_pos l_pos x_l x_l])
       
   558   moreover 
       
   559   from x_lu have x_u : "x <= u" by arith
       
   560   from l_pos x_l have x_pos : "0 <= x" by arith
       
   561   thm zmult_mono[OF x_pos x_pos x_u x_u]
       
   562   then have xx_u : "x*x <= u*u"
       
   563     by (simp add: zmult_mono[OF x_pos x_pos x_u x_u])
       
   564 ultimately show ?thesis by simp
       
   565 qed
       
   566 
       
   567 lemma mult_x_mono_luneg : 
       
   568 assumes l_neg : "(l::int) <= 0"
       
   569   and   u_neg : "u <= 0"
       
   570   and   x_lu : "l <= (x::int) \<and> x <= u"
       
   571   shows "u*u <= x*x \<and> x*x <= l*l"
       
   572 
       
   573 proof-
       
   574   from x_lu have mx_lu : "-u <= -x \<and> -x <= -l" by arith
       
   575   from u_neg have mu_pos : "0<= -u" by simp
       
   576   thm mult_x_mono_lpos[OF mu_pos mx_lu]
       
   577   have "- u * - u \<le> - x * - x \<and> - x * - x \<le> - l * - l"
       
   578     by (rule_tac mult_x_mono_lpos[OF mu_pos mx_lu])
       
   579   then show ?thesis by simp
       
   580 qed
       
   581 
       
   582 lemma mult_x_mono_lxnegupos : 
       
   583 assumes l_neg : "(l::int) <= 0"
       
   584   and   u_pos : "0 <= u"
       
   585   and   x_neg : "x <= 0"
       
   586   and   x_lu : "l <= (x::int) \<and> x <= u"
       
   587   shows "0 <= x*x \<and> x*x <= max (l*l) (u*u)"
       
   588 proof-
       
   589   from x_lu x_neg have mx_0l : "0 <= - x \<and> - x <= - l" by arith
       
   590   have trv_0 : "(0::int) <= 0" by arith
       
   591   thm mult_x_mono_lpos[OF trv_0 mx_0l]
       
   592   have "0 * 0 \<le> - x * - x \<and> - x * - x \<le> - l * - l"
       
   593     by (rule_tac  mult_x_mono_lpos[OF trv_0 mx_0l])
       
   594   then have xx_0ll : "0 <= x*x \<and> x*x <= l*l" by simp
       
   595   have "l*l <= max (l*l) (u*u)" by (simp add: le_maxI1)
       
   596   with xx_0ll show ?thesis by arith
       
   597 qed
       
   598 
       
   599 lemma mult_x_mono_lnegupos : 
       
   600 assumes l_neg : "(l::int) <= 0"
       
   601   and   u_pos : "0 <= u"
       
   602   and   x_lu : "l <= (x::int) \<and> x <= u"
       
   603   shows "0 <= x*x \<and> x*x <= max (l*l) (u*u)"
       
   604 proof-
       
   605   have "0<= x \<or> x <= 0" by arith
       
   606 moreover
       
   607 {
       
   608   assume x_neg : "x <= 0"
       
   609   thm mult_x_mono_lxnegupos[OF l_neg u_pos x_neg x_lu]
       
   610   have ?thesis by (rule_tac mult_x_mono_lxnegupos[OF l_neg u_pos x_neg x_lu])
       
   611 }
       
   612 moreover
       
   613 
       
   614 {
       
   615   assume x_pos : "0 <= x"
       
   616   from x_lu have mx_lu : "-u <= -x \<and> -x <= -l" by arith
       
   617   from x_pos have mx_neg : "-x <= 0" by simp
       
   618   from u_pos have mu_neg : "-u <= 0" by simp
       
   619   from x_lu x_pos have ml_pos : "0 <= -l" by simp
       
   620   thm mult_x_mono_lxnegupos[OF mu_neg ml_pos mx_neg mx_lu]
       
   621   have "0 \<le> - x * - x \<and> - x * - x \<le> max (- u * - u) (- l * - l)"
       
   622     by (rule_tac mult_x_mono_lxnegupos[OF mu_neg ml_pos mx_neg mx_lu])
       
   623   then have ?thesis by (simp add: max_commute)
       
   624 
       
   625 }
       
   626 ultimately show ?thesis by blast
       
   627 
       
   628 qed
       
   629 lemma abs_mul_x:
       
   630   assumes x_lu : "l <= (x::int) \<and> x <= u"
       
   631   shows 
       
   632   "(if 0 <= l then l*l  else if u <= 0 then u*u else 0) <= x*x
       
   633   \<and> x*x <= (if 0 <= l then u*u  else if u <= 0 then l*l else (max (l*l) (u*u)))"
       
   634 proof-
       
   635   have "(0 <= l) \<or> (l < 0 \<and> u <= 0) \<or> (l < 0 \<and> 0 < u)" by arith 
       
   636   
       
   637   moreover
       
   638   {
       
   639     assume l_pos : "0 <= l"
       
   640     from l_pos have "(if 0 <= l then l*l  else if u <= 0 then u*u else 0) = l*l"
       
   641       by simp
       
   642     moreover from l_pos have "(if 0 <= l then u*u  else if u <= 0 then l*l else (max (l*l) (u*u))) = u*u" by simp
       
   643     
       
   644     moreover have "l * l \<le> x * x \<and> x * x \<le> u * u" 
       
   645       by (rule_tac  mult_x_mono_lpos[OF l_pos x_lu])
       
   646     ultimately have ?thesis by simp 
       
   647   }
       
   648   
       
   649   moreover
       
   650   {
       
   651     assume l_neg : "l < 0"  and u_neg : "u <= 0"  
       
   652     from l_neg have l_le0 : "l <= 0" by simp
       
   653     from l_neg u_neg have "(if 0 <= l then l*l  else if u <= 0 then u*u else 0) = u*u"
       
   654       by simp
       
   655     moreover 
       
   656     from l_neg u_neg have "(if 0 <= l then u*u  else if u <= 0 then l*l else (max (l*l) (u*u))) = l*l" by simp
       
   657     moreover 
       
   658     have "u * u \<le> x * x \<and> x * x \<le> l * l" 
       
   659       by (rule_tac mult_x_mono_luneg[OF l_le0 u_neg x_lu])
       
   660     
       
   661     ultimately have ?thesis by simp 
       
   662   }
       
   663   moreover
       
   664   {
       
   665     assume l_neg : "l < 0" and u_pos: "0 < u"
       
   666     from l_neg have l_le0 : "l <= 0" by simp
       
   667     from u_pos have u_ge0 : "0 <= u" by simp
       
   668     from l_neg u_pos have "(if 0 <= l then l*l  else if u <= 0 then u*u else 0) = 0"
       
   669       by simp
       
   670     moreover from l_neg u_pos have "(if 0 <= l then u*u  else if u <= 0 then l*l else (max (l*l) (u*u))) = max (l*l) (u*u)" by simp
       
   671     moreover have "0 \<le> x * x \<and> x * x \<le> max (l * l) (u * u)" 
       
   672       by (rule_tac mult_x_mono_lnegupos[OF l_le0 u_ge0 x_lu])
       
   673     
       
   674     ultimately have ?thesis by simp 
       
   675     
       
   676   }
       
   677   
       
   678   ultimately show ?thesis by blast
       
   679 qed
       
   680 
       
   681 
       
   682 use"barith.ML"
       
   683 setup Barith.setup
       
   684 
       
   685 end
       
   686