diff options
| author | Enrico Tassi | 2014-02-21 18:24:10 +0100 |
|---|---|---|
| committer | Enrico Tassi | 2014-02-26 14:53:08 +0100 |
| commit | f7338257584ba69e7e815c7ef9ac0d24f0dec36c (patch) | |
| tree | 84de35428de2923e297c73bdd66ec65c2f42aa3b /kernel/lazyconstr.mli | |
| parent | 9232c8618eebdcd223fe8eddaa5f46fab0bce95e (diff) | |
New compilation mode -vi2vo
To obtain a.vo one can now:
1) coqtop -quick -compile a
2) coqtop -vi2vo a.vi
To make that possible the .vo structure has been complicated. It is now
made of 5 segments.
| vo | vi | vi2vo | contents
--------------+------+-----+-------+------------------------------------
lib | Yes | Yes | Yes | libstack (modules, notations,...)
opauqe_univs | No | Yes | Yes | constraints coming from opaque proofs
discharge | No | Yes | No | data needed to close sections
tasks | No | Yes | No | STM tasks to produce proof terms
opaque_proofs | Yes | Yes | Yes | proof terms
--------------+------+-----+-------+------------------------------------
This means one can load only the strictly necessay parts. Usually one
does not load the tasks segment of a .vi nor the opaque_proof segment of
a .vo, unless one is turning a .vi into a .vo, in which case he load
all the segments.
Optional segments are marshalled as None. But for lib, all segments
are Array.t of:
| type
--------------+---------------------------------------------------------
lib | a list of Libobject.obj (n'importe quoi)
opauqe_univs | Univ.consraints Future.computation
discharge | what Cooking.cook_constr needs
tasks | Stm.tasks (a task is system_state * vernacexpr list)
opaque_proofs | Term.constr Future.computation
--------------+------+-----+-------+------------------------------------
Invariant: all Future.computation in a vo file (obtained by a vi2vo
compilation or not) have been terminated with Future.join (or
Future.sink). This means they are values (inside a box).
This invariant does not hold for vi files. E.g. opauqe_proofs can be
dangling Future.computation (i.e. NotHere exception). The vi2vo
compilation step will replace them by true values.
Rationale for opaque_univs: in the vi2vo transformation we want to reuse
the lib segment. Hence the missing pieces have to be put on the side,
not inside. Opaque proof terms are already in a separte segment.
Universe constraints are not, hence the new opauqe_univs segment. Such
segment, if present in a .vo file, is always loaded, and
Declare.open_constant will add to the environment the constraints stored
there. For regular constants this is not necessay since the constraints
are already in their enclosing module (and also in the constant_body).
With vi2vo the constraints coming from the proof are not in the
constant_body (hence not in the enclosing module) but there and are
added to the environment explicitly by Declare.open_constant.
Rationale for discharge: vi2vo produces a proof term in its original
context (in the middle of a section). Then it has to discharge the
object. This segment contains the data that is needed in order to do
so. It is morally the input that Lib.close_section passes to Cooking
(via the insane rewinding of libstack, GlobalRecipe, etc chain).
Checksums: the checksum of .vi and a .vo obtain from it is the same.
This means that if if b.vo has been compiled using a.vi, and then
a.vi is compiled into a.vo, Require Import b works (and recursively
loads a.vo).
Diffstat (limited to 'kernel/lazyconstr.mli')
| -rw-r--r-- | kernel/lazyconstr.mli | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/kernel/lazyconstr.mli b/kernel/lazyconstr.mli index f6188f5364..db4d8fb726 100644 --- a/kernel/lazyconstr.mli +++ b/kernel/lazyconstr.mli @@ -10,6 +10,9 @@ open Names open Term open Mod_subst +type work_list = Id.t array Cmap.t * Id.t array Mindmap.t +type cooking_info = { modlist : work_list; abstract : Context.named_context } + (** [constr_substituted] are [constr] with possibly pending substitutions of kernel names. *) @@ -25,9 +28,10 @@ val subst_constr_subst : this might trigger the read of some extra parts of .vo files *) type lazy_constr +type proofterm = (constr * Univ.constraints) Future.computation (** From a [constr] to some (immediate) [lazy_constr]. *) -val opaque_from_val : constr -> lazy_constr +val opaque_from_val : proofterm -> lazy_constr (** Turn an immediate [lazy_constr] into an indirect one, thanks to the indirect opaque creator configured below. *) @@ -36,10 +40,22 @@ val turn_indirect : lazy_constr -> lazy_constr (** From a [lazy_constr] back to a [constr]. This might use the indirect opaque accessor configured below. *) val force_opaque : lazy_constr -> constr +val force_opaque_w_constraints : lazy_constr -> constr * Univ.constraints +val get_opaque_future_constraints : + lazy_constr -> Univ.constraints Future.computation option +val get_opaque_futures : + lazy_constr -> + Term.constr Future.computation * Univ.constraints Future.computation val subst_lazy_constr : substitution -> lazy_constr -> lazy_constr -val hcons_lazy_constr : lazy_constr -> lazy_constr +(* val hcons_lazy_constr : lazy_constr -> lazy_constr *) + +(* Used to discharge the proof term. *) +val iter_direct_lazy_constr : (constr -> unit) -> lazy_constr -> lazy_constr +val discharge_direct_lazy_constr : work_list -> Context.named_context -> (constr -> constr) -> lazy_constr -> lazy_constr + +val join_lazy_constr : lazy_constr -> unit (** When stored indirectly, opaque terms are indexed by their library dirpath and an integer index. The following two functions activate @@ -48,6 +64,12 @@ val hcons_lazy_constr : lazy_constr -> lazy_constr any indirect link, and default accessor always raises an error. *) -val set_indirect_opaque_creator : (constr -> (DirPath.t * int) option) -> unit -val set_indirect_opaque_accessor : (DirPath.t -> int -> constr) -> unit -val reset_indirect_opaque_creator : unit -> unit +val set_indirect_creator : + (cooking_info list * proofterm -> (DirPath.t * int) option) -> unit +val set_indirect_opaque_accessor : + (DirPath.t -> int -> Term.constr Future.computation) -> unit +val set_indirect_univ_accessor : + (DirPath.t -> int -> Univ.constraints Future.computation option) -> unit +val set_join_indirect_local_opaque : (DirPath.t -> int -> unit) -> unit +val set_join_indirect_local_univ : (DirPath.t -> int -> unit) -> unit +val reset_indirect_creator : unit -> unit |
