aboutsummaryrefslogtreecommitdiffhomepage
path: root/library/declare.ml
diff options
context:
space:
mode:
Diffstat (limited to 'library/declare.ml')
-rw-r--r--library/declare.ml179
1 files changed, 101 insertions, 78 deletions
diff --git a/library/declare.ml b/library/declare.ml
index fc80cfda9..31af6dbbb 100644
--- a/library/declare.ml
+++ b/library/declare.ml
@@ -11,10 +11,12 @@
open Pp
open Util
open Names
+open Libnames
open Nameops
open Term
open Sign
open Declarations
+open Entries
open Inductive
open Indtypes
open Reduction
@@ -91,7 +93,7 @@ let _ = Summary.declare_summary "VARIABLE"
Summary.init_function = (fun () -> vartab := Idmap.empty);
Summary.survive_section = false }
-let cache_variable (sp,(id,(p,d,strength))) =
+let cache_variable ((sp,_),(id,(p,d,strength))) =
(* Constr raisonne sur les noms courts *)
if Idmap.mem id !vartab then
errorlabstrm "cache_variable" (pr_id id ++ str " already exists");
@@ -100,17 +102,13 @@ let cache_variable (sp,(id,(p,d,strength))) =
| SectionLocalDef (c,t) -> Global.push_named_def (id,c,t) in
let (_,bd,ty) = Global.lookup_named id in
let vd = (bd,ty,cst) in
- Nametab.push 0 (restrict_path 0 sp) (VarRef id);
+ Nametab.push (Nametab.Until 1) (restrict_path 0 sp) (VarRef id);
vartab := Idmap.add id (p,vd,strength) !vartab
let (in_variable, out_variable) =
- let od = {
+ declare_object { (default_object "VARIABLE") with
cache_function = cache_variable;
- load_function = (fun _ -> ());
- open_function = (fun _ -> ());
- export_function = (fun x -> Some x) }
- in
- declare_object ("VARIABLE", od)
+ classify_function = (fun _ -> Dispose) }
let declare_variable id obj =
let sp = add_leaf id (in_variable (id,obj)) in
@@ -119,7 +117,7 @@ let declare_variable id obj =
(* Globals: constants and parameters *)
-type constant_declaration = global_declaration * strength
+type constant_declaration = constant_entry * strength
let csttab = ref (Spmap.empty : strength Spmap.t)
@@ -129,90 +127,101 @@ let _ = Summary.declare_summary "CONSTANT"
Summary.init_function = (fun () -> csttab := Spmap.empty);
Summary.survive_section = false }
-let cache_constant (sp,(cdt,stre)) =
+let cache_constant ((sp,kn),(cdt,stre)) =
(if Idmap.mem (basename sp) !vartab then
errorlabstrm "cache_constant"
(pr_id (basename sp) ++ str " already exists"));
(if Nametab.exists_cci sp then
let (_,id) = repr_path sp in
errorlabstrm "cache_constant" (pr_id id ++ str " already exists"));
- Global.add_constant sp cdt;
+ let _,dir,_ = repr_kn kn in
+ let kn' = Global.add_constant dir (basename sp) cdt in
+ if kn' <> kn then
+ anomaly "Kernel and Library names do not match";
(match stre with
| DischargeAt (dp,n) when not (is_dirpath_prefix_of dp (Lib.cwd ())) ->
(* Only qualifications including the sections segment from the current
section to the discharge section is available for Remark & Fact *)
- Nametab.push (n-Lib.sections_depth()) sp (ConstRef sp)
+ Nametab.push (Nametab.Until ((*n-Lib.sections_depth()+*)1)) sp (ConstRef kn)
| (NeverDischarge| DischargeAt _) ->
(* All qualifications of Theorem, Lemma & Definition are visible *)
- Nametab.push 0 sp (ConstRef sp)
+ Nametab.push (Nametab.Until 1) sp (ConstRef kn)
| NotDeclare -> assert false);
csttab := Spmap.add sp stre !csttab
(* At load-time, the segment starting from the module name to the discharge *)
(* section (if Remark or Fact) is needed to access a construction *)
-let load_constant (sp,(ce,stre)) =
+let load_constant i ((sp,kn),(ce,stre)) =
(if Nametab.exists_cci sp then
let (_,id) = repr_path sp in
errorlabstrm "cache_constant" (pr_id id ++ str " already exists"));
csttab := Spmap.add sp stre !csttab;
- Nametab.push (depth_of_strength stre + 1) sp (ConstRef sp)
+ Nametab.push (Nametab.Until ((*depth_of_strength stre + *)i)) sp (ConstRef kn)
(* Opening means making the name without its module qualification available *)
-let open_constant (sp,(_,stre)) =
+let open_constant i ((sp,kn),(_,stre)) =
let n = depth_of_strength stre in
- Nametab.push n (restrict_path n sp) (ConstRef sp)
+ Nametab.push (Nametab.Exactly (i(*+n*))) sp (ConstRef kn)
(* Hack to reduce the size of .vo: we keep only what load/open needs *)
-let dummy_constant_entry = ParameterEntry mkProp
+let dummy_constant_entry = ConstantEntry (ParameterEntry mkProp)
+
+let dummy_constant (ce,stre) = dummy_constant_entry,stre
-let export_constant (ce,stre) = Some (dummy_constant_entry,stre)
+let export_constant cst = Some (dummy_constant cst)
+
+let classify_constant (_,cst) = Substitute (dummy_constant cst)
let (in_constant, out_constant) =
- let od = {
+ declare_object { (default_object "CONSTANT") with
cache_function = cache_constant;
load_function = load_constant;
open_function = open_constant;
+ classify_function = classify_constant;
+ subst_function = ident_subst_function;
export_function = export_constant }
- in
- declare_object ("CONSTANT", od)
let hcons_constant_declaration = function
- | (ConstantEntry ce, stre) ->
- (ConstantEntry
+ | (DefinitionEntry ce, stre) ->
+ (DefinitionEntry
{ const_entry_body = hcons1_constr ce.const_entry_body;
const_entry_type = option_app hcons1_constr ce.const_entry_type;
const_entry_opaque = ce.const_entry_opaque }, stre)
| cd -> cd
-let declare_constant id cd =
+let declare_constant id (cd,stre) =
(* let cd = hcons_constant_declaration cd in *)
- let sp = add_leaf id (in_constant cd) in
- if is_implicit_args() then declare_constant_implicits sp;
- sp
+ let oname = add_leaf id (in_constant (ConstantEntry cd,stre)) in
+ if is_implicit_args() then declare_constant_implicits (snd oname);
+ oname
-let redeclare_constant sp (cd,stre) =
- add_absolutely_named_leaf sp (in_constant (GlobalRecipe cd,stre));
- if is_implicit_args() then declare_constant_implicits sp
+let redeclare_constant id (cd,stre) =
+ let _,kn = add_leaf id (in_constant (GlobalRecipe cd,stre)) in
+ if is_implicit_args() then declare_constant_implicits kn
(* Inductives. *)
-let inductive_names sp mie =
+let inductive_names sp kn mie =
let (dp,_) = repr_path sp in
let names, _ =
List.fold_left
(fun (names, n) ind ->
- let indsp = (sp,n) in
+ let ind_p = (kn,n) in
let names, _ =
List.fold_left
- (fun (names, p) id ->
- let sp = Names.make_path dp id in
- ((sp, ConstructRef (indsp,p)) :: names, p+1))
+ (fun (names, p) l ->
+ let sp =
+ Libnames.make_path dp l
+ in
+ ((sp, ConstructRef (ind_p,p)) :: names, p+1))
(names, 1) ind.mind_entry_consnames in
- let sp = Names.make_path dp ind.mind_entry_typename in
- ((sp, IndRef indsp) :: names, n+1))
+ let sp = Libnames.make_path dp ind.mind_entry_typename
+ in
+ ((sp, IndRef ind_p) :: names, n+1))
([], 0) mie.mind_entry_inds
in names
+
let check_exists_inductive (sp,_) =
(if Idmap.mem (basename sp) !vartab then
errorlabstrm "cache_inductive"
@@ -221,22 +230,27 @@ let check_exists_inductive (sp,_) =
let (_,id) = repr_path sp in
errorlabstrm "cache_inductive" (pr_id id ++ str " already exists")
-let cache_inductive (sp,mie) =
- let names = inductive_names sp mie in
+let cache_inductive ((sp,kn),mie) =
+ let names = inductive_names sp kn mie in
List.iter check_exists_inductive names;
- Global.add_mind sp mie;
+ let _,dir,_ = repr_kn kn in
+ let kn' = Global.add_mind dir (basename sp) mie in
+ if kn' <> kn then
+ anomaly "Kernel and Library names do not match";
+
List.iter
- (fun (sp, ref) -> Nametab.push 0 sp ref)
+ (fun (sp, ref) -> Nametab.push (Nametab.Until 1) sp ref)
names
-let load_inductive (sp,mie) =
- let names = inductive_names sp mie in
+let load_inductive i ((sp,kn),mie) =
+ let names = inductive_names sp kn mie in
List.iter check_exists_inductive names;
- List.iter (fun (sp, ref) -> Nametab.push 1 sp ref) names
+ List.iter (fun (sp, ref) -> Nametab.push (Nametab.Until i) sp ref) names
-let open_inductive (sp,mie) =
- let names = inductive_names sp mie in
- List.iter (fun (sp, ref) -> Nametab.push 0 (restrict_path 0 sp) ref) names
+let open_inductive i ((sp,kn),mie) =
+ let names = inductive_names sp kn mie in
+(* List.iter (fun (sp, ref) -> Nametab.push 0 (restrict_path 0 sp) ref) names*)
+ List.iter (fun (sp, ref) -> Nametab.push (Nametab.Exactly i) sp ref) names
let dummy_one_inductive_entry mie = {
mind_entry_params = [];
@@ -254,28 +268,28 @@ let dummy_inductive_entry m = {
let export_inductive x = Some (dummy_inductive_entry x)
let (in_inductive, out_inductive) =
- let od = {
+ declare_object {(default_object "INDUCTIVE") with
cache_function = cache_inductive;
load_function = load_inductive;
open_function = open_inductive;
+ classify_function = (fun (_,a) -> Substitute (dummy_inductive_entry a));
+ subst_function = ident_subst_function;
export_function = export_inductive }
- in
- declare_object ("INDUCTIVE", od)
let declare_mind mie =
let id = match mie.mind_entry_inds with
| ind::_ -> ind.mind_entry_typename
| [] -> anomaly "cannot declare an empty list of inductives"
in
- let sp = add_leaf id (in_inductive mie) in
- if is_implicit_args() then declare_mib_implicits sp;
- sp
+ let oname = add_leaf id (in_inductive mie) in
+ if is_implicit_args() then declare_mib_implicits (snd oname);
+ oname
(*s Test and access functions. *)
let is_constant sp =
- try let _ = Global.lookup_constant sp in true with Not_found -> false
+ try let _ = Spmap.find sp !csttab in true with Not_found -> false
let constant_strength sp = Spmap.find sp !csttab
@@ -291,7 +305,7 @@ let variable_strength id =
let (_,_,str) = Idmap.find id !vartab in str
let find_section_variable id =
- let (p,_,_) = Idmap.find id !vartab in Names.make_path p id
+ let (p,_,_) = Idmap.find id !vartab in Libnames.make_path p id
(* Global references. *)
@@ -353,12 +367,14 @@ let construct_qualified_reference qid =
let ref = Nametab.locate qid in
constr_of_reference ref
-let construct_reference env id =
- try
- mkVar (let _ = Environ.lookup_named id env in id)
- with Not_found ->
- let ref = Nametab.sp_of_id id in
- constr_of_reference ref
+let construct_reference ctx_opt id =
+ match ctx_opt with
+ | None -> construct_qualified_reference (make_short_qualid id)
+ | Some ctx ->
+ try
+ mkVar (let _ = Sign.lookup_named id ctx in id)
+ with Not_found ->
+ construct_qualified_reference (make_short_qualid id)
let global_qualified_reference qid =
construct_qualified_reference qid
@@ -370,36 +386,42 @@ let global_reference_in_absolute_module dir id =
constr_of_reference (Nametab.locate_in_absolute_module dir id)
let global_reference id =
- construct_reference (Global.env()) id
-
-let dirpath sp = let (p,_) = repr_path sp in p
-
-let dirpath_of_global = function
- | VarRef id -> empty_dirpath
- | ConstRef sp -> dirpath sp
- | IndRef (sp,_) -> dirpath sp
- | ConstructRef ((sp,_),_) -> dirpath sp
+ construct_qualified_reference (make_short_qualid id)
let is_section_variable = function
| VarRef _ -> true
| _ -> false
+(* TODO temporary hack!!! *)
+let rec is_imported_modpath = function
+ | MPfile dp -> dp <> (Lib.module_dp ())
+(* | MPdot (mp,_) -> is_imported_modpath mp *)
+ | _ -> false
+
+let is_imported_ref = function
+ | VarRef _ -> false
+ | ConstRef kn
+ | IndRef (kn,_)
+ | ConstructRef ((kn,_),_)
+(* | ModTypeRef ln *) ->
+ let (mp,_,_) = repr_kn kn in is_imported_modpath mp
+(* | ModRef mp ->
+ is_imported_modpath mp
+*)
let is_global id =
try
- let osp = Nametab.locate (make_short_qualid id) in
- (* Compatibilité V6.3: Les variables de section ne sont pas globales
- not (is_section_variable osp) && *)
- is_dirpath_prefix_of (dirpath_of_global osp) (Lib.cwd())
+ let ref = Nametab.locate (make_short_qualid id) in
+ not (is_imported_ref ref)
with Not_found ->
false
-let strength_of_global = function
- | ConstRef sp -> constant_strength sp
+let strength_of_global ref = match ref with
+ | ConstRef kn -> constant_strength (full_name ref)
| VarRef id -> variable_strength id
| IndRef _ | ConstructRef _ -> NeverDischarge
let library_part ref =
- let sp = Nametab.sp_of_global (Global.env ()) ref in
+ let sp = Nametab.sp_of_global None ref in
let dir,_ = repr_path sp in
match strength_of_global ref with
| DischargeAt (dp,n) ->
@@ -412,3 +434,4 @@ let library_part ref =
(* Theorem/Lemma outside its outer section of definition *)
dir
| NotDeclare -> assert false
+