aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Jesus Gallego Arias2020-03-09 02:22:59 -0400
committerEmilio Jesus Gallego Arias2020-03-25 06:05:40 -0400
commita15e584571a4e153e98a11c93d12759c45ea2dcd (patch)
treeecb28582eef51f801e2440f715715dda1b6bb06b
parentaffb6ac843380e8e134fd89380746f2f6f8c11de (diff)
[proof] [mutual] Factorize universe handling.
Note that we had to introduce a `restrict_ucontext` parameter to be faithful to the implementation in obligations, however this looks like a bug.
-rw-r--r--vernac/comFixpoint.ml18
-rw-r--r--vernac/declareDef.ml19
-rw-r--r--vernac/declareDef.mli21
-rw-r--r--vernac/declareObl.ml12
4 files changed, 36 insertions, 34 deletions
diff --git a/vernac/comFixpoint.ml b/vernac/comFixpoint.ml
index 6e6be4fe3a..0e2d8c1453 100644
--- a/vernac/comFixpoint.ml
+++ b/vernac/comFixpoint.ml
@@ -255,24 +255,20 @@ let declare_fixpoint_interactive_generic ?indexes ~scope ~poly ((fixnames,_fixrs
List.iter (Metasyntax.add_notation_interpretation (Global.env())) ntns;
lemma
-let declare_fixpoint_generic ?indexes ~scope ~poly ((fixnames,fixrs,fixdefs,fixtypes),pl,ctx,fiximps) ntns =
- let possible_indexes, cofix, fix_kind =
+let declare_fixpoint_generic ?indexes ~scope ~poly ((fixnames,fixrs,fixdefs,fixtypes),udecl,uctx,fiximps) ntns =
+ let possible_indexes, fix_kind =
match indexes with
- | Some indexes -> Some indexes, false, Decls.(IsDefinition Fixpoint)
- | None -> None, true, Decls.(IsDefinition CoFixpoint)
+ | Some indexes -> Some indexes, Decls.(IsDefinition Fixpoint)
+ | None -> None, Decls.(IsDefinition CoFixpoint)
in
(* We shortcut the proof process *)
let fixdefs = List.map Option.get fixdefs in
let rec_declaration = prepare_recursive_declaration fixnames fixrs fixtypes fixdefs in
- let vars, fixdecls, indexes = DeclareDef.mutual_make_bodies ~fixnames ~rec_declaration ~possible_indexes in
let fiximps = List.map (fun (n,r,p) -> r) fiximps in
- let evd = Evd.from_ctx ctx in
- let evd = Evd.restrict_universe_context evd vars in
- let univs = Evd.check_univ_decl ~poly evd pl in
- let ubind = Evd.universe_binders evd in
let _ : GlobRef.t list =
- DeclareDef.declare_mutually_recursive ~indexes ~cofix ~scope ~opaque:false ~univs ~kind:fix_kind ~ubind ~ntns
- fixnames fixdecls fixtypes fiximps
+ DeclareDef.declare_mutually_recursive ~scope ~opaque:false ~kind:fix_kind ~poly ~uctx
+ ~possible_indexes ~restrict_ucontext:true ~udecl ~ntns ~rec_declaration
+ fixnames fixtypes fiximps
in
()
diff --git a/vernac/declareDef.ml b/vernac/declareDef.ml
index ba84734360..de7223ae62 100644
--- a/vernac/declareDef.ml
+++ b/vernac/declareDef.ml
@@ -82,14 +82,29 @@ let mutual_make_bodies ~fixnames ~rec_declaration ~possible_indexes =
let vars = Vars.universes_of_constr (List.hd fixdecls) in
vars, fixdecls, None
-let declare_mutually_recursive ~cofix ~indexes ~opaque ~univs ~scope ~kind ~ubind ~ntns fixnames fixdecls fixtypes fiximps =
+let declare_mutually_recursive ~opaque ~scope ~kind ~poly ~uctx ~udecl ~ntns ~rec_declaration ~possible_indexes ~restrict_ucontext fixnames fixtypes fiximps =
+ let vars, fixdecls, indexes =
+ mutual_make_bodies ~fixnames ~rec_declaration ~possible_indexes in
+ let ubind, univs =
+ (* XXX: Note that obligations don't do this, is that a bug? *)
+ if restrict_ucontext
+ then
+ let evd = Evd.from_ctx uctx in
+ let evd = Evd.restrict_universe_context evd vars in
+ let univs = Evd.check_univ_decl ~poly evd udecl in
+ Evd.universe_binders evd, univs
+ else
+ let univs = UState.univ_entry ~poly uctx in
+ UnivNames.empty_binders, univs
+ in
let csts = CList.map4
(fun name body types impargs ->
let ce = Declare.definition_entry ~opaque ~types ~univs body in
declare_definition ~name ~scope ~kind ~ubind ~impargs ce)
fixnames fixdecls fixtypes fiximps
in
- Declare.recursive_message (not cofix) indexes fixnames;
+ let isfix = Option.is_empty possible_indexes in
+ Declare.recursive_message isfix indexes fixnames;
List.iter (Metasyntax.add_notation_interpretation (Global.env())) ntns;
csts
diff --git a/vernac/declareDef.mli b/vernac/declareDef.mli
index 6400fa8ee7..05a38c039d 100644
--- a/vernac/declareDef.mli
+++ b/vernac/declareDef.mli
@@ -59,25 +59,18 @@ val declare_assumption
-> Entries.parameter_entry
-> GlobRef.t
-(* Returns [uvars, bodies, indexes], [possible_indexes] determines if
- we are in a fix / cofix case *)
-val mutual_make_bodies
- : fixnames:'a list
- -> rec_declaration:Constr.rec_declaration
- -> possible_indexes:int list list option
- -> Univ.LSet.t * Constr.constr list * int array option
-
val declare_mutually_recursive
- : cofix:bool
- -> indexes:int array option
- -> opaque:bool
- -> univs:Entries.universes_entry
+ : opaque:bool
-> scope:locality
-> kind:Decls.logical_kind
- -> ubind:UnivNames.universe_binders
+ -> poly:bool
+ -> uctx:UState.t
+ -> udecl:UState.universe_decl
-> ntns:Vernacexpr.decl_notation list
+ -> rec_declaration:Constr.rec_declaration
+ -> possible_indexes:int list list option
+ -> restrict_ucontext:bool
-> Names.variable list
- -> Constr.constr list
-> Constr.types list
-> Impargs.manual_implicits list
-> Names.GlobRef.t list
diff --git a/vernac/declareObl.ml b/vernac/declareObl.ml
index 73566f47f4..95e9a10d03 100644
--- a/vernac/declareObl.ml
+++ b/vernac/declareObl.ml
@@ -450,15 +450,13 @@ let declare_mutual_definition l =
in
(* In the future we will pack all this in a proper record *)
let poly, scope, ntns, opaque, fixnames = first.prg_poly, first.prg_scope, first.prg_notations, first.prg_opaque, first.prg_deps in
- let kind, cofix = if fixkind != IsCoFixpoint then Decls.(IsDefinition Fixpoint, false) else Decls.(IsDefinition CoFixpoint, true) in
- let univs = UState.univ_entry ~poly first.prg_ctx in
- let ubind = UnivNames.empty_binders in
- (* XXX: Note that obligations doesn't call restrict_universe_context *)
- let _vars, fixdecls, indexes = DeclareDef.mutual_make_bodies ~fixnames ~rec_declaration ~possible_indexes in
+ let kind = if fixkind != IsCoFixpoint then Decls.(IsDefinition Fixpoint) else Decls.(IsDefinition CoFixpoint) in
(* Declare the recursive definitions *)
+ let udecl = UState.default_univ_decl in
let kns =
- DeclareDef.declare_mutually_recursive ~cofix ~indexes ~scope ~opaque ~univs ~kind ~ubind ~ntns
- fixnames fixdecls fixtypes fiximps
+ DeclareDef.declare_mutually_recursive ~scope ~opaque ~kind
+ ~udecl ~ntns ~uctx:first.prg_ctx ~rec_declaration ~possible_indexes
+ ~poly ~restrict_ucontext:false fixnames fixtypes fiximps
in
(* Only for the first constant *)
let fix_exn = Hook.get get_fix_exn () in