aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/environ.ml174
-rw-r--r--kernel/environ.mli114
-rw-r--r--kernel/inductive.ml2
-rw-r--r--kernel/safe_typing.ml6
4 files changed, 152 insertions, 144 deletions
diff --git a/kernel/environ.ml b/kernel/environ.ml
index 94303bada1..2cff2f7164 100644
--- a/kernel/environ.ml
+++ b/kernel/environ.ml
@@ -49,84 +49,82 @@ let universes env = env.env_universes
let named_context env = env.env_named_context
let rel_context env = env.env_rel_context
-(* Access functions. *)
-
+(* Rel context *)
let lookup_rel n env =
Sign.lookup_rel n env.env_rel_context
-let lookup_named id env =
- Sign.lookup_named id env.env_named_context
-
-let lookup_constant sp env =
- Spmap.find sp env.env_globals.env_constants
-
-let lookup_mind sp env =
- Spmap.find sp env.env_globals.env_inductives
-
-(* Construction functions. *)
+let evaluable_rel n env =
+ try
+ match lookup_rel n env with
+ (_,Some _,_) -> true
+ | _ -> false
+ with Not_found ->
+ false
-(* Rel context *)
let rel_context_app f env =
{ env with
env_rel_context = f env.env_rel_context }
-let reset_context env =
- { env with
- env_named_context = empty_named_context;
- env_rel_context = empty_rel_context }
-
-let reset_with_named_context ctxt env =
- { env with
- env_named_context = ctxt;
- env_rel_context = empty_rel_context }
+let push_rel d = rel_context_app (add_rel_decl d)
+let push_rel_context ctxt x = Sign.fold_rel_context push_rel ctxt ~init:x
+let push_rec_types (lna,typarray,_) env =
+ let ctxt =
+ array_map2_i
+ (fun i na t -> (na, None, type_app (lift i) t)) lna typarray in
+ Array.fold_left (fun e assum -> push_rel assum e) env ctxt
let reset_rel_context env =
{ env with
env_rel_context = empty_rel_context }
-let push_rel d = rel_context_app (add_rel_decl d)
-let push_rel_context ctxt x = fold_rel_context push_rel ctxt ~init:x
-let push_rel_assum (id,ty) = push_rel (id,None,ty)
-
-let push_rec_types (lna,typarray,_) env =
- let ctxt =
- array_map2_i (fun i na t -> (na, type_app (lift i) t)) lna typarray in
- Array.fold_left
- (fun e assum -> push_rel_assum assum e) env ctxt
-
let fold_rel_context f env ~init =
- snd (fold_rel_context
+ snd (Sign.fold_rel_context
(fun d (env,e) -> (push_rel d env, f env d e))
(rel_context env) ~init:(reset_rel_context env,init))
+
(* Named context *)
+let lookup_named id env =
+ Sign.lookup_named id env.env_named_context
+
+(* A local const is evaluable if it is defined and not opaque *)
+let evaluable_named id env =
+ try
+ match lookup_named id env with
+ (_,Some _,_) -> true
+ | _ -> false
+ with Not_found ->
+ false
+
let named_context_app f env =
{ env with
env_named_context = f env.env_named_context }
-let push_named_decl d = named_context_app (add_named_decl d)
-let push_named_assum (id,ty) = push_named_decl (id,None,ty)
-let pop_named_decl id = named_context_app (pop_named_decl id)
+let push_named d = named_context_app (Sign.add_named_decl d)
+let pop_named id = named_context_app (Sign.pop_named_decl id)
+
+let reset_context env =
+ { env with
+ env_named_context = empty_named_context;
+ env_rel_context = empty_rel_context }
+
+let reset_with_named_context ctxt env =
+ { env with
+ env_named_context = ctxt;
+ env_rel_context = empty_rel_context }
let fold_named_context f env ~init =
snd (Sign.fold_named_context
- (fun d (env,e) -> (push_named_decl d env, f env d e))
+ (fun d (env,e) -> (push_named d env, f env d e))
(named_context env) ~init:(reset_context env,init))
let fold_named_context_reverse f ~init env =
Sign.fold_named_context_reverse f ~init:init (named_context env)
-(* Universe constraints *)
-let set_universes g env =
- if env.env_universes == g then env else { env with env_universes = g }
-
-let add_constraints c env =
- if c == Constraint.empty then
- env
- else
- { env with env_universes = merge_constraints c env.env_universes }
-
(* Global constants *)
+let lookup_constant sp env =
+ Spmap.find sp env.env_globals.env_constants
+
let add_constant sp cb env =
let _ =
try
@@ -140,7 +138,35 @@ let add_constant sp cb env =
env_locals = new_locals } in
{ env with env_globals = new_globals }
+(* constant_type gives the type of a constant *)
+let constant_type env sp =
+ let cb = lookup_constant sp env in
+ cb.const_type
+
+type const_evaluation_result = NoBody | Opaque
+
+exception NotEvaluableConst of const_evaluation_result
+
+let constant_value env sp =
+ let cb = lookup_constant sp env in
+ if cb.const_opaque then raise (NotEvaluableConst Opaque);
+ match cb.const_body with
+ | Some body -> body
+ | None -> raise (NotEvaluableConst NoBody)
+
+let constant_opt_value env cst =
+ try Some (constant_value env cst)
+ with NotEvaluableConst _ -> None
+
+(* A global const is evaluable if it is defined and not opaque *)
+let evaluable_constant cst env =
+ try let _ = constant_value env cst in true
+ with Not_found | NotEvaluableConst _ -> false
+
(* Mutual Inductives *)
+let lookup_mind sp env =
+ Spmap.find sp env.env_globals.env_inductives
+
let add_mind sp mib env =
let _ =
try
@@ -154,6 +180,16 @@ let add_mind sp mib env =
env_locals = new_locals } in
{ env with env_globals = new_globals }
+(* Universe constraints *)
+let set_universes g env =
+ if env.env_universes == g then env else { env with env_universes = g }
+
+let add_constraints c env =
+ if c == Constraint.empty then
+ env
+ else
+ { env with env_universes = merge_constraints c env.env_universes }
+
(* Lookup of section variables *)
let lookup_constant_variables c env =
let cmap = lookup_constant c env in
@@ -219,50 +255,6 @@ let keep_hyps env needed =
(* Constants *)
-let opaque_constant env sp = (lookup_constant sp env).const_opaque
-
-(* constant_type gives the type of a constant *)
-let constant_type env sp =
- let cb = lookup_constant sp env in
- cb.const_type
-
-type const_evaluation_result = NoBody | Opaque
-
-exception NotEvaluableConst of const_evaluation_result
-
-let constant_value env sp =
- let cb = lookup_constant sp env in
- if cb.const_opaque then raise (NotEvaluableConst Opaque);
- match cb.const_body with
- | Some body -> body
- | None -> raise (NotEvaluableConst NoBody)
-
-let constant_opt_value env cst =
- try Some (constant_value env cst)
- with NotEvaluableConst _ -> None
-
-(* A global const is evaluable if it is defined and not opaque *)
-let evaluable_constant env cst =
- try let _ = constant_value env cst in true
- with Not_found | NotEvaluableConst _ -> false
-
-(* A local const is evaluable if it is defined and not opaque *)
-let evaluable_named_decl env id =
- try
- match lookup_named id env with
- (_,Some _,_) -> true
- | _ -> false
- with Not_found ->
- false
-
-let evaluable_rel_decl env n =
- try
- match lookup_rel n env with
- (_,Some _,_) -> true
- | _ -> false
- with Not_found ->
- false
-
(*s Modules (i.e. compiled environments). *)
type compiled_env = {
diff --git a/kernel/environ.mli b/kernel/environ.mli
index ecaa4d1082..a7670f46e2 100644
--- a/kernel/environ.mli
+++ b/kernel/environ.mli
@@ -12,7 +12,6 @@
open Names
open Term
open Declarations
-open Univ
open Sign
(*i*)
@@ -21,29 +20,45 @@ open Sign
informations added in environments, and that is why we speak here
of ``unsafe'' environments. *)
+(* Environments have the following components:
+ - a context for de Bruijn variables
+ - a context for section variables and goal assumptions
+ - a context for global constants and axioms
+ - a context for inductive definitions
+ - a set of universe constraints *)
+
type env
val empty_env : env
-val universes : env -> universes
-val rel_context : env -> rel_context
+val universes : env -> Univ.universes
+val rel_context : env -> rel_context
val named_context : env -> named_context
-(* This forgets named and rel contexts *)
-val reset_context : env -> env
-(* This forgets rel context and sets a new named context *)
-val reset_with_named_context : named_context -> env -> env
+(***********************************************************************)
+(*s Context of de Bruijn variables (rel_context) *)
+val push_rel : rel_declaration -> env -> env
+val push_rel_context : rel_context -> env -> env
+val push_rec_types : rec_declaration -> env -> env
-(*s This concerns only local vars referred by names [named_context] *)
-val push_named_decl : named_declaration -> env -> env
-val pop_named_decl : identifier -> env -> env
+(* Looks up in the context of local vars referred by indice ([rel_context]) *)
+(* raises [Not_found] if the index points out of the context *)
+val lookup_rel : int -> env -> rel_declaration
+val evaluable_rel : int -> env -> bool
-(*s This concerns only local vars referred by indice [rel_context] *)
-val push_rel : rel_declaration -> env -> env
-val push_rel_context : rel_context -> env -> env
+(*s Recurrence on [rel_context] *)
+val fold_rel_context :
+ (env -> rel_declaration -> 'a -> 'a) -> env -> init:'a -> 'a
-(*s Push the types of a (co-)fixpoint to [rel_context] *)
-val push_rec_types : rec_declaration -> env -> env
+(***********************************************************************)
+(* Context of variables (section variables and goal assumptions) *)
+val push_named : named_declaration -> env -> env
+val pop_named : identifier -> env -> env
+
+(* Looks up in the context of local vars referred by names ([named_context]) *)
+(* raises [Not_found] if the identifier is not found *)
+val lookup_named : variable -> env -> named_declaration
+val evaluable_named : variable -> env -> bool
(*s Recurrence on [named_context]: older declarations processed first *)
val fold_named_context :
@@ -53,37 +68,20 @@ val fold_named_context :
val fold_named_context_reverse :
('a -> named_declaration -> 'a) -> init:'a -> env -> 'a
-(*s Recurrence on [rel_context] *)
-val fold_rel_context :
- (env -> rel_declaration -> 'a -> 'a) -> env -> init:'a -> 'a
-
-(*s add entries to environment *)
-val set_universes : universes -> env -> env
-val add_constraints : constraints -> env -> env
-val add_constant :
- constant -> constant_body -> env -> env
-val add_mind :
- section_path -> mutual_inductive_body -> env -> env
-
-(*s Lookups in environment *)
-
-(* Looks up in the context of local vars referred by indice ([rel_context]) *)
-(* raises [Not_found] if the index points out of the context *)
-val lookup_rel : int -> env -> rel_declaration
-
-val evaluable_rel_decl : env -> int -> bool
-
-(* Looks up in the context of local vars referred by names ([named_context]) *)
-(* raises [Not_found] if the identifier is not found *)
-val lookup_named : variable -> env -> named_declaration
+(* This forgets named and rel contexts *)
+val reset_context : env -> env
+(* This forgets rel context and sets a new named context *)
+val reset_with_named_context : named_context -> env -> env
-val evaluable_named_decl : env -> variable -> bool
+(***********************************************************************)
+(*s Global constants *)
+(*s Add entries to global environment *)
+val add_constant : constant -> constant_body -> env -> env
(* Looks up in the context of global constant names *)
(* raises [Not_found] if the required path is not found *)
-val lookup_constant : constant -> env -> constant_body
-
-val evaluable_constant : env -> constant -> bool
+val lookup_constant : constant -> env -> constant_body
+val evaluable_constant : constant -> env -> bool
(*s [constant_value env c] raises [NotEvaluableConst Opaque] if
[c] is opaque and [NotEvaluableConst NoBody] if it has no
@@ -91,23 +89,34 @@ val evaluable_constant : env -> constant -> bool
type const_evaluation_result = NoBody | Opaque
exception NotEvaluableConst of const_evaluation_result
-val constant_value : env -> constant -> constr
-val constant_type : env -> constant -> types
+val constant_value : env -> constant -> constr
+val constant_type : env -> constant -> types
val constant_opt_value : env -> constant -> constr option
+(***********************************************************************)
+(*s Inductive types *)
+val add_mind : mutual_inductive -> mutual_inductive_body -> env -> env
+
(* Looks up in the context of global inductive names *)
(* raises [Not_found] if the required path is not found *)
-val lookup_mind : section_path -> env -> mutual_inductive_body
+val lookup_mind : mutual_inductive -> env -> mutual_inductive_body
+(***********************************************************************)
+(*s Universe constraints *)
+val set_universes : Univ.universes -> env -> env
+val add_constraints : Univ.constraints -> env -> env
-(* [global_vars_set c] returns the list of [id]'s occurring as [VAR
- id] in [c] *)
+(***********************************************************************)
+(* Sets of referred section variables *)
+(* [global_vars_set env c] returns the list of [id]'s occurring as
+ [VAR id] in [c] *)
val global_vars_set : env -> constr -> Idset.t
(* the constr must be an atomic construction *)
val vars_of_global : env -> constr -> identifier list
val keep_hyps : env -> Idset.t -> section_context
+(***********************************************************************)
(*s Modules. *)
type compiled_env
@@ -115,12 +124,13 @@ type compiled_env
val export : env -> dir_path -> compiled_env
val import : compiled_env -> env -> env
+(***********************************************************************)
(*s Unsafe judgments. We introduce here the pre-type of judgments, which is
actually only a datatype to store a term with its type and the type of its
type. *)
type unsafe_judgment = {
- uj_val : constr;
+ uj_val : constr;
uj_type : types }
val make_judge : constr -> types -> unsafe_judgment
@@ -128,5 +138,11 @@ val j_val : unsafe_judgment -> constr
val j_type : unsafe_judgment -> types
type unsafe_type_judgment = {
- utj_val : constr;
+ utj_val : constr;
utj_type : sorts }
+
+
+
+
+
+
diff --git a/kernel/inductive.ml b/kernel/inductive.ml
index d98adbb37f..16ff717e90 100644
--- a/kernel/inductive.ml
+++ b/kernel/inductive.ml
@@ -572,7 +572,7 @@ let check_one_fix renv recpos def =
| Const sp as c ->
(try List.for_all (check_rec_call renv) l
with (FixGuardError _ ) as e ->
- if evaluable_constant renv.env sp then
+ if evaluable_constant sp renv.env then
check_rec_call renv
(applist(constant_value renv.env sp, l))
else raise e)
diff --git a/kernel/safe_typing.ml b/kernel/safe_typing.ml
index f96ff1fd99..f284d774d9 100644
--- a/kernel/safe_typing.ml
+++ b/kernel/safe_typing.ml
@@ -54,7 +54,7 @@ let push_rel_or_named_def push (id,b,topt) env =
let env'' = push (id,Some j.uj_val,typ) env' in
(cst,env'')
-let push_named_def = push_rel_or_named_def push_named_decl
+let push_named_def = push_rel_or_named_def push_named
let push_rel_def = push_rel_or_named_def push_rel
let push_rel_or_named_assum push (id,t) env =
@@ -64,7 +64,7 @@ let push_rel_or_named_assum push (id,t) env =
let env'' = push (id,None,t) env' in
(cst,env'')
-let push_named_assum = push_rel_or_named_assum push_named_decl
+let push_named_assum = push_rel_or_named_assum push_named
let push_rel_assum d env = snd (push_rel_or_named_assum push_rel d env)
let push_rels_with_univ vars env =
@@ -126,7 +126,7 @@ let add_constraints = Environ.add_constraints
let rec pop_named_decls idl env =
match idl with
| [] -> env
- | id::l -> pop_named_decls l (Environ.pop_named_decl id env)
+ | id::l -> pop_named_decls l (Environ.pop_named id env)
let export = export
let import = import