1 (* ---------------------------------------------------------------------- *)
3 (* ---------------------------------------------------------------------- *)
5 (* ---------------------------- Chebychev ----------------------------- *)
8 `!x. --(&1) <= x /\ x <= &1 ==>
9 -- (&1) <= &2 * x pow 2 - &1 /\ &2 * x pow 2 - &1 <= &1`;;
12 DATE ------- HOL --------
18 `!x. --(&1) <= x /\ x <= &1 ==>
19 -- (&1) <= &4 * x pow 3 - &3 * x /\ &4 * x pow 3 - &3 * x <= &1`;;
22 DATE ------- HOL --------
28 `&1 < &2 /\ (!x. &1 < x ==> &1 < x pow 2) /\
29 (!x y. &1 < x /\ &1 < y ==> &1 < x * (&1 + &2 * y))`;;
33 DATE ------- HOL --------
38 `&0 <= b /\ &0 <= c /\ &0 < a * c ==> ?u. &0 < u /\ u * (u * c - a * c) -
39 (u * a * c - (a pow 2 * c + b)) < a pow 2 * c + b`;;
42 DATE ------- HOL --------
47 (* ------------------------------------------------------------------------- *)
49 (* ------------------------------------------------------------------------- *)
54 (* --------------------------------- --------------------------------- *)
56 time real_qelim <<exists x. x^4 + x^2 + 1 = 0>>;;
59 let fm = `?x. x pow 4 + x pow 2 + &1 = &0`;;
64 time REAL_QELIM_CONV `?x. x pow 4 + x pow 2 + &1 = &0`;;
69 DATE ------- HOL --------
76 (* --------------------------------- --------------------------------- *)
79 time real_qelim <<exists x. x^3 - x^2 + x - 1 = 0>>;;
83 time REAL_QELIM_CONV `?x. x pow 3 - x pow 2 + x - &1 = &0`;;
86 DATE ------- HOL --------
91 (* --------------------------------- --------------------------------- *)
95 <<exists x y. x^3 - x^2 + x - 1 = 0 /\
96 y^3 - y^2 + y - 1 = 0 /\ ~(x = y)>>;;
101 `?x y. (x pow 3 - x pow 2 + x - &1 = &0) /\
102 (y pow 3 - y pow 2 + y - &1 = &0) /\ ~(x = y)`;;
105 DATE ------- HOL -------- Factor
106 4/29/2005 682.85 3000
111 (* --------------------------------- --------------------------------- *)
116 <<forall a f k. (forall e. k < e ==> f < a * e) ==> f <= a * k>>;;
121 `!a f k. (!e. k < e ==> f < a * e) ==> f <= a * k`;;
124 DATE ------- HOL -------- Factor
132 (* --------------------------------- --------------------------------- *)
136 <<exists x. a * x^2 + b * x + c = 0>>;;
141 `?x. a * x pow 2 + b * x + c = &0`;;
144 DATE ------- HOL -------- Factor
151 (* --------------------------------- --------------------------------- *)
154 <<forall a b c. (exists x. a * x^2 + b * x + c = 0) <=>
160 `!a b c. (?x. a * x pow 2 + b * x + c = &0) <=>
161 b pow 2 >= &4 * a * c`;;
165 DATE ------- HOL -------- Factor
166 4/29/2005 1200.99 2400
171 (* --------------------------------- --------------------------------- *)
174 <<forall a b c. (exists x. a * x^2 + b * x + c = 0) <=>
175 a = 0 /\ (~(b = 0) \/ c = 0) \/
176 ~(a = 0) /\ b^2 >= 4 * a * c>>;;
181 `!a b c. (?x. a * x pow 2 + b * x + c = &0) <=>
182 (a = &0) /\ (~(b = &0) \/ (c = &0)) \/
183 ~(a = &0) /\ b pow 2 >= &4 * a * c`;;
186 DATE ------- HOL -------- Factor
187 4/29/2005 1173.9 2400
191 1095 during depot update
196 time real_qelim <<exists x. 0 <= x /\ x <= 1 /\ (r * r * x * x - r * (1 + r) * x + (1 + r) = 0)
197 /\ ~(2 * r * x = 1 + r)>>
200 `?x. &0 <= x /\ x <= &1 /\ (r pow 2 * x pow 2 - r * (&1 + r) * x + (&1 + r) = &0)
201 /\ ~(&2 * r * x = &1 + r)`;;
204 DATE ------- HOL -------- Factor
213 (* ------------------------------------------------------------------------- *)
214 (* Termination ordering for group theory completion. *)
215 (* ------------------------------------------------------------------------- *)
217 (* ------------------------------------------------------------------------- *)
219 (* ------------------------------------------------------------------------- *)
221 (* ------------------------------------------------------------------------- *)
222 (* This one works better using DNF. *)
223 (* ------------------------------------------------------------------------- *)
225 (* ------------------------------------------------------------------------- *)
227 (* ------------------------------------------------------------------------- *)
229 (* ------------------------------------------------------------------------- *)
230 (* Linear examples. *)
231 (* ------------------------------------------------------------------------- *)
233 (* --------------------------------- --------------------------------- *)
236 time real_qelim <<exists x. x - 1 > 0>>;;
240 time REAL_QELIM_CONV `?x. x - &1 > &0`;;
246 (* --------------------------------- --------------------------------- *)
248 time real_qelim <<exists x. 3 - x > 0 /\ x - 1 > 0>>;;
252 time REAL_QELIM_CONV `?x. &3 - x > &0 /\ x - &1 > &0`;;
259 (* ------------------------------------------------------------------------- *)
261 (* ------------------------------------------------------------------------- *)
263 (* --------------------------------- --------------------------------- *)
265 time real_qelim <<exists x. x^2 = 0>>;;
269 time REAL_QELIM_CONV `?x. x pow 2 = &0`;;
275 (* --------------------------------- --------------------------------- *)
277 time real_qelim <<exists x. x^2 + 1 = 0>>;;
279 time REAL_QELIM_CONV `?x. x pow 2 + &1 = &0`;;
285 (* --------------------------------- --------------------------------- *)
288 time real_qelim <<exists x. x^2 - 1 = 0>>;;
290 time REAL_QELIM_CONV `?x. x pow 2 - &1 = &0`;;
296 (* --------------------------------- --------------------------------- *)
299 time real_qelim <<exists x. x^2 - 2 * x + 1 = 0>>;;
301 time REAL_QELIM_CONV `?x. x pow 2 - &2 * x + &1 = &0`;;
306 (* --------------------------------- --------------------------------- *)
309 time real_qelim <<exists x. x^2 - 3 * x + 1 = 0>>;;
311 time REAL_QELIM_CONV `?x. x pow 2 - &3 * x + &1 = &0`;;
319 (* ------------------------------------------------------------------------- *)
321 (* ------------------------------------------------------------------------- *)
323 (* --------------------------------- --------------------------------- *)
326 time real_qelim <<exists x. x^3 - 1 > 0>>;;
328 time REAL_QELIM_CONV `?x. x pow 3 - &1 > &0`;;
335 (* --------------------------------- --------------------------------- *)
338 time real_qelim <<exists x. x^3 - 3 * x^2 + 3 * x - 1 > 0>>;;
340 time REAL_QELIM_CONV `?x. x pow 3 - &3 * x pow 2 + &3 * x - &1 > &0`;;
346 (* --------------------------------- --------------------------------- *)
349 time real_qelim <<exists x. x^3 - 4 * x^2 + 5 * x - 2 > 0>>;;
351 time REAL_QELIM_CONV `?x. x pow 3 - &4 * x pow 2 + &5 * x - &2 > &0`;;
357 (* --------------------------------- --------------------------------- *)
360 time real_qelim <<exists x. x^3 - 6 * x^2 + 11 * x - 6 = 0>>;;
362 time REAL_QELIM_CONV `?x. x pow 3 - &6 * x pow 2 + &11 * x - &6 = &0`;;
369 (* ------------------------------------------------------------------------- *)
371 (* ------------------------------------------------------------------------- *)
373 (* --------------------------------- --------------------------------- *)
376 time real_qelim <<exists x. x^4 - 1 > 0>>;;
379 time REAL_QELIM_CONV `?x. x pow 4 - &1 > &0`;;
386 (* --------------------------------- --------------------------------- *)
389 time real_qelim <<exists x. x^4 + 1 > 0>>;;
391 time REAL_QELIM_CONV `?x. x pow 4 + &1 > &0`;;
398 (* --------------------------------- --------------------------------- *)
401 time real_qelim <<exists x. x^4 = 0>>;;
403 time REAL_QELIM_CONV `?x. x pow 4 = &0`;;
409 (* --------------------------------- --------------------------------- *)
413 time real_qelim <<exists x. x^4 - x^3 = 0>>;;
415 time REAL_QELIM_CONV `?x. x pow 4 - x pow 3 = &0`;;
421 (* --------------------------------- --------------------------------- *)
425 time real_qelim <<exists x. x^4 - x^2 = 0>>;;
427 time REAL_QELIM_CONV `?x. x pow 4 - x pow 2 = &0`;;
433 (* --------------------------------- --------------------------------- *)
437 time real_qelim <<exists x. x^4 - 2 * x^2 + 2 = 0>>;;
439 time REAL_QELIM_CONV `?x. x pow 4 - &2 * x pow 2 + &2 = &0`;;
446 (* ------------------------------------------------------------------------- *)
448 (* ------------------------------------------------------------------------- *)
451 (* --------------------------------- --------------------------------- *)
455 <<exists x. x^5 - 15 * x^4 + 85 * x^3 - 225 * x^2 + 274 * x - 120 = 0>>;;
462 `?x. x pow 5 - &15 * x pow 4 + &85 * x pow 3 - &225 * x pow 2 + &274 * x - &120 = &0`;;
465 DATE ------- HOL -------- Factor
472 (* ------------------------------------------------------------------------- *)
474 (* ------------------------------------------------------------------------- *)
476 (* --------------------------------- --------------------------------- *)
480 time real_qelim <<exists x.
481 x^6 - 21 * x^5 + 175 * x^4 - 735 * x^3 + 1624 * x^2 - 1764 * x + 720 = 0>>;;
485 time REAL_QELIM_CONV `?x.
486 x pow 6 - &21 * x pow 5 + &175 * x pow 4 - &735 * x pow 3 + &1624 * x pow 2 - &1764 * x + &720 = &0`;;
487 `?x. x pow 5 - &15 * x pow 4 + &85 * x pow 3 - &225 * x pow 2 + &274 * x - &120 = &0`;;
490 DATE ------- HOL -------- Factor
491 4/29/2005 1400.4 10000
494 (* --------------------------------- --------------------------------- *)
497 time real_qelim <<exists x.
498 x^6 - 12 * x^5 + 56 * x^4 - 130 * x^3 + 159 * x^2 - 98 * x + 24 = 0>>;;
504 time REAL_QELIM_CONV `?x.
505 x pow 6 - &12 * x pow 5 + &56 * x pow 4 - &130 * x pow 3 + &159 * x pow 2 - &98 * x + &24 = &0`;;
508 (* ------------------------------------------------------------------------- *)
509 (* Multiple polynomials. *)
510 (* ------------------------------------------------------------------------- *)
512 (* --------------------------------- --------------------------------- *)
515 time real_qelim <<exists x. x^2 + 2 > 0 /\ x^3 - 11 = 0 /\ x + 131 >= 0>>;;
517 time REAL_QELIM_CONV `?x. x pow 2 + &2 > &0 /\ (x pow 3 - &11 = &0) /\ x + &131 >= &0`;;
523 (* ------------------------------------------------------------------------- *)
524 (* With more variables. *)
525 (* ------------------------------------------------------------------------- *)
527 (* --------------------------------- --------------------------------- *)
530 time real_qelim <<exists x. a * x^2 + b * x + c = 0>>;;
532 time REAL_QELIM_CONV `?x. a * x pow 2 + b * x + c = &0`;;
539 (* --------------------------------- --------------------------------- *)
542 time real_qelim <<exists x. a * x^3 + b * x^2 + c * x + d = 0>>;;
544 time REAL_QELIM_CONV `?x. a * x pow 3 + b * x pow 2 + c * x + d = &0`;;
552 (* ------------------------------------------------------------------------- *)
553 (* Constraint solving. *)
554 (* ------------------------------------------------------------------------- *)
556 (* --------------------------------- --------------------------------- *)
559 time real_qelim <<exists x1 x2. x1^2 + x2^2 - u1 <= 0 /\ x1^2 - u2 > 0>>;;
561 time REAL_QELIM_CONV `?x1 x2. x1 pow 2 + x2 pow 2 - u1 <= &0 /\ x1 pow 2 - u2 > &0`;;
567 (* ------------------------------------------------------------------------- *)
568 (* Huet & Oppen (interpretation of group theory). *)
569 (* ------------------------------------------------------------------------- *)
571 (* --------------------------------- --------------------------------- *)
574 time real_qelim <<forall x y. x > 0 /\ y > 0 ==> x * (1 + 2 * y) > 0>>;;
576 time REAL_QELIM_CONV `!x y. x > &0 /\ y > &0 ==> x * (&1 + &2 * y) > &0`;;
583 (* ------------------------------------------------------------------------- *)
584 (* Other examples. *)
585 (* ------------------------------------------------------------------------- *)
587 (* --------------------------------- --------------------------------- *)
590 time real_qelim <<exists x. x^2 - x + 1 = 0>>;;
592 time REAL_QELIM_CONV `?x. x pow 2 - x + &1 = &0`;;
598 (* --------------------------------- --------------------------------- *)
601 time real_qelim <<exists x. x^2 - 3 * x + 1 = 0>>;;
603 time REAL_QELIM_CONV `?x. x pow 2 - &3 * x + &1 = &0`;;
609 (* --------------------------------- --------------------------------- *)
612 time real_qelim <<exists x. x > 6 /\ (x^2 - 3 * x + 1 = 0)>>;;
614 time REAL_QELIM_CONV `?x. x > &6 /\ (x pow 2 - &3 * x + &1 = &0)`;;
620 (* --------------------------------- --------------------------------- *)
623 time real_qelim <<exists x. 7 * x^2 - 5 * x + 3 > 0 /\
624 x^2 - 3 * x + 1 = 0>>;;
626 time REAL_QELIM_CONV `?x. &7 * x pow 2 - &5 * x + &3 > &0 /\
627 (x pow 2 - &3 * x + &1 = &0)`;;
634 (* --------------------------------- --------------------------------- *)
637 time real_qelim <<exists x. 11 * x^3 - 7 * x^2 - 2 * x + 1 = 0 /\
638 7 * x^2 - 5 * x + 3 > 0 /\
639 x^2 - 8 * x + 1 = 0>>;;
641 time REAL_QELIM_CONV `?x. (&11 * x pow 3 - &7 * x pow 2 - &2 * x + &1 = &0) /\
642 &7 * x pow 2 - &5 * x + &3 > &0 /\
643 (x pow 2 - &8 * x + &1 = &0)`;;
650 (* ------------------------------------------------------------------------- *)
651 (* Quadratic inequality from Liska and Steinberg *)
652 (* ------------------------------------------------------------------------- *)
654 (* --------------------------------- --------------------------------- *)
658 <<forall x. -(1) <= x /\ x <= 1 ==>
659 C * (x - 1) * (4 * x * a * C - x * C - 4 * a * C + C - 2) >= 0>>;;
662 `!x. -- &1 <= x /\ x <= &1 ==>
663 C * (x - &1) * (&4 * x * a * C - x * C - &4 * a * C + C - &2) >= &0`;;
670 (* ------------------------------------------------------------------------- *)
671 (* Metal-milling example from Loos and Weispfenning *)
672 (* ------------------------------------------------------------------------- *)
675 (* --------------------------------- --------------------------------- *)
679 <<exists x y. 0 < x /\
681 x * r - x * t + t = q * x - s * x + s /\
682 x * b - x * d + d = a * y - c * y + c>>;;
687 (x * r - x * t + t = q * x - s * x + s) /\
688 (x * b - x * d + d = a * y - c * y + c)`;;
691 (* ------------------------------------------------------------------------- *)
692 (* Linear example from Collins and Johnson *)
693 (* ------------------------------------------------------------------------- *)
695 (* --------------------------------- --------------------------------- *)
701 0 < (1 - 3 * r) * (a^2 + b^2) + 2 * a * r /\
702 (2 - 3 * r) * (a^2 + b^2) + 4 * a * r - 2 * a - r < 0>>;;
707 &0 < (&1 - &3 * r) * (a pow 2 + b pow 2) + &2 * a * r /\
708 (&2 - &3 * r) * (a pow 2 + b pow 2) + &4 * a * r - &2 * a - r < &0`;;
711 (* ------------------------------------------------------------------------- *)
712 (* Dave Griffioen #4 *)
713 (* ------------------------------------------------------------------------- *)
715 (* --------------------------------- --------------------------------- *)
719 <<forall x y. (1 - t) * x <= (1 + t) * y /\ (1 - t) * y <= (1 + t) * x
723 `!x y. (&1 - t) * x <= (&1 + t) * y /\ (&1 - t) * y <= (&1 + t) * x
732 (* ------------------------------------------------------------------------- *)
733 (* Some examples from "Real Quantifier Elimination in practice". *)
734 (* ------------------------------------------------------------------------- *)
736 (* --------------------------------- --------------------------------- *)
739 time real_qelim <<exists x2. x1^2 + x2^2 <= u1 /\ x1^2 > u2>>;;
741 time REAL_QELIM_CONV `?x2. x1 pow 2 + x2 pow 2 <= u1 /\ x1 pow 2 > u2`;;
747 (* --------------------------------- --------------------------------- *)
751 time real_qelim <<exists x1 x2. x1^2 + x2^2 <= u1 /\ x1^2 > u2>>;;
753 time REAL_QELIM_CONV `?x1 x2. x1 pow 2 + x2 pow 2 <= u1 /\ x1 pow 2 > u2`;;
760 (* --------------------------------- --------------------------------- *)
764 <<forall x1 x2. x1 + x2 <= 2 /\ x1 <= 1 /\ x1 >= 0 /\ x2 >= 0
765 ==> 3 * (x1 + 3 * x2^2 + 2) <= 8 * (2 * x1 + x2 + 1)>>;;
768 `!x1 x2. x1 + x2 <= &2 /\ x1 <= &1 /\ x1 >= &0 /\ x2 >= &0
769 ==> &3 * (x1 + &3 * x2 pow 2 + &2) <= &8 * (&2 * x1 + x2 + &1)`;;
777 (* ------------------------------------------------------------------------- *)
778 (* From Collins & Johnson's "Sign variation..." article. *)
779 (* ------------------------------------------------------------------------- *)
781 (* --------------------------------- --------------------------------- *)
784 time real_qelim <<exists r. 0 < r /\ r < 1 /\
785 (1 - 3 * r) * (a^2 + b^2) + 2 * a * r > 0 /\
786 (2 - 3 * r) * (a^2 + b^2) + 4 * a * r - 2 * a - r < 0>>;;
788 time REAL_QELIM_CONV `?r. &0 < r /\ r < &1 /\
789 (&1 - &3 * r) * (a pow 2 + b pow 2) + &2 * a * r > &0 /\
790 (&2 - &3 * r) * (a pow 2 + b pow 2) + &4 * a * r - &2 * a - r < &0`;;
797 (* ------------------------------------------------------------------------- *)
798 (* From "Parallel implementation of CAD" article. *)
799 (* ------------------------------------------------------------------------- *)
801 (* --------------------------------- --------------------------------- *)
804 time real_qelim <<exists x. forall y. x^2 + y^2 > 1 /\ x * y >= 1>>;;
806 time REAL_QELIM_CONV `?x. !y. x pow 2 + y pow 2 > &1 /\ x * y >= &1`;;
814 (* ------------------------------------------------------------------------- *)
815 (* Other misc examples. *)
816 (* ------------------------------------------------------------------------- *)
818 (* --------------------------------- --------------------------------- *)
821 time real_qelim <<forall x y. x^2 + y^2 = 1 ==> 2 * x * y <= 1>>;;
823 time REAL_QELIM_CONV `!x y. (x pow 2 + y pow 2 = &1) ==> &2 * x * y <= &1`;;
829 (* --------------------------------- --------------------------------- *)
832 time real_qelim <<forall x y. x^2 + y^2 = 1 ==> 2 * x * y < 1>>;;
834 time REAL_QELIM_CONV `!x y. (x pow 2 + y pow 2 = &1) ==> &2 * x * y < &1`;;
840 (* --------------------------------- --------------------------------- *)
843 time real_qelim <<forall x y. x * y > 0 <=> x > 0 /\ y > 0 \/ x < 0 /\ y < 0>>;;
845 time REAL_QELIM_CONV `!x y. x * y > &0 <=> x > &0 /\ y > &0 \/ x < &0 /\ y < &0`;;
851 (* --------------------------------- --------------------------------- *)
854 time real_qelim <<exists x y. x > y /\ x^2 < y^2>>;;
856 time REAL_QELIM_CONV `?x y. x > y /\ x pow 2 < y pow 2`;;
862 (* --------------------------------- --------------------------------- *)
865 time real_qelim <<forall x y. x < y ==> exists z. x < z /\ z < y>>;;
867 time REAL_QELIM_CONV `!x y. x < y ==> ?z. x < z /\ z < y`;;
873 (* --------------------------------- --------------------------------- *)
876 time real_qelim <<forall x. 0 < x <=> exists y. x * y^2 = 1>>;;
878 time REAL_QELIM_CONV `!x. &0 < x <=> ?y. x * y pow 2 = &1`;;
884 (* --------------------------------- --------------------------------- *)
887 time real_qelim <<forall x. 0 <= x <=> exists y. x * y^2 = 1>>;;
889 time REAL_QELIM_CONV `!x. &0 <= x <=> ?y. x * y pow 2 = &1`;;
895 (* --------------------------------- --------------------------------- *)
898 time real_qelim <<forall x. 0 <= x <=> exists y. x = y^2>>;;
900 time REAL_QELIM_CONV `!x. &0 <= x <=> ?y. x = y pow 2`;;
906 (* --------------------------------- --------------------------------- *)
909 time real_qelim <<forall x y. 0 < x /\ x < y ==> exists z. x < z^2 /\ z^2 < y>>;;
911 time REAL_QELIM_CONV `!x y. &0 < x /\ x < y ==> ?z. x < z pow 2 /\ z pow 2 < y`;;
917 (* --------------------------------- --------------------------------- *)
920 time real_qelim <<forall x y. x < y ==> exists z. x < z^2 /\ z^2 < y>>;;
922 time REAL_QELIM_CONV `!x y. x < y ==> ?z. x < z pow 2 /\ z pow 2 < y`;;
928 (* --------------------------------- --------------------------------- *)
931 time real_qelim <<forall x y. x^2 + y^2 = 0 ==> x = 0 /\ y = 0>>;;
933 time REAL_QELIM_CONV `!x y. (x pow 2 + y pow 2 = &0) ==> (x = &0) /\ (y = &0)`;;
939 (* --------------------------------- --------------------------------- *)
942 time real_qelim <<forall x y z. x^2 + y^2 + z^2 = 0 ==> x = 0 /\ y = 0 /\ z = 0>>;;
944 time REAL_QELIM_CONV `!x y z. (x pow 2 + y pow 2 + z pow 2 = &0) ==> (x = &0) /\ (y = &0) /\ (z = &0)`;;
947 (* --------------------------------- --------------------------------- *)
950 time real_qelim <<forall w x y z. w^2 + x^2 + y^2 + z^2 = 0
951 ==> w = 0 /\ x = 0 /\ y = 0 /\ z = 0>>;;
953 time REAL_QELIM_CONV `!w x y z. (w pow 2 + x pow 2 + y pow 2 + z pow 2 = &0)
954 ==> (w = &0) /\ (x = &0) /\ (y = &0) /\ (z = &0)`;;
961 (* --------------------------------- --------------------------------- *)
964 time real_qelim <<forall a. a^2 = 2 ==> forall x. ~(x^2 + a*x + 1 = 0)>>;;
966 time REAL_QELIM_CONV `!a. (a pow 2 = &2) ==> !x. ~(x pow 2 + a*x + &1 = &0)`;;
974 (* --------------------------------- --------------------------------- *)
977 time real_qelim <<forall a. a^2 = 2 ==> forall x. ~(x^2 - a*x + 1 = 0)>>;;
979 time REAL_QELIM_CONV `!a. (a pow 2 = &2) ==> !x. ~(x pow 2 - a*x + &1 = &0)`;;
986 (* --------------------------------- --------------------------------- *)
989 time real_qelim <<forall x y. x^2 = 2 /\ y^2 = 3 ==> (x * y)^2 = 6>>;;
991 time REAL_QELIM_CONV `!x y. (x pow 2 = &2) /\ (y pow 2 = &3) ==> ((x * y) pow 2 = &6)`;;
997 (* --------------------------------- --------------------------------- *)
1000 time real_qelim <<forall x. exists y. x^2 = y^3>>;;
1002 time REAL_QELIM_CONV `!x. ?y. x pow 2 = y pow 3`;;
1008 (* --------------------------------- --------------------------------- *)
1011 time real_qelim <<forall x. exists y. x^3 = y^2>>;;
1013 time REAL_QELIM_CONV `!x. ?y. x pow 3 = y pow 2`;;
1019 (* --------------------------------- --------------------------------- *)
1024 (a * x^2 + b * x + c = 0) /\
1025 (a * y^2 + b * y + c = 0) /\
1027 ==> (a * (x + y) + b = 0)>>;;
1029 time REAL_QELIM_CONV
1031 (a * x pow 2 + b * x + c = &0) /\
1032 (a * y pow 2 + b * y + c = &0) /\
1034 ==> (a * (x + y) + b = &0)`;;
1040 (* --------------------------------- --------------------------------- *)
1044 <<forall y_1 y_2 y_3 y_4.
1047 (y_1 * y_3 = y_2 * y_4)
1048 ==> (y_1^2 = y_2^2)>>;;
1050 time REAL_QELIM_CONV
1054 (y_1 * y_3 = y_2 * y_4)
1055 ==> (y_1 pow 2 = y_2 pow 2)`;;
1057 time real_qelim <<forall x. x^2 < 1 <=> x^4 < 1>>;;
1066 (* ------------------------------------------------------------------------- *)
1067 (* Counting roots. *)
1068 (* ------------------------------------------------------------------------- *)
1071 (* --------------------------------- --------------------------------- *)
1074 time real_qelim <<exists x. x^3 - x^2 + x - 1 = 0>>;;
1076 time REAL_QELIM_CONV `?x. x pow 3 - x pow 2 + x - &1 = &0`;;
1083 (* --------------------------------- --------------------------------- *)
1087 <<exists x y. x^3 - x^2 + x - 1 = 0 /\ y^3 - y^2 + y - 1 = 0 /\ ~(x = y)>>;;
1089 time REAL_QELIM_CONV
1090 `?x y. (x pow 3 - x pow 2 + x - &1 = &0) /\ (y pow 3 - y pow 2 + y - &1 = &0) /\ ~(x = y)`;;
1097 (* --------------------------------- --------------------------------- *)
1100 time real_qelim <<exists x. x^4 + x^2 - 2 = 0>>;;
1102 time REAL_QELIM_CONV `?x. x pow 4 + x pow 2 - &2 = &0`;;
1109 (* --------------------------------- --------------------------------- *)
1113 <<exists x y. x^4 + x^2 - 2 = 0 /\ y^4 + y^2 - 2 = 0 /\ ~(x = y)>>;;
1115 time REAL_QELIM_CONV
1116 `?x y. x pow 4 + x pow 2 - &2 = &0 /\ y pow 4 + y pow 2 - &2 = &0 /\ ~(x = y)`;;
1118 (* --------------------------------- --------------------------------- *)
1122 <<exists x y. x^3 + x^2 - x - 1 = 0 /\ y^3 + y^2 - y - 1 = 0 /\ ~(x = y)>>;;
1124 time REAL_QELIM_CONV
1125 `?x y. (x pow 3 + x pow 2 - x - &1 = &0) /\ (y pow 3 + y pow 2 - y - &1 = &0) /\ ~(x = y)`;;
1127 (* --------------------------------- --------------------------------- *)
1131 time real_qelim <<exists x y z. x^3 + x^2 - x - 1 = 0 /\
1132 y^3 + y^2 - y - 1 = 0 /\
1133 z^3 + z^2 - z - 1 = 0 /\ ~(x = y) /\ ~(x = z)>>;;
1135 time REAL_QELIM_CONV `?x y z. (x pow 3 + x pow 2 - x - &1 = &0) /\
1136 (y pow 3 + y pow 2 - y - &1 = &0) /\
1137 (z pow 3 + z pow 2 - z - &1 = &0) /\ ~(x = y) /\ ~(x = z)`;;
1139 (* ------------------------------------------------------------------------- *)
1140 (* Existence of tangents, so to speak. *)
1141 (* ------------------------------------------------------------------------- *)
1143 (* --------------------------------- --------------------------------- *)
1147 <<forall x y. exists s c. s^2 + c^2 = 1 /\ s * x + c * y = 0>>;;
1149 time REAL_QELIM_CONV
1150 `!x y. ?s c. (s pow 2 + c pow 2 = &1) /\ s * x + c * y = &0`;;
1152 (* ------------------------------------------------------------------------- *)
1153 (* Another useful thing (componentwise ==> normwise accuracy etc.) *)
1154 (* ------------------------------------------------------------------------- *)
1156 (* --------------------------------- --------------------------------- *)
1159 time real_qelim <<forall x y. (x + y)^2 <= 2 * (x^2 + y^2)>>;;
1161 time REAL_QELIM_CONV `!x y. (x + y) pow 2 <= &2 * (x pow 2 + y pow 2)`;;
1163 (* ------------------------------------------------------------------------- *)
1164 (* Some related quantifier elimination problems. *)
1165 (* ------------------------------------------------------------------------- *)
1167 (* --------------------------------- --------------------------------- *)
1170 time real_qelim <<forall x y. (x + y)^2 <= c * (x^2 + y^2)>>;;
1172 time REAL_QELIM_CONV `!x y. (x + y) pow 2 <= c * (x pow 2 + y pow 2)`;;
1174 (* --------------------------------- --------------------------------- *)
1178 <<forall c. (forall x y. (x + y)^2 <= c * (x^2 + y^2)) <=> 2 <= c>>;;
1180 time REAL_QELIM_CONV
1181 `!c. (!x y. (x + y) pow 2 <= c * (x pow 2 + y pow 2)) <=> &2 <= c`;;
1183 (* --------------------------------- --------------------------------- *)
1186 time real_qelim <<forall a b. a * b * c <= a^2 + b^2>>;;
1188 time REAL_QELIM_CONV `!a b. a * b * c <= a pow 2 + b pow 2`;;
1190 (* --------------------------------- --------------------------------- *)
1194 <<forall c. (forall a b. a * b * c <= a^2 + b^2) <=> c^2 <= 4>>;;
1196 time REAL_QELIM_CONV
1197 `!c. (!a b. a * b * c <= a pow 2 + b pow 2) <=> c pow 2 <= &4`;;
1199 (* ------------------------------------------------------------------------- *)
1200 (* Tedious lemmas I once proved manually in HOL. *)
1201 (* ------------------------------------------------------------------------- *)
1203 (* --------------------------------- --------------------------------- *)
1207 <<forall a b c. 0 < a /\ 0 < b /\ 0 < c
1208 ==> 0 < a * b /\ 0 < a * c /\ 0 < b * c>>;;
1210 time REAL_QELIM_CONV
1211 `!a b c. &0 < a /\ &0 < b /\ &0 < c
1212 ==> &0 < a * b /\ &0 < a * c /\ &0 < b * c`;;
1214 (* --------------------------------- --------------------------------- *)
1218 <<forall a b c. a * b > 0 ==> (c * a < 0 <=> c * b < 0)>>;;
1220 time REAL_QELIM_CONV
1221 `!a b c. a * b > &0 ==> (c * a < &0 <=> c * b < &0)`;;
1223 (* --------------------------------- --------------------------------- *)
1227 <<forall a b c. a * b > 0 ==> (a * c < 0 <=> b * c < 0)>>;;
1229 time REAL_QELIM_CONV
1230 `!a b c. a * b > &0 ==> (a * c < &0 <=> b * c < &0)`;;
1232 (* --------------------------------- --------------------------------- *)
1236 <<forall a b. a < 0 ==> (a * b > 0 <=> b < 0)>>;;
1238 time REAL_QELIM_CONV
1239 `!a b. a < &0 ==> (a * b > &0 <=> b < &0)`;;
1241 (* --------------------------------- --------------------------------- *)
1245 <<forall a b c. a * b < 0 /\ ~(c = 0) ==> (c * a < 0 <=> ~(c * b < 0))>>;;
1247 time REAL_QELIM_CONV
1248 `!a b c. a * b < &0 /\ ~(c = &0) ==> (c * a < &0 <=> ~(c * b < &0))`;;
1250 (* --------------------------------- --------------------------------- *)
1254 <<forall a b. a * b < 0 <=> a > 0 /\ b < 0 \/ a < 0 /\ b > 0>>;;
1256 time REAL_QELIM_CONV
1257 `!a b. a * b < &0 <=> a > &0 /\ b < &0 \/ a < &0 /\ b > &0`;;
1259 (* --------------------------------- --------------------------------- *)
1263 <<forall a b. a * b <= 0 <=> a >= 0 /\ b <= 0 \/ a <= 0 /\ b >= 0>>;;
1265 time REAL_QELIM_CONV
1266 `!a b. a * b <= &0 <=> a >= &0 /\ b <= &0 \/ a <= &0 /\ b >= &0`;;
1268 (* ------------------------------------------------------------------------- *)
1269 (* Vaguely connected with reductions for Robinson arithmetic. *)
1270 (* ------------------------------------------------------------------------- *)
1272 (* --------------------------------- --------------------------------- *)
1276 <<forall a b. ~(a <= b) <=> forall d. d <= b ==> d < a>>;;
1278 time REAL_QELIM_CONV
1279 `!a b. ~(a <= b) <=> !d. d <= b ==> d < a`;;
1281 (* --------------------------------- --------------------------------- *)
1285 <<forall a b. ~(a <= b) <=> forall d. d <= b ==> ~(d = a)>>;;
1287 time REAL_QELIM_CONV
1288 `!a b. ~(a <= b) <=> !d. d <= b ==> ~(d = a)`;;
1290 (* --------------------------------- --------------------------------- *)
1294 <<forall a b. ~(a < b) <=> forall d. d < b ==> d < a>>;;
1296 time REAL_QELIM_CONV
1297 `!a b. ~(a < b) <=> !d. d < b ==> d < a`;;
1299 (* ------------------------------------------------------------------------- *)
1300 (* Another nice problem. *)
1301 (* ------------------------------------------------------------------------- *)
1303 (* --------------------------------- --------------------------------- *)
1307 <<forall x y. x^2 + y^2 = 1 ==> (x + y)^2 <= 2>>;;
1309 time REAL_QELIM_CONV
1310 `!x y. (x pow 2 + y pow 2 = &1) ==> (x + y) pow 2 <= &2`;;
1312 (* ------------------------------------------------------------------------- *)
1313 (* Some variants / intermediate steps in Cauchy-Schwartz inequality. *)
1314 (* ------------------------------------------------------------------------- *)
1316 (* --------------------------------- --------------------------------- *)
1320 <<forall x y. 2 * x * y <= x^2 + y^2>>;;
1322 time REAL_QELIM_CONV
1323 `!x y. &2 * x * y <= x pow 2 + y pow 2`;;
1325 (* --------------------------------- --------------------------------- *)
1329 <<forall a b c d. 2 * a * b * c * d <= a^2 * b^2 + c^2 * d^2>>;;
1331 time REAL_QELIM_CONV
1332 `!a b c d. &2 * a * b * c * d <= a pow 2 * b pow 2 + c pow 2 * d pow 2`;;
1334 (* --------------------------------- --------------------------------- *)
1338 <<forall x1 x2 y1 y2.
1339 (x1 * y1 + x2 * y2)^2 <= (x1^2 + x2^2) * (y1^2 + y2^2)>>;;
1341 time REAL_QELIM_CONV
1343 (x1 * y1 + x2 * y2) pow 2 <= (x1 pow 2 + x2 pow 2) * (y1 pow 2 + y2 pow 2)`;;
1345 (* ------------------------------------------------------------------------- *)
1346 (* The determinant example works OK here too. *)
1347 (* ------------------------------------------------------------------------- *)
1349 (* --------------------------------- --------------------------------- *)
1353 <<exists w x y z. (a * w + b * y = 1) /\
1354 (a * x + b * z = 0) /\
1355 (c * w + d * y = 0) /\
1356 (c * x + d * z = 1)>>;;
1358 time REAL_QELIM_CONV
1359 `?w x y z. (a * w + b * y = &1) /\
1360 (a * x + b * z = &0) /\
1361 (c * w + d * y = &0) /\
1362 (c * x + d * z = &1)`;;
1364 (* --------------------------------- --------------------------------- *)
1369 (exists w x y z. (a * w + b * y = 1) /\
1370 (a * x + b * z = 0) /\
1371 (c * w + d * y = 0) /\
1372 (c * x + d * z = 1))
1373 <=> ~(a * d = b * c)>>;;
1375 time REAL_QELIM_CONV
1377 (?w x y z. (a * w + b * y = &1) /\
1378 (a * x + b * z = &0) /\
1379 (c * w + d * y = &0) /\
1380 (c * x + d * z = &1))
1381 <=> ~(a * d = b * c)`;;
1383 (* ------------------------------------------------------------------------- *)
1384 (* From applying SOLOVAY_VECTOR_TAC. *)
1385 (* ------------------------------------------------------------------------- *)
1388 (`&0 <= c' /\ &0 <= c /\ &0 < h * c'
1390 (!v. &0 < v /\ v <= u
1391 ==> v * (v * (h * h * c' + c) - h * c') - (v * h * c' - c') <
1393 W(fun (asl,w) -> MAP_EVERY (fun v -> SPEC_TAC(v,v)) (frees w)) THEN
1394 CONV_TAC REAL_QELIM_CONV);;
1396 (* ------------------------------------------------------------------------- *)
1397 (* Two notions of parallelism. *)
1398 (* ------------------------------------------------------------------------- *)
1400 time REAL_QELIM_CONV
1401 `!x1 x2 y1 y2. (?c. (x2 = c * x1) /\ (y2 = c * y1)) <=>
1402 (x1 = &0 /\ y1 = &0 ==> x2 = &0 /\ y2 = &0) /\
1403 x1 * y2 = x2 * y1`;;
1405 (* ------------------------------------------------------------------------- *)
1406 (* From Behzad Akbarpour (takes about 300 seconds). *)
1407 (* ------------------------------------------------------------------------- *)
1409 time REAL_QELIM_CONV
1410 `!x. &0 <= x /\ x <= &1
1411 ==> &0 < &1 - x + x pow 2 / &2 - x pow 3 / &6 /\
1412 &1 <= (&1 + x + x pow 2) *
1413 (&1 - x + x pow 2 / &2 - x pow 3 / &6)`;;
1415 (* ------------------------------------------------------------------------- *)
1416 (* A natural simplification of "limit of a product" result. *)
1417 (* Takes about 450 seconds. *)
1418 (* ------------------------------------------------------------------------- *)
1420 (*** Would actually like to get rid of abs internally and state it like this:
1422 time REAL_QELIM_CONV
1423 `!x y e. &0 < e ==> ?d. &0 < d /\ abs((x + d) * (y + d) - x * y) < e`;;
1427 time REAL_QELIM_CONV
1428 `!x y e. &0 < e ==> ?d. &0 < d /\ (x + d) * (y + d) - x * y < e /\
1429 x * y - (x + d) * (y + d) < e`;;