@@ -94,17 +94,29 @@ elim: ff => // {k}.
9494- by move=> ff1 IH1 ff2 IH2; congr eq.
9595Qed .
9696
97+ #[local] Notation nPEeval :=
98+ ltac:(exact (EnvRing.PEeval (R_of_Z Z0) (R_of_Z (Zpos xH)) add mul sub opp
99+ R_of_Z id exp)
100+ || exact (EnvRing.PEeval add mul sub opp R_of_Z id exp)) (only parsing).
101+ (* Replace by LHS when requiring Rocq >= 9.2 *)
102+
97103Definition Reval_PFormula (e : PolEnv R) k (ff : Formula Z) : eKind k :=
98- let eval := EnvRing.PEeval add mul sub opp R_of_Z id exp e in
104+ let eval := nPEeval e in
99105 let (lhs,o,rhs) := ff in Reval_op2 k o (eval lhs) (eval rhs).
100106
101107Lemma pop2_bop2 (op : Op2) (q1 q2 : R) :
102108 Reval_bop2 op q1 q2 <-> Reval_pop2 op q1 q2.
103109Proof . by case: op => //=; rewrite eqPropE eqBoolE; split => /eqP. Qed .
104110
111+ #[local] Notation neval_formula :=
112+ ltac:(exact (eval_formula (R_of_Z Z0) (R_of_Z (Zpos xH)) add mul sub opp
113+ eqProp le lt R_of_Z id exp)
114+ || exact (eval_formula add mul sub opp eqProp le lt R_of_Z id exp))
115+ (only parsing).
116+ (* Replace by LHS when requiring Rocq >= 9.2 *)
117+
105118Lemma Reval_formula_compat (env : PolEnv R) k (f : Formula Z) :
106- hold k (Reval_PFormula env k f) <->
107- eval_formula add mul sub opp eqProp le lt R_of_Z id exp env f.
119+ hold k (Reval_PFormula env k f) <-> neval_formula env f.
108120Proof .
109121by case: f => lhs op rhs; case: k => /=; rewrite ?pop2_bop2; case: op.
110122Qed .
@@ -211,17 +223,33 @@ elim: ff => // {k}.
211223- by move=> ff1 IH1 ff2 IH2; congr eq.
212224Qed .
213225
226+ (* Remove the two lines below when requiring Rocq >= 9.2 *)
227+ #[local] Notation Q0 := (Qmake Z0 xH) (only parsing).
228+ #[local] Notation Q1 := (Qmake (Zpos xH) xH) (only parsing).
229+
230+ #[local] Notation neval_pexpr :=
231+ ltac:(exact (eval_pexpr (F_of_Q Q0) (F_of_Q Q1) add mul sub opp F_of_Q id exp)
232+ || exact (eval_pexpr add mul sub opp F_of_Q id exp))
233+ (only parsing).
234+ (* Replace by LHS when requiring Rocq >= 9.2 *)
235+
214236Definition Feval_PFormula (e : PolEnv F) k (ff : Formula Q) : eKind k :=
215- let eval := eval_pexpr add mul sub opp F_of_Q id exp e in
237+ let eval := neval_pexpr e in
216238 let (lhs,o,rhs) := ff in Feval_op2 k o (eval lhs) (eval rhs).
217239
218240Lemma pop2_bop2' (op : Op2) (q1 q2 : F) :
219241 Feval_bop2 op q1 q2 <-> Feval_pop2 op q1 q2.
220242Proof . by case: op => //=; rewrite eqPropE eqBoolE; split => /eqP. Qed .
221243
244+ #[local] Notation nFeval_formula :=
245+ ltac:(exact (eval_formula (F_of_Q Q0) (F_of_Q Q1) add mul sub opp
246+ eqProp le lt F_of_Q id exp)
247+ || exact (eval_formula add mul sub opp eqProp le lt F_of_Q id exp))
248+ (only parsing).
249+ (* Replace by LHS when requiring Rocq >= 9.2 *)
250+
222251Lemma Feval_formula_compat env b f :
223- hold b (Feval_PFormula env b f) <->
224- eval_formula add mul sub opp eqProp le lt F_of_Q id exp env f.
252+ hold b (Feval_PFormula env b f) <-> nFeval_formula env f.
225253Proof .
226254by case: f => lhs op rhs; case: b => /=; rewrite ?pop2_bop2'; case: op.
227255Qed .
@@ -242,6 +270,10 @@ Notation FSORaddon := (FSORaddon F).
242270Definition Feval_nformula : PolEnv F -> NFormula Q -> Prop :=
243271 eval_nformula 0 +%R *%R eq (fun x y => x <= y) (fun x y => x < y) R_of_Q.
244272
273+ (* Remove the two lines below when requiring Rocq >= 9.2 *)
274+ #[local] Notation Q0 := (Qmake Z0 xH) (only parsing).
275+ #[local] Notation Q1 := (Qmake (Zpos xH) xH) (only parsing).
276+
245277Lemma FTautoChecker_sound
246278 (ff : BFormula (RFormula F) isProp) (f : BFormula (Formula Q) isProp)
247279 (w : seq (Psatz Q)) (env : PolEnv F) :
@@ -255,14 +287,16 @@ Lemma FTautoChecker_sound
255287Proof .
256288rewrite (Fnorm_bf_correct erefl erefl erefl erefl erefl erefl).
257289move/(_ R_of_Q) => -> Hchecker.
290+ have RQ0 : R_of_Q Q0 = 0 :> F by rewrite /R_of_Q/= mul0r.
291+ have RQ1 : R_of_Q Q1 = 1 :> F by rewrite /R_of_Q/= divr1.
258292move: Hchecker env; apply: (tauto_checker_sound _ _ _ _ Feval_nformula).
259293- exact: (eval_nformula_dec Rsor).
260294- by move=> [? ?] ? ?; apply: (check_inconsistent_sound Rsor FSORaddon).
261295- move=> t t' u deducett'u env evalt evalt'.
262296 exact: (nformula_plus_nformula_correct Rsor FSORaddon env t t').
263- - move=> env k t tg cnfff; rewrite Feval_formula_compat //.
297+ - move=> env k t tg cnfff; rewrite Feval_formula_compat // ?RQ0 ?RQ1 .
264298 exact: (cnf_normalise_correct Rsor FSORaddon env t tg).1.
265- - move=> env k t tg cnfff; rewrite hold_eNOT Feval_formula_compat //.
299+ - move=> env k t tg cnfff; rewrite hold_eNOT Feval_formula_compat // ?RQ0 ?RQ1 .
266300 exact: (cnf_negate_correct Rsor FSORaddon env t tg).1.
267301- move=> t w0 checkw0 env; rewrite (Refl.make_impl_map (Feval_nformula env)) //.
268302 exact: (checker_nf_sound Rsor FSORaddon) checkw0 env.
@@ -284,14 +318,28 @@ Definition vm_of_list T (l : list T) : VarMap.t T :=
284318Definition omap2 {aT1 aT2 rT} (f : aT1 -> aT2 -> rT) o1 o2 :=
285319 obind (fun a1 => omap (f a1) o2) o1.
286320
287- Fixpoint PExpr_Q2Z (e : PExpr Q) : option (PExpr Z) := match e with
288- | PEc (Qmake z 1) => Some (PEc z) | PEc _ => None
289- | PEX n => Some (PEX n)
290- | PEadd e1 e2 => omap2 PEadd (PExpr_Q2Z e1) (PExpr_Q2Z e2)
291- | PEsub e1 e2 => omap2 PEsub (PExpr_Q2Z e1) (PExpr_Q2Z e2)
292- | PEmul e1 e2 => omap2 PEmul (PExpr_Q2Z e1) (PExpr_Q2Z e2)
293- | PEopp e1 => omap PEopp (PExpr_Q2Z e1)
294- | PEpow e1 n => omap (PEpow ^~ n) (PExpr_Q2Z e1) end .
321+ Definition PExpr_Q2Z := ltac:(exact
322+ (fix PExpr_Q2Z (e : PExpr Q) : option (PExpr Z) :=
323+ match e with
324+ | PEO => Some PEO | PEI => Some PEI
325+ | PEc (Qmake z 1) => Some (PEc z) | PEc _ => None
326+ | PEX n => Some (PEX _ n)
327+ | PEadd e1 e2 => omap2 PEadd (PExpr_Q2Z e1) (PExpr_Q2Z e2)
328+ | PEsub e1 e2 => omap2 PEsub (PExpr_Q2Z e1) (PExpr_Q2Z e2)
329+ | PEmul e1 e2 => omap2 PEmul (PExpr_Q2Z e1) (PExpr_Q2Z e2)
330+ | PEopp e1 => omap PEopp (PExpr_Q2Z e1)
331+ | PEpow e1 n => omap (PEpow ^~ n) (PExpr_Q2Z e1) end )
332+ || exact
333+ (fix PExpr_Q2Z (e : PExpr Q) : option (PExpr Z) :=
334+ match e with
335+ | PEc (Qmake z 1) => Some (PEc z) | PEc _ => None
336+ | PEX n => Some (PEX n)
337+ | PEadd e1 e2 => omap2 PEadd (PExpr_Q2Z e1) (PExpr_Q2Z e2)
338+ | PEsub e1 e2 => omap2 PEsub (PExpr_Q2Z e1) (PExpr_Q2Z e2)
339+ | PEmul e1 e2 => omap2 PEmul (PExpr_Q2Z e1) (PExpr_Q2Z e2)
340+ | PEopp e1 => omap PEopp (PExpr_Q2Z e1)
341+ | PEpow e1 n => omap (PEpow ^~ n) (PExpr_Q2Z e1) end )).
342+ (* Replace by LHS when requiring Rocq >= 9.2 *)
295343
296344Definition Formula_Q2Z (ff : Formula Q) : option (Formula Z) :=
297345 omap2
0 commit comments