aboutsummaryrefslogtreecommitdiff
path: root/contrib/micromega/Examples.v
blob: 6bb9311a5f9e1ffdb7e2136bf8595bac5202ac9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
Require Import OrderedRing.
Require Import RingMicromega.
Require Import ZCoeff.
Require Import Refl.
Require Import ZArith.
Require Import List.
(*****)
Require Import NRing.
Require Import VarMap.
(*****)
(*Require Import Ring_polynom.*)
(*****)

Import OrderedRingSyntax.

Section Examples.

Variable R : Type.
Variables rO rI : R.
Variables rplus rtimes rminus: R -> R -> R.
Variable ropp : R -> R.
Variables req rle rlt : R -> R -> Prop.

Variable sor : SOR rO rI rplus rtimes rminus ropp req rle rlt.

Notation "0" := rO.
Notation "1" := rI.
Notation "x + y" := (rplus x y).
Notation "x * y " := (rtimes x y).
Notation "x - y " := (rminus x y).
Notation "- x" := (ropp x).
Notation "x == y" := (req x y).
Notation "x ~= y" := (~ req x y).
Notation "x <= y" := (rle x y).
Notation "x < y" := (rlt x y).

Definition phi : Z -> R := gen_order_phi_Z 0 1 rplus rtimes ropp.

Lemma ZSORaddon :
  SORaddon 0 1 rplus rtimes rminus ropp req rle (* ring elements *)
           0%Z 1%Z Zplus Zmult Zminus Zopp (* coefficients *)
           Zeq_bool Zle_bool
           phi (fun x => x) (pow_N 1 rtimes).
Proof.
constructor.
exact (Zring_morph sor).
exact (pow_N_th 1 rtimes sor.(SORsetoid)).
apply (Zcneqb_morph sor).
apply (Zcleb_morph sor).
Qed.

Definition Zeval_formula :=
  eval_formula 0 rplus rtimes rminus ropp req rle rlt phi (fun x => x) (pow_N 1 rtimes).
Definition Z_In := S_In 0%Z Zeq_bool Zle_bool.
Definition Z_Square := S_Square 0%Z Zeq_bool Zle_bool.

(* Example: forall x y : Z, x + y = 0 -> x - y = 0 -> x < 0 -> False *)

Lemma plus_minus : forall x y : R, x + y == 0 -> x - y == 0 -> x < 0 -> False.
Proof.
intros x y.
Open Scope Z_scope.
(*****)
set (env := fun x y : R => Node (Leaf y) x (Empty _)).
(*****)
(*set (env := fun (x y : R) => x :: y :: nil).*)
(*****)
set (expr :=
 Build_Formula (PEadd (PEX Z 1) (PEX Z 2)) OpEq (PEc 0)
   :: Build_Formula (PEsub (PEX Z 1) (PEX Z 2)) OpEq (PEc 0)
      :: Build_Formula (PEX Z 1) OpLt (PEc 0) :: nil).
set (cert :=
   S_Add (S_Mult (S_Pos 0 Zeq_bool Zle_bool 2 (refl_equal true)) (Z_In 2))
     (S_Add (S_Ideal (PEc 1) (Z_In 1)) (S_Ideal (PEc 1) (Z_In 0)))).
change (make_impl (Zeval_formula (env x y)) expr False).
apply (check_formulas_sound sor ZSORaddon expr cert).
reflexivity.
Close Scope Z_scope.
Qed.

(* Example *)

Let four : R := ((1 + 1) * (1 + 1)).
Lemma Zdiscr :
  forall a b c x : R,
    a * (x * x) + b * x + c == 0 -> 0 <= b * b - four * a * c.
Proof.
Open Scope Z_scope.
(*****)
set (env := fun (a b c x : R) => Node (Node (Leaf x) b (Empty _)) a (Leaf c)).
(*****)
(*set (env := fun (a b c x : R) => a :: b :: c :: x:: nil).*)
(*****)
set (poly1 :=
     (Build_Formula
           (PEadd
              (PEadd (PEmul (PEX Z 1) (PEmul (PEX Z 4) (PEX Z 4)))
                 (PEmul (PEX Z 2) (PEX Z 4))) (PEX Z 3)) OpEq (PEc 0)) :: nil).
set (poly2 :=
     (Build_Formula
        (PEsub (PEmul (PEX Z 2) (PEX Z 2))
           (PEmul (PEmul (PEc 4) (PEX Z 1)) (PEX Z 3))) OpGe (PEc 0)) :: nil).
set (wit :=
    (S_Add (Z_In 0)
       (S_Add (S_Ideal (PEmul (PEc (-4)) (PEX Z 1)) (Z_In 1))
          (Z_Square
             (PEadd (PEmul (PEc 2) (PEmul (PEX Z 1) (PEX Z 4))) (PEX Z 2))))) :: nil).
intros a b c x.
change (make_impl (Zeval_formula (env a b c x)) poly1
  (make_conj (Zeval_formula (env a b c x)) poly2)).
apply (check_conj_formulas_sound sor ZSORaddon poly1 poly2 wit).
reflexivity.
Close Scope Z_scope.
Qed.

End Examples.