Skip to content

Commit 1349c26

Browse files
fajbproux01
authored andcommitted
[zify] Define zify in terms of tify_* tactics
restructure components (isolate tify,zify)
1 parent f9d94e3 commit 1349c26

16 files changed

Lines changed: 349 additions & 236 deletions

File tree

subcomponents/lia.v

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
11
From subcomponents Require ring.
2+
From subcomponents Require tify.
23
From Stdlib Require micromega.Lia.
3-
From Stdlib Require micromega.SatDivMod.
4-
From Stdlib Require micromega.Zify.
5-
From Stdlib Require micromega.ZifyBool.
6-
From Stdlib Require micromega.ZifyClasses.
7-
From Stdlib Require micromega.ZifyComparison.
8-
From Stdlib Require micromega.ZifyInst.
9-
From Stdlib Require micromega.ZifyN.
10-
From Stdlib Require micromega.ZifyNat.
11-
From Stdlib Require micromega.ZifyPow.

subcomponents/tify.v

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
From subcomponents Require integers.
2+
From subcomponents Require ring.
3+
From Stdlib Require micromega.Tify.
4+
From Stdlib Require micromega.Zify.
5+
From Stdlib Require micromega.SatDivMod.
6+
From Stdlib Require micromega.ZifyBool.
7+
From Stdlib Require micromega.ZifyClasses.
8+
From Stdlib Require micromega.ZifyComparison.
9+
From Stdlib Require micromega.ZifyInst.
10+
From Stdlib Require micromega.ZifyN.
11+
From Stdlib Require micromega.ZifyNat.
12+
From Stdlib Require micromega.ZifyPow.

test-suite/micromega/bug_18158.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ Goal forall x y ,
8585
-> Z.le (Z.shiftr y 8) 255
8686
-> Z.le (Z.shiftr x 24) 255.
8787
intros.
88-
Zify.zify_saturate.
88+
Tify.tify_saturate.
8989
(* [mp_lia zchecker] used to raise a [Stack overflow] error. It is supposed to fail normally. *)
9090
assert_fails (mp_lia zchecker).
9191
Abort.

test-suite/success/TifyZR.v

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
From Stdlib Require Import Tify.
2+
From Stdlib Require Import ZifyClasses.
3+
From Stdlib Require Import Reals.
4+
From Stdlib Require Import Lra.
5+
(* [zify] instances are already loaded *)
6+
7+
Goal forall (y:nat),
8+
(Z.of_nat y + 1)%Z = Z.of_nat (y + 1).
9+
Proof.
10+
tify Z.
11+
change ((Z.of_nat y + 1)%Z = (Z.of_nat y + 1)%Z).
12+
reflexivity.
13+
Qed.
14+
15+
Goal forall (y:nat),
16+
(Z.of_nat y + 1)%Z = Z.of_nat (y + 1).
17+
Proof.
18+
tify R. (* This is no known way to map to R, default to Z *)
19+
change ((Z.of_nat y + 1)%Z = (Z.of_nat y + 1)%Z).
20+
reflexivity.
21+
Qed.
22+
23+
(* Define instances for R *)
24+
Lemma inj_IZR_iff : forall n m, n = m <-> (IZR n = IZR m)%R.
25+
Proof.
26+
split.
27+
apply f_equal.
28+
apply eq_IZR.
29+
Qed.
30+
31+
(* For the test, we lose the information that Z is discrete *)
32+
#[global]
33+
Instance Inj_Z_R : InjTyp Z R :=
34+
mkinj _ _ IZR (fun x => True) (fun _ => I).
35+
Add Tify InjTyp Inj_Z_R.
36+
37+
#[global]
38+
Instance Inj_nat_R : InjTyp nat R :=
39+
mkinj _ _ INR (fun x => 0 <= x)%R pos_INR.
40+
Add Tify InjTyp Inj_nat_R.
41+
42+
#[global]
43+
Instance Inj_R_R : InjTyp R R :=
44+
mkinj _ _ (fun x=> x) (fun x => True) (fun _ => I).
45+
Add Tify InjTyp Inj_R_R.
46+
47+
#[global]
48+
Instance Op_eq_Z_R : BinRel (T:=R) (@eq Z) :=
49+
{ TR := @eq R ; TRInj := inj_IZR_iff }.
50+
Add Tify BinRel Op_eq_Z_R.
51+
52+
#[global]
53+
Instance Op_plus_R : BinOp Z.add :=
54+
{ TBOp := Rplus; TBOpInj := plus_IZR }.
55+
Add Tify BinOp Op_plus_R.
56+
57+
#[global]
58+
Instance Op_plus_nat_R : BinOp Nat.add :=
59+
{ TBOp := Rplus; TBOpInj := plus_INR }.
60+
Add Tify BinOp Op_plus_nat_R.
61+
62+
#[global]
63+
Instance Op_Z_of_nat_R : UnOp (T1:= R) (T2:=R) Z.of_nat:=
64+
{ TUOp x := x ; TUOpInj x := eq_sym (INR_IZR_INZ x) }.
65+
Add Tify UnOp Op_Z_of_nat_R.
66+
67+
#[global]
68+
Instance Op_S_R : UnOp (T1:= R) (T2:=R) S :=
69+
{ TUOp := (fun x => Rplus x 1) ; TUOpInj := S_INR }.
70+
Add Tify UnOp Op_S_R.
71+
72+
#[global]
73+
Instance Op_O : CstOp (T:= R) O:=
74+
{ TCst := 0%R ; TCstInj := INR_0 }.
75+
Add Tify CstOp Op_O.
76+
77+
Goal forall (y:nat),
78+
(Z.of_nat y + 1)%Z = Z.of_nat (y + 1).
79+
Proof.
80+
intros.
81+
Fail lra. (* Does not reason over Z *)
82+
Fail (tify Z; change ((INR y + 1)%R = (INR y + R1)%R)).
83+
tify R.
84+
change ((INR y + 1)%R = (INR y + R1)%R).
85+
lra.
86+
Qed.

theories/Strings/PString.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ From Stdlib Require Import ZArith.
1414

1515
#[local] Instance Op_max_length : ZifyClasses.CstOp max_length :=
1616
{ TCst := 16777211%Z ; TCstInj := eq_refl }.
17-
Add Zify CstOp Op_max_length.
17+
Add Tify CstOp Op_max_length.
1818

1919
#[local] Ltac case_if :=
2020
lazymatch goal with

theories/micromega/SatDivMod.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Instance SatDiv : Saturate Z.div :=
2929
PRes := fun _ _ r => 0 <= r;
3030
SatOk := Z_div_nonneg_nonneg
3131
|}.
32-
Add Zify Saturate SatDiv.
32+
Add Tify Saturate SatDiv.
3333

3434
#[global]
3535
Instance SatMod : Saturate Z.modulo :=
@@ -39,4 +39,4 @@ Instance SatMod : Saturate Z.modulo :=
3939
PRes := fun _ _ r => 0 <= r;
4040
SatOk := Z_mod_nonneg_nonneg
4141
|}.
42-
Add Zify Saturate SatMod.
42+
Add Tify Saturate SatMod.

theories/micromega/Tify.v

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
(************************************************************************)
2+
(* * The Rocq Prover / The Rocq Development Team *)
3+
(* v * Copyright INRIA, CNRS and contributors *)
4+
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
5+
(* \VV/ **************************************************************)
6+
(* // * This file is distributed under the terms of the *)
7+
(* * GNU Lesser General Public License Version 2.1 *)
8+
(* * (see LICENSE file for the text of the license) *)
9+
(************************************************************************)
10+
11+
From micromega_plugin Require Export Tify.
12+
13+
Ltac tify T:= intros;
14+
tify_elim_let ;
15+
tify_op T;
16+
(tify_iter_specs) ;
17+
tify_saturate.

theories/micromega/Zify.v

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
(************************************************************************)
1010

1111
From Stdlib Require Import ZifyClasses ZifyInst.
12-
From micromega_plugin Require Export Zify.
12+
From micromega_plugin Require Export Tify.
1313

1414
(** [zify_pre_hook] and [zify_post_hook] are there to be redefined. *)
1515
Ltac zify_pre_hook := idtac.
@@ -30,9 +30,9 @@ Ltac zify_to_euclidean_division_equations :=
3030

3131
Ltac zify := intros;
3232
zify_pre_hook ;
33-
zify_elim_let ;
34-
zify_op ;
35-
(zify_iter_specs) ;
36-
zify_saturate;
33+
tify_elim_let ;
34+
tify_op BinInt.Z;
35+
(tify_iter_specs) ;
36+
tify_saturate;
3737
zify_to_euclidean_division_equations ;
3838
zify_post_hook.

theories/micromega/ZifyBool.v

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,24 @@ From Stdlib Require Import ZifyInst.
1717
Instance Inj_bool_bool : InjTyp bool bool :=
1818
{ inj b := b ; pred b := b = true \/ b = false ;
1919
cstr b := ltac:(destruct b; tauto) }.
20-
Add Zify InjTyp Inj_bool_bool.
20+
Add Tify InjTyp Inj_bool_bool.
2121

2222
(** Boolean operators *)
2323

2424
#[global]
2525
Instance Op_andb : BinOp andb :=
2626
{ TBOp := andb ; TBOpInj _ _ := eq_refl}.
27-
Add Zify BinOp Op_andb.
27+
Add Tify BinOp Op_andb.
2828

2929
#[global]
3030
Instance Op_orb : BinOp orb :=
3131
{ TBOp := orb ; TBOpInj _ _ := eq_refl}.
32-
Add Zify BinOp Op_orb.
32+
Add Tify BinOp Op_orb.
3333

3434
#[global]
3535
Instance Op_implb : BinOp implb :=
3636
{ TBOp := implb; TBOpInj _ _ := eq_refl }.
37-
Add Zify BinOp Op_implb.
37+
Add Tify BinOp Op_implb.
3838

3939
Lemma xorb_eq b1 b2 : xorb b1 b2 = andb (orb b1 b2) (negb (eqb b1 b2)).
4040
Proof.
@@ -44,93 +44,93 @@ Qed.
4444
#[global]
4545
Instance Op_xorb : BinOp xorb :=
4646
{ TBOp x y := andb (orb x y) (negb (eqb x y)); TBOpInj := xorb_eq }.
47-
Add Zify BinOp Op_xorb.
47+
Add Tify BinOp Op_xorb.
4848

4949
#[global]
5050
Instance Op_eqb : BinOp eqb :=
5151
{ TBOp := eqb; TBOpInj _ _ := eq_refl }.
52-
Add Zify BinOp Op_eqb.
52+
Add Tify BinOp Op_eqb.
5353

5454
#[global]
5555
Instance Op_negb : UnOp negb :=
5656
{ TUOp := negb ; TUOpInj _ := eq_refl}.
57-
Add Zify UnOp Op_negb.
57+
Add Tify UnOp Op_negb.
5858

5959
#[global]
6060
Instance Op_eq_bool : BinRel (@eq bool) :=
6161
{TR := @eq bool ; TRInj b1 b2 := iff_refl (b1 = b2) }.
62-
Add Zify BinRel Op_eq_bool.
62+
Add Tify BinRel Op_eq_bool.
6363

6464
#[global]
6565
Instance Op_true : CstOp true :=
6666
{ TCst := true ; TCstInj := eq_refl }.
67-
Add Zify CstOp Op_true.
67+
Add Tify CstOp Op_true.
6868

6969
#[global]
7070
Instance Op_false : CstOp false :=
7171
{ TCst := false ; TCstInj := eq_refl }.
72-
Add Zify CstOp Op_false.
72+
Add Tify CstOp Op_false.
7373

7474
(** Comparison over Z *)
7575

7676
#[global]
7777
Instance Op_Zeqb : BinOp Z.eqb :=
7878
{ TBOp := Z.eqb ; TBOpInj _ _ := eq_refl }.
79-
Add Zify BinOp Op_Zeqb.
79+
Add Tify BinOp Op_Zeqb.
8080

8181
#[global]
8282
Instance Op_Zleb : BinOp Z.leb :=
8383
{ TBOp := Z.leb; TBOpInj _ _ := eq_refl }.
84-
Add Zify BinOp Op_Zleb.
84+
Add Tify BinOp Op_Zleb.
8585

8686
#[global]
8787
Instance Op_Zgeb : BinOp Z.geb :=
8888
{ TBOp := Z.geb; TBOpInj _ _ := eq_refl }.
89-
Add Zify BinOp Op_Zgeb.
89+
Add Tify BinOp Op_Zgeb.
9090

9191
#[global]
9292
Instance Op_Zltb : BinOp Z.ltb :=
9393
{ TBOp := Z.ltb ; TBOpInj _ _ := eq_refl }.
94-
Add Zify BinOp Op_Zltb.
94+
Add Tify BinOp Op_Zltb.
9595

9696
#[global]
9797
Instance Op_Zgtb : BinOp Z.gtb :=
9898
{ TBOp := Z.gtb; TBOpInj _ _ := eq_refl }.
99-
Add Zify BinOp Op_Zgtb.
99+
Add Tify BinOp Op_Zgtb.
100100

101101
(** Comparison over N *)
102102

103103
#[global]
104104
Instance Op_Neqb : BinOp N.eqb :=
105105
{ TBOp := Z.eqb; TBOpInj n m := ltac:(now destruct n, m) }.
106-
Add Zify BinOp Op_Neqb.
106+
Add Tify BinOp Op_Neqb.
107107

108108
#[global]
109109
Instance Op_Nleb : BinOp N.leb :=
110110
{ TBOp := Z.leb; TBOpInj n m := ltac:(now destruct n, m) }.
111-
Add Zify BinOp Op_Nleb.
111+
Add Tify BinOp Op_Nleb.
112112

113113
#[global]
114114
Instance Op_Nltb : BinOp N.ltb :=
115115
{ TBOp := Z.ltb; TBOpInj n m := ltac:(now destruct n, m) }.
116-
Add Zify BinOp Op_Nltb.
116+
Add Tify BinOp Op_Nltb.
117117

118118
(** Comparison over positive *)
119119

120120
#[global]
121121
Instance Op_Pos_eqb : BinOp Pos.eqb :=
122122
{ TBOp := Z.eqb; TBOpInj _ _ := eq_refl }.
123-
Add Zify BinOp Op_Pos_eqb.
123+
Add Tify BinOp Op_Pos_eqb.
124124

125125
#[global]
126126
Instance Op_Pos_leb : BinOp Pos.leb :=
127127
{ TBOp := Z.leb; TBOpInj _ _ := eq_refl }.
128-
Add Zify BinOp Op_Pos_leb.
128+
Add Tify BinOp Op_Pos_leb.
129129

130130
#[global]
131131
Instance Op_Pos_ltb : BinOp Pos.ltb :=
132132
{ TBOp := Z.ltb; TBOpInj _ _ := eq_refl }.
133-
Add Zify BinOp Op_Pos_ltb.
133+
Add Tify BinOp Op_Pos_ltb.
134134

135135
(** Comparison over nat *)
136136

@@ -161,17 +161,17 @@ Qed.
161161
#[global]
162162
Instance Op_nat_eqb : BinOp Nat.eqb :=
163163
{ TBOp := Z.eqb; TBOpInj := Z_of_nat_eqb_iff }.
164-
Add Zify BinOp Op_nat_eqb.
164+
Add Tify BinOp Op_nat_eqb.
165165

166166
#[global]
167167
Instance Op_nat_leb : BinOp Nat.leb :=
168168
{ TBOp := Z.leb; TBOpInj := Z_of_nat_leb_iff }.
169-
Add Zify BinOp Op_nat_leb.
169+
Add Tify BinOp Op_nat_leb.
170170

171171
#[global]
172172
Instance Op_nat_ltb : BinOp Nat.ltb :=
173173
{ TBOp := Z.ltb; TBOpInj := Z_of_nat_ltb_iff }.
174-
Add Zify BinOp Op_nat_ltb.
174+
Add Tify BinOp Op_nat_ltb.
175175

176176
Lemma b2n_b2z x : Z.of_nat (Nat.b2n x) = Z.b2z x.
177177
Proof.
@@ -181,12 +181,12 @@ Qed.
181181
#[global]
182182
Instance Op_b2n : UnOp Nat.b2n :=
183183
{ TUOp := Z.b2z; TUOpInj := b2n_b2z }.
184-
Add Zify UnOp Op_b2n.
184+
Add Tify UnOp Op_b2n.
185185

186186
#[global]
187187
Instance Op_b2z : UnOp Z.b2z :=
188188
{ TUOp := Z.b2z; TUOpInj _ := eq_refl }.
189-
Add Zify UnOp Op_b2z.
189+
Add Tify UnOp Op_b2z.
190190

191191
Lemma b2z_spec b : (b = true /\ Z.b2z b = 1) \/ (b = false /\ Z.b2z b = 0).
192192
Proof.
@@ -197,7 +197,7 @@ Qed.
197197
Instance b2zSpec : UnOpSpec Z.b2z :=
198198
{ UPred b r := (b = true /\ r = 1) \/ (b = false /\ r = 0);
199199
USpec := b2z_spec }.
200-
Add Zify UnOpSpec b2zSpec.
200+
Add Tify UnOpSpec b2zSpec.
201201

202202
Ltac elim_bool_cstr :=
203203
repeat match goal with

theories/micromega/ZifyClasses.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ Proof.
226226
exact (fun H => proj2 IFF H).
227227
Qed.
228228

229-
229+
#[global] Set Warnings "-zify".
230230

231231
(** Registering constants for use by the plugin *)
232232
Register eq_iff as ZifyClasses.eq_iff.

0 commit comments

Comments
 (0)