aboutsummaryrefslogtreecommitdiff
path: root/kernel/environ.ml
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/environ.ml')
-rw-r--r--kernel/environ.ml159
1 files changed, 132 insertions, 27 deletions
diff --git a/kernel/environ.ml b/kernel/environ.ml
index 73a8c6487e..217a7f989b 100644
--- a/kernel/environ.ml
+++ b/kernel/environ.ml
@@ -26,13 +26,21 @@ type globals = {
env_locals : (global * section_path) list;
env_imports : import list }
+type context = {
+ env_var_context : var_context;
+ env_rel_context : rel_context }
+
type env = {
env_context : context;
env_globals : globals;
env_universes : universes }
+let empty_context = {
+ env_var_context = empty_var_context;
+ env_rel_context = empty_rel_context }
+
let empty_env = {
- env_context = ENVIRON (nil_sign,nil_dbsign);
+ env_context = empty_context;
env_globals = {
env_constants = Spmap.empty;
env_inductives = Spmap.empty;
@@ -43,29 +51,93 @@ let empty_env = {
let universes env = env.env_universes
let context env = env.env_context
-let var_context env = let (ENVIRON(g,_)) = env.env_context in g
+let var_context env = env.env_context.env_var_context
+let rel_context env = env.env_context.env_rel_context
(* Construction functions. *)
-let push_var idvar env =
- { env with env_context = add_glob idvar env.env_context }
-
-let change_hyps f env =
- let (ENVIRON(g,r)) = env.env_context in
- { env with env_context = ENVIRON (f g, r) }
-
-(* == functions to deal with names in contexts (previously in cases.ml) == *)
-
-(* If cur=(Rel j) then
- * if env = ENVIRON(sign,[na_h:Th]...[na_j:Tj]...[na_1:T1])
- * then it yields ENVIRON(sign,[na_h:Th]...[Name id:Tj]...[na_1:T1])
- *)
-let change_name_rel env j id =
- { env with env_context = change_name_env (context env) j id }
-(****)
-
-let push_rel idrel env =
- { env with env_context = add_rel idrel env.env_context }
+let map_context f env =
+ let context = env.env_context in
+ { env with
+ env_context = {
+ context with
+ env_var_context = map_var_context f context.env_var_context ;
+ env_rel_context = map_rel_context f context.env_rel_context } }
+
+let var_context_app f env =
+ { env with
+ env_context = { env.env_context with
+ env_var_context = f env.env_context.env_var_context } }
+
+let change_hyps = var_context_app
+
+let push_var d = var_context_app (add_var d)
+let push_var_def def = var_context_app (add_var_def def)
+let push_var_decl decl = var_context_app (add_var_decl decl)
+let pop_var id = var_context_app (pop_var id)
+
+let rel_context_app f env =
+ { env with
+ env_context = { env.env_context with
+ env_rel_context = f env.env_context.env_rel_context } }
+
+let reset_context env =
+ { env with
+ env_context = { env_var_context = empty_var_context;
+ env_rel_context = empty_rel_context} }
+
+let fold_var_context f env a =
+ snd (Sign.fold_var_context
+ (fun d (env,e) -> (push_var d env, f env d e))
+ (var_context env) (reset_context env,a))
+
+let process_var_context f env =
+ Sign.fold_var_context
+ (fun d env -> f env d) (var_context env) (reset_context env)
+
+let process_var_context_both_sides f env =
+ fold_var_context_both_sides f (var_context env) (reset_context env)
+
+let push_rel d = rel_context_app (add_rel d)
+let push_rel_def def = rel_context_app (add_rel_def def)
+let push_rel_decl decl = rel_context_app (add_rel_decl decl)
+let push_rels ctxt = rel_context_app (concat_rel_context ctxt)
+
+let push_rels_to_vars env =
+ let sign0 = env.env_context.env_var_context in
+ let (subst,_,sign) =
+ List.fold_right
+ (fun (na,c,t) (subst,avoid,sign) ->
+ let na = if na = Anonymous then Name(id_of_string"_") else na in
+ let id = next_name_away na avoid in
+ ((VAR id)::subst,id::avoid,
+ add_var (id,option_app (substl subst) c,typed_app (substl subst) t)
+ sign))
+ env.env_context.env_rel_context ([],ids_of_var_context sign0,sign0)
+ in subst, (var_context_app (fun _ -> sign) env)
+
+let reset_rel_context env =
+ { env with
+ env_context = { env_var_context = env.env_context.env_var_context;
+ env_rel_context = empty_rel_context} }
+
+let fold_rel_context f env a =
+ snd (List.fold_right
+ (fun d (env,e) -> (push_rel d env, f env d e))
+ (rel_context env) (reset_rel_context env,a))
+
+let process_rel_context f env =
+ List.fold_right (fun d env -> f env d)
+ (rel_context env) (reset_rel_context env)
+
+let instantiate_vars = instantiate_sign
+
+let ids_of_context env =
+ (ids_of_rel_context env.env_context.env_rel_context)
+ @ (ids_of_var_context env.env_context.env_var_context)
+
+let names_of_rel_context env =
+ names_of_rel_context env.env_context.env_rel_context
let set_universes g env =
if env.env_universes == g then env else { env with env_universes = g }
@@ -109,12 +181,19 @@ let new_meta ()=incr meta_ctr;!meta_ctr;;
(* Access functions. *)
-let lookup_var id env =
- let (_,var) = lookup_glob id env.env_context in
- (Name id, var)
+let lookup_var_type id env =
+ lookup_id_type id env.env_context.env_var_context
+
+let lookup_var_value id env =
+ lookup_id_value id env.env_context.env_var_context
+
+let lookup_var id env = lookup_id id env.env_context.env_var_context
-let lookup_rel n env =
- Sign.lookup_rel n env.env_context
+let lookup_rel_type n env =
+ Sign.lookup_rel_type n env.env_context.env_rel_context
+
+let lookup_rel_value n env =
+ Sign.lookup_rel_value n env.env_context.env_rel_context
let lookup_constant sp env =
Spmap.find sp env.env_globals.env_constants
@@ -171,7 +250,7 @@ let hdchar env c =
| Rel n ->
(if n<=k then "p" (* the initial term is flexible product/function *)
else
- try match lookup_rel (n-k) env with
+ try match lookup_rel_type (n-k) env with
| Name id,_ -> lowercase_first_char id
| Anonymous,t -> hdrec 0 (lift (n-k) (body_of_type t))
with Not_found -> "y")
@@ -196,6 +275,32 @@ let it_lambda_name env = List.fold_left (fun c (n,t) ->lambda_name env (n,t,c))
let prod_create env (a,b) = mkProd (named_hd env a Anonymous) a b
let lambda_create env (a,b) = mkLambda (named_hd env a Anonymous) a b
+let name_assumption env (na,c,t) =
+ match c with
+ | None -> (named_hd env (body_of_type t) na, None, t)
+ | Some body -> (named_hd env body na, c, t)
+
+let prod_assum_name env b d = mkProd_or_LetIn (name_assumption env d) b
+let lambda_assum_name env b d = mkLambda_or_LetIn (name_assumption env d) b
+
+let it_mkProd_or_LetIn_name env = List.fold_left (prod_assum_name env)
+let it_mkLambda_or_LetIn_name env = List.fold_left (lambda_assum_name env)
+
+let it_mkProd_or_LetIn = List.fold_left (fun c d -> mkProd_or_LetIn d c)
+let it_mkLambda_or_LetIn = List.fold_left (fun c d -> mkLambda_or_LetIn d c)
+
+let it_mkNamedProd_or_LetIn = it_var_context_quantifier mkNamedProd_or_LetIn
+let it_mkNamedLambda_or_LetIn = it_var_context_quantifier mkNamedLambda_or_LetIn
+
+let make_all_name_different env =
+ let avoid = ref (ids_of_var_context (var_context env)) in
+ process_rel_context
+ (fun newenv (na,c,t) ->
+ let id = next_name_away na !avoid in
+ avoid := id::!avoid;
+ push_rel (Name id,c,t) newenv)
+ env
+
(* Abstractions. *)
let evaluable_abst env = function