Skip to content

Commit a130e2b

Browse files
authored
Merge pull request #784 from LPCIC/fix-780
derive: param1 support for is_true and primitive strings
2 parents ab6881e + 5c4b3d0 commit a130e2b

38 files changed

+304
-104
lines changed

.github/workflows/ci.yml

+4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ jobs:
2727
with:
2828
opam_file: 'rocq-elpi.opam'
2929
custom_image: ${{ matrix.image }}
30+
after_script: |
31+
sudo chmod -R a+w .
32+
make all-examples
33+
make all-tests
3034
export: 'OPAMWITHTEST OPAMIGNORECONSTRAINTS OPAMVERBOSE' # space-separated list of variables
3135
env:
3236
OPAMWITHTEST: 'true'

Changelog.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# UNRELEASED
2+
3+
### APPS:
4+
- derive: support for primitive strings in `param1` and `param1_trivial`
5+
- derive: support for `is_true` in `param1_trivial` (based on pre-existing
6+
special support for `is_eq` and `is_bool`)
7+
18
# [2.5.0] 18/2/2025
29

310
Requires Elpi 2.0.7 and Coq 8.20 or Rocq 9.0.

_CoqProject

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
# Theories
1010

11-
-Q theories elpi
12-
-Q _build/default/theories elpi
11+
-R theories elpi
12+
-R _build/default/theories elpi
1313
-Q theories-stdlib elpi_stdlib
1414
-Q _build/default/theories-stdlib elpi_stdlib
1515

apps/cs/tests/setup-project.sh

-1
This file was deleted.

apps/derive/elpi/eqType.elpi

+1-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ translate-record-constructor (field _ ID _ _) _ (error S) :- S is "unsupported r
6363
pred self o:eqb.trm.
6464

6565
pred valid i:eqb.trm, o:diagnostic.
66-
valid (eqb.global X) ok :- global X = {{ PrimInt63.int }}, !.
6766
valid (eqb.global GR) ok :- eqType GR _, !.
6867
valid (eqb.app GR A Args) D :- eqType GR EQT, !, valid-eqType EQT [A|Args] D.
6968
valid T (error S) :- S is "not an eqType: " ^ {std.any->string T}.
@@ -86,7 +85,7 @@ irrelevant? (app [{{ @eq }}, global EqType, A, B]) (eqb.app EQ EQTYPE [A1,B1]) D
8685
term->trm A A1,
8786
term->trm B B1,
8887
].
89-
irrelevant? T R D :- whd1 T T1, coq.say "whd" T T1, irrelevant? T1 R D.
88+
irrelevant? T R D :- whd1 T T1, irrelevant? T1 R D.
9089

9190
pred term->trm i:term, o:eqb.trm, o:diagnostic.
9291
term->trm (global GR) (eqb.global GR) ok :- !.

apps/derive/tests/test_bcongr.v

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Elpi derive.bcongr large.
2929
*)
3030
Elpi derive.bcongr prim_int.
3131
Elpi derive.bcongr prim_float.
32+
Elpi derive.bcongr prim_string.
3233
Elpi derive.bcongr fo_record.
3334
Elpi derive.bcongr pa_record.
3435
Elpi derive.bcongr pr_record.

apps/derive/tests/test_derive_corelib.v

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
(* Some standard data types using different features *)
2-
From elpi.core Require PrimInt63.
3-
From elpi.core Require PrimFloat.
2+
From elpi Require elpi.
3+
From elpi.core Require PrimInt63 PrimFloat PrimString.
44

55
Module Coverage.
66

@@ -70,6 +70,7 @@ Inductive large :=
7070

7171
Inductive prim_int := PI (i : PrimInt63.int).
7272
Inductive prim_float := PF (f : PrimFloat.float).
73+
Inductive prim_string := PS (s : lib:elpi.pstring).
7374

7475
Record fo_record := { f1 : peano; f2 : unit; }.
7576

@@ -91,6 +92,8 @@ Definition is_zero (n:peano) : bool :=
9192

9293
Record sigma_bool := { depn : peano; depeq : is_zero depn = true }.
9394

95+
Record sigma_bool2 := { depn2 : peano; depeq2 : lib:elpi.is_true (is_zero depn2) }.
96+
9497
Fixpoint is_leq (n m:peano) : bool :=
9598
match n, m with
9699
| Zero, _ => true

apps/derive/tests/test_eq.v

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Fail Elpi derive.eq iota.
2323
Elpi derive.eq large.
2424
Elpi derive.eq prim_int.
2525
Elpi derive.eq prim_float.
26+
Elpi derive.eq prim_string.
2627
Elpi derive.eq fo_record.
2728
Elpi derive.eq pa_record.
2829
Elpi derive.eq pr_record.

apps/derive/tests/test_eqK.v

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Elpi derive.eqK large.
3737
*)
3838
Elpi derive.eqK prim_int.
3939
Elpi derive.eqK prim_float.
40+
Elpi derive.eqK prim_string.
4041
Elpi derive.eqK fo_record.
4142
Elpi derive.eqK pa_record.
4243
Elpi derive.eqK pr_record.

apps/derive/tests/test_eqOK.v

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From elpi.apps Require Import derive.eqOK.
1+
From elpi.apps Require Import derive.param1 derive.eqOK.
22

33
From elpi.apps Require Import test_derive_corelib test_eqcorrect test_param1 test_param1_trivial.
44

@@ -31,6 +31,7 @@ Elpi derive.eqOK large.
3131
*)
3232
Elpi derive.eqOK prim_int.
3333
Fail Elpi derive.eqOK prim_float.
34+
Elpi derive.eqOK prim_string.
3435
Elpi derive.eqOK fo_record.
3536
Elpi derive.eqOK pa_record.
3637
Elpi derive.eqOK pr_record.

apps/derive/tests/test_eqType_ast.v

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Fail Elpi derive.eqType.ast iota.
2424
Elpi derive.eqType.ast large.
2525
Elpi derive.eqType.ast prim_int.
2626
Fail Elpi derive.eqType.ast prim_float.
27+
Elpi derive.eqType.ast prim_string.
2728
Elpi derive.eqType.ast fo_record.
2829
Elpi derive.eqType.ast pa_record.
2930
Elpi derive.eqType.ast pr_record.
@@ -32,6 +33,7 @@ Elpi derive.eqType.ast enum.
3233
Elpi derive.eqType.ast bool.
3334
Fail Elpi derive.eqType.ast eq.
3435
Elpi derive.eqType.ast sigma_bool.
36+
Elpi derive.eqType.ast sigma_bool2.
3537
Elpi derive.eqType.ast ord.
3638
Elpi derive.eqType.ast ord2.
3739
Elpi derive.eqType.ast val.

apps/derive/tests/test_eqb.v

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Elpi derive.eqb large.
2626
*)
2727
Elpi derive.eqb prim_int.
2828
Fail Elpi derive.eqb prim_float.
29+
Elpi derive.eqb prim_string.
2930
Elpi derive.eqb fo_record.
3031
Elpi derive.eqb pa_record.
3132
Elpi derive.eqb pr_record.
@@ -34,6 +35,7 @@ Elpi derive.eqb enum.
3435
Fail Elpi derive.eqb eq.
3536
Elpi derive.eqb bool.
3637
Elpi derive.eqb sigma_bool.
38+
Elpi derive.eqb sigma_bool2.
3739
Elpi derive.eqb ord.
3840
Elpi derive.eqb ord2.
3941
Elpi derive.eqb val.

apps/derive/tests/test_eqbOK.v

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Elpi derive.eqbOK large.
3232
*)
3333
Elpi derive.eqbOK prim_int.
3434
Fail Elpi derive.eqbOK prim_float.
35+
Elpi derive.eqbOK prim_string.
3536
Elpi derive.eqbOK fo_record.
3637
Elpi derive.eqbOK pa_record.
3738
Elpi derive.eqbOK pr_record.
@@ -40,6 +41,7 @@ Elpi derive.eqbOK enum.
4041
Fail Elpi derive.eqbOK eq.
4142
Elpi derive.eqbOK bool.
4243
Elpi derive.eqbOK sigma_bool.
44+
Elpi derive.eqbOK sigma_bool2.
4345
Elpi derive.eqbOK ord.
4446
Elpi derive.eqbOK ord2.
4547
Elpi derive.eqbOK val.

apps/derive/tests/test_eqbcorrect.v

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Elpi derive.eqbcorrect large.
3737
*)
3838
Elpi derive.eqbcorrect prim_int.
3939
Fail Elpi derive.eqbcorrect prim_float. (* Can not work, we don't have a syntaxtic test *)
40+
Elpi derive.eqbcorrect prim_string.
4041
Elpi derive.eqbcorrect fo_record.
4142
Elpi derive.eqbcorrect pa_record.
4243
Elpi derive.eqbcorrect pr_record.
@@ -45,6 +46,7 @@ Elpi derive.eqbcorrect enum.
4546
Fail Elpi derive.eqbcorrect eq.
4647
Elpi derive.eqbcorrect bool.
4748
Elpi derive.eqbcorrect sigma_bool.
49+
Elpi derive.eqbcorrect sigma_bool2.
4850
Elpi derive.eqbcorrect ord.
4951
Elpi derive.eqbcorrect ord2.
5052
Elpi derive.eqbcorrect val.

apps/derive/tests/test_eqcorrect.v

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Elpi derive.eqcorrect large.
3232
*)
3333
Elpi derive.eqcorrect prim_int.
3434
Fail Elpi derive.eqcorrect prim_float.
35+
Elpi derive.eqcorrect prim_string.
3536
Elpi derive.eqcorrect fo_record.
3637
Elpi derive.eqcorrect pa_record.
3738
Elpi derive.eqcorrect pr_record.

apps/derive/tests/test_fields.v

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Fail Elpi derive.fields iota.
2424
Elpi derive.fields large.
2525
Elpi derive.fields prim_int.
2626
Fail Elpi derive.fields prim_float.
27+
Elpi derive.fields prim_string.
2728
Elpi derive.fields fo_record.
2829
Elpi derive.fields pa_record.
2930
Elpi derive.fields pr_record.
@@ -32,6 +33,7 @@ Elpi derive.fields enum.
3233
Elpi derive.fields bool.
3334
Fail Elpi derive.fields eq.
3435
Elpi derive.fields sigma_bool.
36+
Elpi derive.fields sigma_bool2.
3537
Elpi derive.fields ord.
3638
Elpi derive.fields ord2.
3739
Elpi derive.fields val.

apps/derive/tests/test_induction.v

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ Elpi derive.induction iota.
2828
Elpi derive.induction large.
2929
Elpi derive.induction prim_int.
3030
Elpi derive.induction prim_float.
31+
Elpi derive.induction prim_string.
3132
Elpi derive.induction fo_record.
3233
Elpi derive.induction pa_record.
3334
Elpi derive.induction pr_record.
3435
Elpi derive.induction dep_record.
3536
Elpi derive.induction enum.
36-
Elpi derive.induction eq.
37-
Elpi derive.induction bool.
3837
Elpi derive.induction sigma_bool.
38+
Elpi derive.induction bool.
39+
Elpi derive.induction sigma_bool2.
3940
Elpi derive.induction ord.
4041
Elpi derive.induction ord2.
4142
Elpi derive.induction val.
@@ -66,5 +67,6 @@ Redirect "tmp" Check pr_record_induction : forall A pr P, (forall x, is_peano x
6667
Redirect "tmp" Check dep_record_induction : forall P, (forall x (px : is_peano x) y, is_vect unit is_unit x px y -> P (Build_dep_record x y)) -> forall x, is_dep_record x -> P x.
6768
Redirect "tmp" Check enum_induction : forall P, (P E1) -> (P E2) -> (P E3) -> forall x, is_enum x -> P x.
6869
Redirect "tmp" Check sigma_bool_induction.
70+
Redirect "tmp" Check sigma_bool2_induction.
6971
Redirect "tmp" Check ord_induction : forall p Pp P, (forall n Pn l, is_eq bool is_bool (is_leq n p) (is_is_leq n Pn p Pp) true is_true l -> P (mkOrd p n l)) -> forall (o : ord p), is_ord p Pp o -> P o.
7072
Redirect "tmp" Check ord2_induction : forall p Pp P, (forall (o1 : ord p), is_ord p Pp o1 -> forall (o2 : ord p), is_ord p Pp o2 -> P (mkOrd2 p o1 o2)) -> forall (o : ord2 p), is_ord2 p Pp o -> P o.

apps/derive/tests/test_isK.v

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Elpi derive.isK iota.
2424
Elpi derive.isK large.
2525
Elpi derive.isK prim_int.
2626
Elpi derive.isK prim_float.
27+
Elpi derive.isK prim_string.
2728
Elpi derive.isK fo_record.
2829
Elpi derive.isK pa_record.
2930
Elpi derive.isK pr_record.

apps/derive/tests/test_lens.v

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ intros; unfold _pf3.
2424
match goal with
2525
| |- x = {| over := fun f r => {| pf3 := f (_ r); pf4 := _ r |} ;
2626
view := _ |}
27-
=> idtac "ok"
27+
=> idtac
2828
| |- _ => fail "not primitive"
2929
end.
3030
Abort.

apps/derive/tests/test_map.v

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Elpi derive.map enum.
3333
Fail Elpi derive.map eq.
3434
Elpi derive.map bool.
3535
Elpi derive.map sigma_bool.
36+
Elpi derive.map sigma_bool2.
3637
Fail Elpi derive.map ord.
3738
Elpi derive.map val.
3839
End Coverage.

apps/derive/tests/test_param1.v

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,19 @@ Elpi derive.param1 iota.
2525
Elpi derive.param1 large.
2626
Elpi derive.param1 prim_int.
2727
Elpi derive.param1 prim_float.
28+
Elpi derive.param1 prim_string.
2829
Elpi derive.param1 fo_record.
2930
Elpi derive.param1 pa_record.
3031
Elpi derive.param1 pr_record.
3132
Elpi derive.param1 dep_record.
3233
Elpi derive.param1 enum.
3334
(*
3435
Elpi derive.param1 eq. (* done in param1.v *)
36+
Elpi derive.param1 bool. (* done in param1.v *)
3537
*)
36-
Elpi derive.param1 bool.
3738
Elpi derive.param1 is_zero.
3839
Elpi derive.param1 sigma_bool.
40+
Elpi derive.param1 sigma_bool2.
3941
Elpi derive.param1 is_leq.
4042
Elpi derive.param1 ord.
4143
Elpi derive.param1 ord2.
@@ -101,15 +103,13 @@ Fixpoint vec_length (A : Type) n (v : vec A n) :=
101103
Elpi derive.param1 vec_length.
102104
Elpi derive.param1 list.
103105
Elpi derive.param1 is_list.
104-
Elpi derive.param1 eq.
105106

106107
Fixpoint plus' m n := match n with 0 => m | S n => S (plus' m n) end.
107108
Elpi derive.param1 plus'.
108109
Elpi derive.param1 plus.
109110
Elpi derive.param1 prod.
110111
Elpi derive.param1 fst.
111112
Elpi derive.param1 snd.
112-
Elpi derive.param1 bool.
113113
Elpi derive.param1 Nat.divmod.
114114
Elpi derive.param1 Nat.div.
115115

apps/derive/tests/test_param1_congr.v

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Elpi derive.param1.congr is_large. (* slow *)
2929
*)
3030
Elpi derive.param1.congr is_prim_int.
3131
Elpi derive.param1.congr is_prim_float.
32+
Elpi derive.param1.congr is_prim_string.
3233
Elpi derive.param1.congr is_fo_record.
3334
Elpi derive.param1.congr is_pa_record.
3435
Elpi derive.param1.congr is_pr_record.
@@ -37,6 +38,7 @@ Elpi derive.param1.congr is_enum.
3738
Elpi derive.param1.congr is_bool.
3839
Elpi derive.param1.congr is_eq.
3940
Elpi derive.param1.congr is_sigma_bool.
41+
Elpi derive.param1.congr is_sigma_bool2.
4042
Elpi derive.param1.congr is_ord.
4143
Elpi derive.param1.congr is_val.
4244
End Coverage.

apps/derive/tests/test_param1_functor.v

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
From elpi.apps Require Import derive.param1_functor.
1+
From elpi.apps Require Import derive.param1 derive.param1_functor.
22

33
From elpi.apps.derive.tests Require Import test_derive_corelib test_param1.
44
Import test_derive_corelib.Coverage.
@@ -26,14 +26,16 @@ Elpi derive.param1.functor is_iota.
2626
Elpi derive.param1.functor is_large.
2727
Elpi derive.param1.functor is_prim_int.
2828
Elpi derive.param1.functor is_prim_float.
29+
Elpi derive.param1.functor is_prim_string.
2930
Elpi derive.param1.functor is_fo_record.
3031
Elpi derive.param1.functor is_pa_record.
3132
Elpi derive.param1.functor is_pr_record.
3233
Elpi derive.param1.functor is_dep_record.
3334
Elpi derive.param1.functor is_enum.
34-
Fail Elpi derive.param1.functor param1.is_eq.
35-
Elpi derive.param1.functor is_bool.
35+
Fail Elpi derive.param1.functor derive.param1.exports.is_eq.
36+
Elpi derive.param1.functor derive.param1.exports.is_bool.
3637
Elpi derive.param1.functor is_sigma_bool.
38+
Elpi derive.param1.functor is_sigma_bool2.
3739
Elpi derive.param1.functor is_ord.
3840
Elpi derive.param1.functor is_ord2.
3941
Elpi derive.param1.functor is_val.

apps/derive/tests/test_param1_trivial.v

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Fail Elpi derive.param1.trivial is_iota.
2828
Elpi derive.param1.trivial is_large.
2929
Elpi derive.param1.trivial is_prim_int.
3030
Elpi derive.param1.trivial is_prim_float.
31+
Elpi derive.param1.trivial is_prim_string.
3132
Elpi derive.param1.trivial is_fo_record.
3233
Elpi derive.param1.trivial is_pa_record.
3334
Elpi derive.param1.trivial is_pr_record.
@@ -38,6 +39,7 @@ Elpi derive.param1.trivial is_bool.
3839
Elpi derive.param1.trivial is_eq. (* ad-hoc *)
3940
*)
4041
Elpi derive.param1.trivial is_sigma_bool.
42+
Elpi derive.param1.trivial is_sigma_bool2.
4143
Elpi derive.param1.trivial is_ord.
4244
Elpi derive.param1.trivial is_ord2.
4345
Elpi derive.param1.trivial is_val.

apps/derive/tests/test_projK.v

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Elpi derive.projK iota.
2424
Elpi derive.projK large.
2525
Elpi derive.projK prim_int.
2626
Elpi derive.projK prim_float.
27+
Elpi derive.projK prim_string.
2728
Elpi derive.projK fo_record.
2829
Elpi derive.projK pa_record.
2930
Elpi derive.projK pr_record.

apps/derive/tests/test_tag.v

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Elpi derive.tag iota.
2525
Elpi derive.tag large.
2626
Elpi derive.tag prim_int.
2727
Elpi derive.tag prim_float.
28+
Elpi derive.tag prim_string.
2829
Elpi derive.tag fo_record.
2930
Elpi derive.tag pa_record.
3031
Elpi derive.tag pr_record.
@@ -33,6 +34,7 @@ Elpi derive.tag enum.
3334
Elpi derive.tag eq.
3435
Elpi derive.tag bool.
3536
Elpi derive.tag sigma_bool.
37+
Elpi derive.tag sigma_bool2.
3638
Elpi derive.tag ord.
3739
Elpi derive.tag ord2.
3840
Elpi derive.tag val.

apps/derive/theories/derive/eq.v

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ From elpi.apps.derive.elpi Extra Dependency "derive_synterp_hook.elpi" as derive
99
From elpi Require Import elpi.
1010
From elpi.apps Require Import derive.
1111

12-
From elpi.core Require Import PrimInt63 PrimFloat.
12+
From elpi.core Require Import PrimInt63 PrimFloat PrimString.
1313

1414
Register Coq.Numbers.Cyclic.Int63.PrimInt63.eqb as elpi.derive.eq_unit63.
1515
Register Coq.Floats.PrimFloat.eqb as elpi.derive.eq_float64.
@@ -20,6 +20,7 @@ Elpi Db derive.eq.db lp:{{
2020
type eq-db term -> term -> term -> prop.
2121
eq-db {{ lib:num.int63.type }} {{ lib:num.int63.type }} {{ lib:elpi.derive.eq_unit63 }} :- !.
2222
eq-db {{ lib:num.float.type }} {{ lib:num.float.type }} {{ lib:elpi.derive.eq_float64 }} :- !.
23+
eq-db {{ lib:elpi.pstring }} {{ lib:elpi.pstring }} {{ lib:elpi.pstring_eqb }} :- !.
2324

2425
% quick access
2526
type eq-for inductive -> constant -> prop.

0 commit comments

Comments
 (0)