Skip to content

Commit d334887

Browse files
authored
Merge pull request #126 from proux01/stdlib207
Adapt to rocq-prover/stdlib#207
2 parents b8e7cdc + 7bd1b9f commit d334887

File tree

2 files changed

+80
-22
lines changed

2 files changed

+80
-22
lines changed

theories/lra.v

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,29 @@ elim: ff => // {k}.
9494
- by move=> ff1 IH1 ff2 IH2; congr eq.
9595
Qed.
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+
97103
Definition 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

101107
Lemma pop2_bop2 (op : Op2) (q1 q2 : R) :
102108
Reval_bop2 op q1 q2 <-> Reval_pop2 op q1 q2.
103109
Proof. 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+
105118
Lemma 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.
108120
Proof.
109121
by case: f => lhs op rhs; case: k => /=; rewrite ?pop2_bop2; case: op.
110122
Qed.
@@ -211,17 +223,33 @@ elim: ff => // {k}.
211223
- by move=> ff1 IH1 ff2 IH2; congr eq.
212224
Qed.
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+
214236
Definition 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

218240
Lemma pop2_bop2' (op : Op2) (q1 q2 : F) :
219241
Feval_bop2 op q1 q2 <-> Feval_pop2 op q1 q2.
220242
Proof. 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+
222251
Lemma 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.
225253
Proof.
226254
by case: f => lhs op rhs; case: b => /=; rewrite ?pop2_bop2'; case: op.
227255
Qed.
@@ -242,6 +270,10 @@ Notation FSORaddon := (FSORaddon F).
242270
Definition 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+
245277
Lemma 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
255287
Proof.
256288
rewrite (Fnorm_bf_correct erefl erefl erefl erefl erefl erefl).
257289
move/(_ 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.
258292
move: 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 :=
284318
Definition 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

296344
Definition Formula_Q2Z (ff : Formula Q) : option (Formula Z) :=
297345
omap2

theories/ring.v

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,12 @@ Definition Fcorrect F :=
251251
(Eqsth F) RE (congr1 GRing.inv) (F2AF (Eqsth F) RE (RF F)) (RZ F) (PN F)
252252
(triv_div_th (Eqsth F) RE (Rth_ARth (Eqsth F) RE (RR F)) (RZ F)).
253253

254+
#[local] Notation nFcons00 :=
255+
ltac:(exact (Fcons00 0 1 Z.add Z.mul Z.sub Z.opp Z.eqb)
256+
|| exact (Fcons00 0 1 Z.add Z.mul Z.sub Z.opp Z.eqb
257+
(triv_div 0 1 Z.eqb))) (only parsing).
258+
(* Replace by LHS when requiring Rocq >= 9.2 *)
259+
254260
Lemma field_correct (F : fieldType) (n : nat) (l : seq F)
255261
(lpe : seq (RExpr F * RExpr F * PExpr Z * PExpr Z))
256262
(re1 re2 : RExpr F) (fe1 fe2 : FExpr Z) :
@@ -285,9 +291,8 @@ Lemma field_correct (F : fieldType) (n : nat) (l : seq F)
285291
(norm_subst' (PEmul (num nfe2) (denum nfe1))) /\
286292
is_true_ (PCond' true negb_ andb_
287293
zero one add mul sub opp Feqb F_of_Z nat_of_N exp l'
288-
(Fapp (Fcons00 0 1 Z.add Z.mul Z.sub Z.opp Z.eqb
289-
(triv_div 0 1 Z.eqb))
290-
(condition nfe1 ++ condition nfe2) [::]))) ->
294+
(Fapp nFcons00
295+
(condition nfe1 ++ condition nfe2) [::]))) ->
291296
Reval re1 = Reval re2.
292297
Proof.
293298
move=> Hlpe' /(_ (fun n => (int_of_Z n)%:~R) 0%R -%R +%R (fun x y => x - y)).
@@ -305,6 +310,12 @@ by apply: Pcond_simpl_gen;
305310
move=> _ ->; exact/PCondP ].
306311
Qed.
307312

313+
#[local] Notation nFcons2 :=
314+
ltac:(exact (Fcons2 0 1 Z.add Z.mul Z.sub Z.opp (pow_pos Z.mul) Z.eqb)
315+
|| exact (Fcons2 0 1 Z.add Z.mul Z.sub Z.opp Z.eqb
316+
(triv_div 0 1 Z.eqb))) (only parsing).
317+
(* Replace by LHS when requiring Rocq >= 9.2 *)
318+
308319
Lemma numField_correct (F : numFieldType) (n : nat) (l : seq F)
309320
(lpe : seq (RExpr F * RExpr F * PExpr Z * PExpr Z))
310321
(re1 re2 : RExpr F) (fe1 fe2 : FExpr Z) :
@@ -339,9 +350,8 @@ Lemma numField_correct (F : numFieldType) (n : nat) (l : seq F)
339350
(norm_subst' (PEmul (num nfe2) (denum nfe1))) /\
340351
is_true_ (PCond' true negb_ andb_
341352
zero one add mul sub opp Feqb F_of_Z nat_of_N exp l'
342-
(Fapp (Fcons2 0 1 Z.add Z.mul Z.sub Z.opp Z.eqb
343-
(triv_div 0 1 Z.eqb))
344-
(condition nfe1 ++ condition nfe2) [::]))) ->
353+
(Fapp nFcons2
354+
(condition nfe1 ++ condition nfe2) [::]))) ->
345355
Reval re1 = Reval re2.
346356
Proof.
347357
move=> Hlpe' /(_ (fun n => (int_of_Z n)%:~R) 0%R -%R +%R (fun x y => x - y)).

0 commit comments

Comments
 (0)