Skip to content

Commit dc171e0

Browse files
authored
Merge pull request #126 from math-comp/coq-master+coq-elpi-1.7.0+elpi-1.12
Coq master+coq elpi 1.7.0+elpi 1.12
2 parents 6089de4 + 1b62478 commit dc171e0

File tree

14 files changed

+714
-344
lines changed

14 files changed

+714
-344
lines changed

Changelog.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
# Changelog
22

3+
## UNRELEASED
4+
5+
- Use Coq's elaborator to typecheck factories and structures (coercions are
6+
now inserted properly)
7+
- New attribute `#[mathcomp]` for `HB.structure` to synthesize backward
8+
compatibility code for the Mathematical Components library.
9+
When the mixin contains a single axiom its name can be given as
10+
`#[mathcomp(axiom="eq_axiom")]`.
11+
- `HB.instance Definition name : factory T := term` works even if term is not
12+
a known builder. In this case the type (key) is read from the factory
13+
(the type of the definition).
14+
315
## [0.10.0] - 2020-08-08
416

517
- HB now supports parameters (experimental).
618
- Port to Coq-Elpi 1.5.
7-
- NBetter error message in case classes are not defined in the right order.
19+
- Better error message in case classes are not defined in the right order.
820
- Structure operations are not reexported by substructures.
921
- Spurious trivial `TYPE` structure removed from demo1.
1022

README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ Proof. by rewrite example. Qed.
6969

7070
The software is beta-quality, it works but error messages should be improved.
7171

72-
The current version does not handle structures with parameters (for example
73-
modules over a ring), and forces the carrier to be a type (excluding hierarchies
74-
of morphisms).
72+
The current version forces the carrier to be a type, ruling hierarchies of morphisms out.
7573

7674
This [draft paper](https://hal.inria.fr/hal-02478907) describes the language
7775
in full detail.

_CoqProject

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ Coq2020_material/CoqWS_expansion/withoutHB.v
4949

5050
tests/type_of_exported_ops.v
5151
tests/duplicate_structure.v
52+
tests/instance_params_no_type.v
53+
tests/test_CS_db_filtering.v
54+
tests/subtype.v
5255

5356
-R . HB
54-

coq-hierarchy-builder.opam

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ synopsis: "Hierarchy Builder"
1717
description: """
1818
High level commands to declare and evolve a hierarchy based on packed classes.
1919
"""
20+
tags: [ "logpath:HB" ]

default.nix

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
{withEmacs ? false,
2-
nixpkgs ? (fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/e97fdce4e1b945c9ec30d4d90a451f1577f5cf4a.tar.gz),
2+
nixpkgs ? (fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/4aa5466cbc741097218a1c494a7b832a17d1967d.tar.gz),
33
coq-version ? "8.11",
44
print-env ? false
55
}:
66
with import nixpkgs {
7-
overlays = [ (super: self: {
8-
coqPackages = { "8.11" = super.coqPackages_8_11; }."${coq-version}".overrideScope' (self: super: {
9-
# Coq package override example:
10-
coq-elpi = super.coq-elpi.overrideAttrs (old: {
11-
name = "coq8.11-elpi-1.5.0";
12-
src = fetchTarball https://github.com/LPCIC/coq-elpi/archive/v1.5.0.tar.gz;
13-
});
14-
});
15-
coq = self.coqPackages.coq;
16-
})];
7+
# overlays = [ (super: self: {
8+
# coqPackages = { "8.11" = super.coqPackages_8_11; }."${coq-version}".overrideScope' (self: super: {
9+
# # Coq package override example:
10+
# coq-elpi = super.coq-elpi.overrideAttrs (old: {
11+
# name = "coq8.11-elpi-1.5.0";
12+
# src = fetchTarball https://github.com/LPCIC/coq-elpi/archive/v1.5.0.tar.gz;
13+
# });
14+
# });
15+
# coq = self.coqPackages.coq;
16+
# })];
1717
};
1818
let pgEmacs = emacsWithPackages (epkgs: with epkgs.melpaStablePackages; [proof-general]); in
1919
coqPackages.hierarchy-builder.overrideAttrs (old: {

demo1/hierarchy_1.v

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ HB.factory Record Ring_of_TYPE A := {
4747

4848
HB.builders Context A (a : Ring_of_TYPE A).
4949

50-
Definition to_AddComoid_of_TYPE :=
51-
AddComoid_of_TYPE.Build A zero add addrA addrC add0r.
52-
HB.instance A to_AddComoid_of_TYPE.
53-
54-
Definition to_Ring_of_AddComoid :=
55-
Ring_of_AddComoid.Build A _ _ _ addNr mulrA mul1r
56-
mulr1 mulrDl mulrDr.
57-
HB.instance A to_Ring_of_AddComoid.
50+
HB.instance
51+
Definition to_AddComoid_of_TYPE :=
52+
AddComoid_of_TYPE.Build A zero add addrA addrC add0r.
53+
54+
HB.instance
55+
Definition to_Ring_of_AddComoid :=
56+
Ring_of_AddComoid.Build A _ _ _ addNr mulrA mul1r
57+
mulr1 mulrDl mulrDr.
5858

5959
HB.end.
6060

demo1/hierarchy_2.v

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ HB.factory Record AddAG_of_TYPE A := {
3232

3333
HB.builders Context A (a : AddAG_of_TYPE A).
3434

35+
HB.instance
3536
Definition to_AddComoid_of_TYPE :=
3637
AddComoid_of_TYPE.Build A zero add addrA addrC add0r.
37-
HB.instance A to_AddComoid_of_TYPE.
3838

39+
HB.instance
3940
Definition to_AddAG_of_AddComoid :=
4041
AddAG_of_AddComoid.Build A _ addNr.
41-
HB.instance A to_AddAG_of_AddComoid.
4242

4343
HB.end.
4444
HB.structure Definition AddAG := { A of AddAG_of_TYPE A }.
@@ -66,12 +66,12 @@ HB.factory Record Ring_of_AddComoid A of AddComoid A := {
6666

6767
HB.builders Context A (a : Ring_of_AddComoid A).
6868

69+
HB.instance
6970
Definition to_AddAG_of_AddComoid := AddAG_of_AddComoid.Build A _ addNr.
70-
HB.instance A to_AddAG_of_AddComoid.
7171

72+
HB.instance
7273
Definition to_Ring_of_AddAG := Ring_of_AddAG.Build A
7374
_ _ mulrA mul1r mulr1 mulrDl mulrDr.
74-
HB.instance A to_Ring_of_AddAG.
7575

7676
HB.end.
7777

@@ -96,9 +96,9 @@ HB.factory Record Ring_of_TYPE A := {
9696

9797
HB.builders Context A (a : Ring_of_TYPE A).
9898

99+
HB.instance
99100
Definition to_AddComoid_of_TYPE := AddComoid_of_TYPE.Build A
100101
zero add addrA addrC add0r.
101-
HB.instance A to_AddComoid_of_TYPE.
102102

103103
Definition to_Ring_of_AddComoid := Ring_of_AddComoid.Build A
104104
_ _ _ addNr mulrA mul1r mulr1 mulrDl mulrDr.

demo2/stage10.v

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,8 @@ Section ProductTopology.
188188
by split => // [[x1 x2] [[/=Ax1 Bx1] [/=Ax2 Bx2]]].
189189
Qed.
190190

191-
Definition prod_topology :=
192-
TopologicalBase.Build (TopologicalSpace.sort T1 * TopologicalSpace.sort T2)%type _ prod_open_base_covers prod_open_base_setU.
193-
HB.instance ((TopologicalSpace.sort T1 * TopologicalSpace.sort T2)%type) prod_topology.
191+
HB.instance Definition prod_topology :=
192+
TopologicalBase.Build (T1 * T2)%type _ prod_open_base_covers prod_open_base_setU.
194193

195194
End ProductTopology.
196195

@@ -209,12 +208,11 @@ HB.structure Definition TAddAG := { A of Topological A & AddAG_of_TYPE A & JoinT
209208

210209
(* Instance *)
211210

212-
Definition Z_ring_axioms :=
211+
HB.instance Definition Z_ring_axioms :=
213212
Ring_of_TYPE.Build Z 0%Z 1%Z Z.add Z.opp Z.mul
214213
Z.add_assoc Z.add_comm Z.add_0_l Z.add_opp_diag_l
215214
Z.mul_assoc Z.mul_1_l Z.mul_1_r
216215
Z.mul_add_distr_r Z.mul_add_distr_l.
217-
HB.instance Z Z_ring_axioms.
218216

219217
Example test1 (m n : Z) : (m + n) - n + 0 = m.
220218
Proof. by rewrite addrK addr0. Qed.
@@ -225,12 +223,11 @@ Search _ Qc "plus" "opp".
225223
Lemma Qcplus_opp_l q : - q + q = 0.
226224
Proof. by rewrite Qcplus_comm Qcplus_opp_r. Qed.
227225

228-
Definition Qc_ring_axioms :=
226+
HB.instance Definition Qc_ring_axioms :=
229227
Ring_of_TYPE.Build Qc 0%Qc 1%Qc Qcplus Qcopp Qcmult
230228
Qcplus_assoc Qcplus_comm Qcplus_0_l Qcplus_opp_l
231229
Qcmult_assoc Qcmult_1_l Qcmult_1_r
232230
Qcmult_plus_distr_l Qcmult_plus_distr_r.
233-
HB.instance Qc Qc_ring_axioms.
234231

235232
Obligation Tactic := idtac.
236233
Definition Qcopen_base : set (set Qc) :=

demo2/stage11.v

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,8 @@ Section ProductTopology.
193193
by split => // [[x1 x2] [[/=Ax1 Bx1] [/=Ax2 Bx2]]].
194194
Qed.
195195

196-
Definition prod_topology :=
197-
TopologicalBase.Build _ _ prod_open_base_covers prod_open_base_setU.
198-
199-
(* TODO: make elpi insert coercions! *)
200-
HB.instance ((TopologicalSpace.sort T1 * TopologicalSpace.sort T2)%type) prod_topology.
196+
HB.instance Definition prod_topology :=
197+
TopologicalBase.Build (T1 * T2)%type _ prod_open_base_covers prod_open_base_setU.
201198

202199
End ProductTopology.
203200

@@ -241,9 +238,8 @@ Section Uniform_Topology.
241238
uniform_open X -> uniform_open Y -> uniform_open (setI X Y).
242239
Admitted.
243240

244-
Definition uniform_topology :=
245-
Topological.Build _ _ uniform_open_setT (@uniform_open_bigcup) uniform_open_setI.
246-
HB.instance (uniform (UniformSpace_wo_Topology.sort U)) uniform_topology.
241+
HB.instance Definition uniform_topology :=
242+
Topological.Build (uniform U) _ uniform_open_setT (@uniform_open_bigcup) uniform_open_setI.
247243

248244
End Uniform_Topology.
249245

@@ -281,10 +277,9 @@ Section TAddAGUniform.
281277
exists2 B, TAddAG_entourage B & graph_comp B B `<=` A.
282278
Admitted.
283279

284-
Definition TAddAG_uniform :=
285-
Uniform_wo_Topology.Build _ _ filter_TAddAG_entourage TAddAG_entourage_sub
280+
HB.instance Definition TAddAG_uniform :=
281+
Uniform_wo_Topology.Build (tAddAG T) _ filter_TAddAG_entourage TAddAG_entourage_sub
286282
TAddAG_entourage_sym TAddAG_entourage_split.
287-
HB.instance (tAddAG (TAddAG_wo_Uniform.sort T)) TAddAG_uniform.
288283

289284
Lemma TAddAG_uniform_topologyE :
290285
open = (uniform_open _ : set (set (uniform TT))).
@@ -311,15 +306,20 @@ HB.mixin Record Join_TAddAG_Uniform T of Uniform_TAddAG_unjoined T := {
311306
(* TODO: should be subsumed by the type alias TAddAG *)
312307
HB.factory Record TAddAG_Uniform U of TAddAG_wo_Uniform U := { }.
313308

314-
HB.builders Context U of TAddAG_Uniform U.
315-
Definition to_Uniform_wo_Topology : Uniform_wo_Topology U := (TAddAG_uniform _).
316-
HB.instance U to_Uniform_wo_Topology.
309+
HB.builders Context U (a : TAddAG_Uniform U).
310+
311+
HB.instance
312+
Definition to_Uniform_wo_Topology : Uniform_wo_Topology U :=
313+
TAddAG_uniform _.
314+
315+
HB.instance
317316
Definition to_Join_Uniform_Topology : Join_Uniform_Topology U :=
318-
(TAddAG_Join_Uniform_Topology _).
319-
HB.instance U to_Join_Uniform_Topology.
320-
Definition to_Join_TAddAG_Uniform :=
321-
(Join_TAddAG_Uniform.Build U (TAddAG_entourageE _)).
322-
HB.instance U to_Join_TAddAG_Uniform.
317+
TAddAG_Join_Uniform_Topology _.
318+
319+
HB.instance
320+
Definition to_Join_TAddAG_Uniform : Join_TAddAG_Uniform U :=
321+
Join_TAddAG_Uniform.Build U (TAddAG_entourageE _).
322+
323323
HB.end.
324324

325325
HB.structure Definition TAddAG :=
@@ -333,18 +333,17 @@ HB.builders Context T (a : JoinTAddAG T).
333333
Definition to_JoinTAddAG_wo_Uniform : JoinTAddAG_wo_Uniform T := a.
334334
HB.instance T to_JoinTAddAG_wo_Uniform.
335335
(* TODO: Nice error message when factory builders do not depend on the source factory 'a'*)
336-
Definition to_Uniform := let _ := a in TAddAG_Uniform.Build T.
336+
Definition to_Uniform : TAddAG_Uniform T := let _ := a in TAddAG_Uniform.Build T.
337337
HB.instance T to_Uniform.
338338
HB.end.
339339

340340
(* Instance *)
341341

342-
Definition Z_ring_axioms :=
343-
Ring_of_TYPE.Build _ 0%Z 1%Z Z.add Z.opp Z.mul
342+
HB.instance Definition Z_ring_axioms :=
343+
Ring_of_TYPE.Build Z 0%Z 1%Z Z.add Z.opp Z.mul
344344
Z.add_assoc Z.add_comm Z.add_0_l Z.add_opp_diag_l
345345
Z.mul_assoc Z.mul_1_l Z.mul_1_r
346346
Z.mul_add_distr_r Z.mul_add_distr_l.
347-
HB.instance Z Z_ring_axioms.
348347

349348
Example test1 (m n : Z) : (m + n) - n + 0 = m.
350349
Proof. by rewrite addrK addr0. Qed.
@@ -353,12 +352,11 @@ Require Import Qcanon.
353352
Lemma Qcplus_opp_l q : - q + q = 0.
354353
Proof. by rewrite Qcplus_comm Qcplus_opp_r. Qed.
355354

356-
Definition Qc_ring_axioms :=
357-
Ring_of_TYPE.Build _ 0%Qc 1%Qc Qcplus Qcopp Qcmult
355+
HB.instance Definition Qc_ring_axioms :=
356+
Ring_of_TYPE.Build Qc 0%Qc 1%Qc Qcplus Qcopp Qcmult
358357
Qcplus_assoc Qcplus_comm Qcplus_0_l Qcplus_opp_l
359358
Qcmult_assoc Qcmult_1_l Qcmult_1_r
360359
Qcmult_plus_distr_l Qcmult_plus_distr_r.
361-
HB.instance Qc Qc_ring_axioms.
362360

363361
Obligation Tactic := idtac.
364362
Definition Qcopen_base : set (set Qc) :=

0 commit comments

Comments
 (0)