Skip to content

Commit eea1606

Browse files
authored
Merge pull request #758 from proux01/param2-register
Add derive.param2.register
2 parents cd0e0eb + 71daf5f commit eea1606

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

apps/derive/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,34 @@ Inductive is_nat : nat -> Type :=
120120
| is_S : forall n : nat, is_nat n -> is_nat (S n) *)
121121
```
122122

123+
### `param2`
124+
125+
Binary parametricity translation.
126+
127+
Main command is `derive.param2`
128+
```coq
129+
Elpi derive.param2 nat.
130+
Print nat_R. (*
131+
Inductive nat_R : nat -> nat -> Set :=
132+
| O_R : nat_R 0 0
133+
| S_R : forall H H0 : nat, nat_R H H0 -> nat_R (S H) (S H0).
134+
```
135+
136+
The command `derive.param2.register` can be used to register
137+
handcrafted parametricity rules, so that they can be used by further
138+
`derive.param2` commands.
139+
```coq
140+
Definition fa := 0.
141+
Definition fb := fa.
142+
143+
Fail Elpi derive.param2 fb.
144+
(* derive.param2: No binary parametricity translation for fa *)
145+
146+
Definition fa_R := O_R.
147+
Elpi derive.param2.register fa fa_R.
148+
Elpi derive.param2 fb.
149+
```
150+
123151
### `param1_functor`
124152

125153
```coq

apps/derive/elpi/param2.elpi

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ dispatch (const GR as C) Suffix Clauses :- do! [
193193
C1 = (param Term Term (global (const TermR)) :- !),
194194
coq.elpi.accumulate _ "derive.param2.db" (clause _ (before "param:fail") C1),
195195
C2 = (paramR Term Term (global (const TermR)) :- !),
196-
coq.elpi.accumulate _ "derive.param2.db" (clause _ (before "paramR:fail") C1),
196+
coq.elpi.accumulate _ "derive.param2.db" (clause _ (before "paramR:fail") C2),
197197
coq.elpi.accumulate _ "derive.param2.db" (clause _ _ (param-done C)),
198198
Clauses = [param-done C, C1, C2]
199199
].
@@ -241,6 +241,15 @@ pred main i:gref, i:string, o:list prop.
241241
main T _ Clauses :-
242242
dispatch T "_R" Clauses.
243243

244+
pred main_register i:gref, i:gref.
245+
main_register I R :-
246+
GI = global I, GR = global R,
247+
C1 = (param GI GI GR :- !),
248+
coq.elpi.accumulate _ "derive.param2.db" (clause _ (before "param:fail") C1),
249+
C2 = (paramR GI GI GR :- !),
250+
coq.elpi.accumulate _ "derive.param2.db" (clause _ (before "paramR:fail") C2),
251+
coq.elpi.accumulate _ "derive.param2.db" (clause _ _ (param-done I)).
252+
244253
}
245254

246255
/*

apps/derive/tests/test_param2.v

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,12 @@ Definition size_seq (A : Type) : size_of (list A) := fun _ => 0.
9292
Elpi derive.param2 size_of.
9393

9494
Elpi derive.param2 size_seq. (* Fixed by https://github.com/LPCIC/coq-elpi/pull/754 *)
95+
96+
Definition fa := 0.
97+
Definition fb := fa.
98+
99+
Fail Elpi derive.param2 fb.
100+
101+
Definition fa_R := O_R.
102+
Elpi derive.param2.register fa fa_R.
103+
Elpi derive.param2 fb.

apps/derive/theories/derive/param2.v

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ Elpi Accumulate lp:{{
5454
usage :- coq.error "Usage: derive.param2 <object name>".
5555
}}.
5656

57+
Elpi Command derive.param2.register.
58+
Elpi Accumulate File param2.
59+
Elpi Accumulate Db derive.param2.db.
60+
Elpi Accumulate lp:{{
61+
main [str I, str R] :- !, coq.locate I GRI, coq.locate R GRR,
62+
derive.param2.main_register GRI GRR.
63+
main _ :- usage.
64+
65+
usage :- coq.error "Usage: derive.param2.register <name> <name_R>".
66+
}}.
67+
5768

5869
(* hook into derive *)
5970
Elpi Accumulate derive File param2.

0 commit comments

Comments
 (0)