diff options
| author | Emilio Jesus Gallego Arias | 2020-03-09 02:09:03 -0400 |
|---|---|---|
| committer | Emilio Jesus Gallego Arias | 2020-03-25 06:04:29 -0400 |
| commit | affb6ac843380e8e134fd89380746f2f6f8c11de (patch) | |
| tree | f66eb970c747c1f03a3c5fec6c7c2aaeb1d0a0b8 | |
| parent | 09d6197bd11ed4a323b335118ae749d7caefeb55 (diff) | |
[proof] [mutual] Factorize mutual body construction.
| -rw-r--r-- | vernac/comFixpoint.ml | 21 | ||||
| -rw-r--r-- | vernac/declareDef.ml | 13 | ||||
| -rw-r--r-- | vernac/declareDef.mli | 8 | ||||
| -rw-r--r-- | vernac/declareObl.ml | 33 |
4 files changed, 37 insertions, 38 deletions
diff --git a/vernac/comFixpoint.ml b/vernac/comFixpoint.ml index ced9656218..6e6be4fe3a 100644 --- a/vernac/comFixpoint.ml +++ b/vernac/comFixpoint.ml @@ -256,26 +256,15 @@ let declare_fixpoint_interactive_generic ?indexes ~scope ~poly ((fixnames,_fixrs lemma let declare_fixpoint_generic ?indexes ~scope ~poly ((fixnames,fixrs,fixdefs,fixtypes),pl,ctx,fiximps) ntns = - let indexes, cofix, fix_kind = + let possible_indexes, cofix, fix_kind = match indexes with - | Some indexes -> indexes, false, Decls.(IsDefinition Fixpoint) - | None -> [], true, Decls.(IsDefinition CoFixpoint) + | Some indexes -> Some indexes, false, Decls.(IsDefinition Fixpoint) + | None -> None, true, Decls.(IsDefinition CoFixpoint) in (* We shortcut the proof process *) let fixdefs = List.map Option.get fixdefs in - let fixdecls = prepare_recursive_declaration fixnames fixrs fixtypes fixdefs in - let vars, fixdecls, indexes = - if not cofix then - let env = Global.env() in - let indexes = Pretyping.search_guard env indexes fixdecls in - let vars = Vars.universes_of_constr (Constr.mkFix ((indexes,0),fixdecls)) in - let fixdecls = List.map_i (fun i _ -> Constr.mkFix ((indexes,i),fixdecls)) 0 fixnames in - vars, fixdecls, Some indexes - else (* cofix *) - let fixdecls = List.map_i (fun i _ -> Constr.mkCoFix (i,fixdecls)) 0 fixnames in - let vars = Vars.universes_of_constr (List.hd fixdecls) in - vars, fixdecls, None - 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 diff --git a/vernac/declareDef.ml b/vernac/declareDef.ml index b3bcf58b4a..ba84734360 100644 --- a/vernac/declareDef.ml +++ b/vernac/declareDef.ml @@ -69,6 +69,19 @@ let declare_definition ~name ~scope ~kind ?hook_data ~ubind ~impargs ce = end; dref +let mutual_make_bodies ~fixnames ~rec_declaration ~possible_indexes = + match possible_indexes with + | Some possible_indexes -> + let env = Global.env() in + let indexes = Pretyping.search_guard env possible_indexes rec_declaration in + let vars = Vars.universes_of_constr (Constr.mkFix ((indexes,0),rec_declaration)) in + let fixdecls = CList.map_i (fun i _ -> Constr.mkFix ((indexes,i),rec_declaration)) 0 fixnames in + vars, fixdecls, Some indexes + | None -> + let fixdecls = CList.map_i (fun i _ -> Constr.mkCoFix (i,rec_declaration)) 0 fixnames in + 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 csts = CList.map4 (fun name body types impargs -> diff --git a/vernac/declareDef.mli b/vernac/declareDef.mli index 971f924c6c..6400fa8ee7 100644 --- a/vernac/declareDef.mli +++ b/vernac/declareDef.mli @@ -59,6 +59,14 @@ 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 diff --git a/vernac/declareObl.ml b/vernac/declareObl.ml index e530a6e494..73566f47f4 100644 --- a/vernac/declareObl.ml +++ b/vernac/declareObl.ml @@ -441,38 +441,27 @@ let declare_mutual_definition l = let arrrec, recvec = (Array.of_list fixtypes, Array.of_list fixdefs) in let rvec = Array.of_list fixrs in let namevec = Array.of_list (List.map (fun x -> Name x.prg_name) l) in - let fixdecls = (Array.map2 make_annot namevec rvec, arrrec, recvec) in - let fixnames = first.prg_deps in - let opaque = first.prg_opaque in - let indexes, fixdecls = + let rec_declaration = (Array.map2 make_annot namevec rvec, arrrec, recvec) in + let possible_indexes = match fixkind with | IsFixpoint wfl -> - let possible_indexes = - List.map3 compute_possible_guardness_evidences wfl fixdefs fixtypes - in - let indexes = - Pretyping.search_guard (Global.env ()) possible_indexes fixdecls - in - ( Some indexes - , List.map_i (fun i _ -> mkFix ((indexes, i), fixdecls)) 0 l - ) - | IsCoFixpoint -> - (None, List.map_i (fun i _ -> mkCoFix (i, fixdecls)) 0 l) + Some (List.map3 compute_possible_guardness_evidences wfl fixdefs fixtypes) + | IsCoFixpoint -> None in - (* Declare the recursive definitions *) - let poly = first.prg_poly in - let scope = first.prg_scope 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 fix_exn = Hook.get get_fix_exn () in - let kind = Decls.IsDefinition (if fixkind != IsCoFixpoint then Decls.Fixpoint else Decls.CoFixpoint) in let ubind = UnivNames.empty_binders in - let cofix = fixkind = IsCoFixpoint in - let ntns = first.prg_notations 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 + (* Declare the recursive definitions *) let kns = DeclareDef.declare_mutually_recursive ~cofix ~indexes ~scope ~opaque ~univs ~kind ~ubind ~ntns fixnames fixdecls fixtypes fiximps in (* Only for the first constant *) + let fix_exn = Hook.get get_fix_exn () in let dref = List.hd kns in DeclareDef.Hook.(call ?hook:first.prg_hook ~fix_exn { S.uctx = first.prg_ctx; obls; scope; dref }); List.iter progmap_remove l; |
