8
env_constants : constant_body Cmap.t;
9
env_inductives : mutual_inductive_body KNmap.t;
10
env_modules : module_body MPmap.t;
11
env_modtypes : module_type_body MPmap.t;
12
env_alias : module_path MPmap.t }
14
type stratification = {
15
env_universes : universes;
16
env_engagement : engagement option
20
env_globals : globals;
21
env_named_context : named_context;
22
env_rel_context : rel_context;
23
env_stratification : stratification;
24
env_imports : Digest.t MPmap.t }
28
{ env_constants = Cmap.empty;
29
env_inductives = KNmap.empty;
30
env_modules = MPmap.empty;
31
env_modtypes = MPmap.empty;
32
env_alias = MPmap.empty };
33
env_named_context = [];
36
{ env_universes = Univ.initial_universes;
37
env_engagement = None};
38
env_imports = MPmap.empty }
40
let engagement env = env.env_stratification.env_engagement
41
let universes env = env.env_stratification.env_universes
42
let named_context env = env.env_named_context
43
let rel_context env = env.env_rel_context
45
let set_engagement c env =
46
match env.env_stratification.env_engagement with
47
| Some c' -> if c=c' then env else error "Incompatible engagement"
49
{ env with env_stratification =
50
{ env.env_stratification with env_engagement = Some c } }
54
let add_digest env dp digest =
55
{ env with env_imports = MPmap.add (MPfile dp) digest env.env_imports }
57
let lookup_digest env dp =
58
MPmap.find (MPfile dp) env.env_imports
61
let lookup_rel n env =
62
let rec lookup_rel n sign =
64
| 1, decl :: _ -> decl
65
| n, _ :: sign -> lookup_rel (n-1) sign
66
| _, [] -> raise Not_found in
67
lookup_rel n env.env_rel_context
71
env_rel_context = d :: env.env_rel_context }
73
let push_rel_context ctxt x = fold_rel_context push_rel ctxt ~init:x
75
let push_rec_types (lna,typarray,_) env =
76
let ctxt = array_map2_i (fun i na t -> (na, None, lift i t)) lna typarray in
77
Array.fold_left (fun e assum -> push_rel assum e) env ctxt
81
let push_named d env =
82
(* if not (env.env_rel_context = []) then raise (ASSERT env.env_rel_context);
83
assert (env.env_rel_context = []); *)
85
env_named_context = d :: env.env_named_context }
87
let lookup_named id env =
88
let rec lookup_named id = function
89
| (id',_,_ as decl) :: _ when id=id' -> decl
90
| _ :: sign -> lookup_named id sign
91
| [] -> raise Not_found in
92
lookup_named id env.env_named_context
94
(* A local const is evaluable if it is defined *)
96
let named_type id env =
97
let (_,_,t) = lookup_named id env in t
99
(* Universe constraints *)
100
let add_constraints c env =
101
if c == Constraint.empty then
104
let s = env.env_stratification in
105
{ env with env_stratification =
106
{ s with env_universes = merge_constraints c s.env_universes } }
108
(* Global constants *)
110
let lookup_constant kn env =
111
Cmap.find kn env.env_globals.env_constants
113
let add_constant kn cs env =
115
Cmap.add kn cs env.env_globals.env_constants in
117
{ env.env_globals with
118
env_constants = new_constants } in
119
{ env with env_globals = new_globals }
121
(* constant_type gives the type of a constant *)
122
let constant_type env kn =
123
let cb = lookup_constant kn env in
126
type const_evaluation_result = NoBody | Opaque
128
exception NotEvaluableConst of const_evaluation_result
130
let constant_value env kn =
131
let cb = lookup_constant kn env in
132
if cb.const_opaque then raise (NotEvaluableConst Opaque);
133
match cb.const_body with
134
| Some l_body -> force_constr l_body
135
| None -> raise (NotEvaluableConst NoBody)
137
let constant_opt_value env cst =
138
try Some (constant_value env cst)
139
with NotEvaluableConst _ -> None
141
(* A global const is evaluable if it is defined and not opaque *)
142
let evaluable_constant cst env =
143
try let _ = constant_value env cst in true
144
with Not_found | NotEvaluableConst _ -> false
146
(* Mutual Inductives *)
147
let lookup_mind kn env =
148
KNmap.find kn env.env_globals.env_inductives
150
let rec scrape_mind env kn =
151
match (lookup_mind kn env).mind_equiv with
153
| Some kn' -> scrape_mind env kn'
155
let add_mind kn mib env =
156
let new_inds = KNmap.add kn mib env.env_globals.env_inductives in
158
{ env.env_globals with
159
env_inductives = new_inds } in
160
{ env with env_globals = new_globals }
162
let rec mind_equiv env (kn1,i1) (kn2,i2) =
163
let rec equiv kn1 kn2 =
165
scrape_mind env kn1 = scrape_mind env kn2 in
166
i1 = i2 && equiv kn1 kn2
171
let add_modtype ln mtb env =
172
let new_modtypes = MPmap.add ln mtb env.env_globals.env_modtypes in
174
{ env.env_globals with
175
env_modtypes = new_modtypes } in
176
{ env with env_globals = new_globals }
178
let shallow_add_module mp mb env =
179
let new_mods = MPmap.add mp mb env.env_globals.env_modules in
181
{ env.env_globals with
182
env_modules = new_mods } in
183
{ env with env_globals = new_globals }
185
let register_alias mp1 mp2 env =
186
let new_alias = MPmap.add mp1 mp2 env.env_globals.env_alias in
188
{ env.env_globals with
189
env_alias = new_alias } in
190
{ env with env_globals = new_globals }
192
let rec scrape_alias mp env =
194
let mp1 = MPmap.find mp env.env_globals.env_alias in
199
let lookup_module mp env =
200
MPmap.find mp env.env_globals.env_modules
202
let lookup_modtype ln env =
203
MPmap.find ln env.env_globals.env_modtypes