@@ -108,9 +108,13 @@ let constraint_eq u1 u2 =
108108 let open UnivProblem in
109109 ULe (u1, u2)
110110
111+ [%% if coq = " 9.0" || coq = " 9.1" ]
111112let add_constraints state c = S. update (Option. get ! pre_engine) state (fun ({ sigma } as x ) ->
112113 { x with sigma = Evd. add_universe_constraints sigma c })
113-
114+ [%% else ]
115+ let add_constraints state c = S. update (Option. get ! pre_engine) state (fun ({ sigma } as x ) ->
116+ { x with sigma = Evd. add_constraints sigma c })
117+ [%% endif]
114118let add_universe_constraint state c =
115119 let open UnivProblem in
116120 try add_constraints state (Set. singleton c)
@@ -204,23 +208,92 @@ let universe_level_variable =
204208 end
205209}
206210
207- let universe_constraint : Univ.univ_constraint API.Conversion.t =
211+ [%% if coq = " 9.0" || coq = " 9.1" ]
212+ type univ_cst = Univ .univ_constraint
213+ type univ_csts = Univ.Constraints .t
214+ type univ_ctx_set = Univ.ContextSet .t
215+
216+ let univ_lt = Univ. Lt
217+ let univ_le = Univ. Le
218+ let univ_eq = Univ. Eq
219+ let univ_csts_of_list = Univ.Constraints. of_list
220+ let univ_csts_to_list = Univ.Constraints. elements
221+ let evd_merge_ctx_set rigid = Evd. merge_sort_context_set rigid
222+ let subst_univs_constraints = Univ. subst_univs_level_constraints
223+ let univs_of_csts = UVars.UContext. constraints
224+ let mk_universe_decl univdecl_extensible_instance univdecl_extensible_constraints univdecl_constraints univdecl_instance =
225+ let open UState in
226+ { univdecl_qualities = [] ;
227+ univdecl_extensible_instance;
228+ univdecl_extensible_qualities = false ;
229+ univdecl_extensible_constraints;
230+ univdecl_constraints;
231+ univdecl_instance}
232+ let default_univ_decl = UState. default_univ_decl
233+ let dest_udecl ({ UState. univdecl_instance ; univdecl_constraints } : UState.universe_decl ) =
234+ univdecl_instance, univdecl_constraints
235+
236+ let universe_constraint : univ_cst API.Conversion.t =
208237 let open API.Conversion in let open API.AlgebraicData in declare {
209238 ty = TyName " univ-constraint" ;
210239 doc = " Constraint between two universes level variables" ;
211240 pp = (fun fmt _ -> Format. fprintf fmt " <todo>" );
212241 constructors = [
213242 K (" lt" ," " ,A (universe_level_variable,A (universe_level_variable,N )),
214- B (fun u1 u2 -> (u1,Univ. Lt ,u2)),
243+ B (fun u1 u2 -> (u1,univ_lt ,u2)),
215244 M (fun ~ok ~ko -> function (l1 ,Univ. Lt ,l2 ) -> ok l1 l2 | _ -> ko () ));
216245 K (" le" ," " ,A (universe_level_variable,A (universe_level_variable,N )),
217- B (fun u1 u2 -> (u1,Univ. Le ,u2)),
246+ B (fun u1 u2 -> (u1,univ_le ,u2)),
218247 M (fun ~ok ~ko -> function (l1 ,Univ. Le ,l2 ) -> ok l1 l2 | _ -> ko () ));
219248 K (" eq" ," " ,A (universe_level_variable,A (universe_level_variable,N )),
220- B (fun u1 u2 -> (u1,Univ. Eq ,u2)),
249+ B (fun u1 u2 -> (u1,univ_eq ,u2)),
221250 M (fun ~ok ~ko -> function (l1 ,Univ. Eq ,l2 ) -> ok l1 l2 | _ -> ko () ))
222251 ]
223252} |> API.ContextualConversion. (! < )
253+ [%% else ]
254+ type univ_cst = Univ.UnivConstraint .t
255+ type univ_csts = Univ.UnivConstraints .t
256+ type univ_ctx_set = PConstraints.ContextSet .t
257+ let univ_lt = Univ.UnivConstraint. Lt
258+ let univ_le = Univ.UnivConstraint. Le
259+ let univ_eq = Univ.UnivConstraint. Eq
260+ let univ_csts_of_list = Univ.UnivConstraints. of_list
261+ let univ_csts_to_list = Univ.UnivConstraints. elements
262+ let evd_merge_ctx_set rigid = Evd. merge_sort_context_set rigid QGraph. Internal
263+ let subst_univs_constraints x = UVars. subst_univs_constraints (Sorts.QVar.Map. empty,x)
264+ let univs_of_csts x = PConstraints. univs @@ UVars.UContext. constraints x
265+ let mk_universe_decl sort_poly_decl_extensible_instance sort_poly_decl_extensible_constraints sort_poly_decl_univ_constraints sort_poly_decl_instance =
266+ let open UState in
267+ { sort_poly_decl_qualities = [] ;
268+ sort_poly_decl_extensible_instance;
269+ sort_poly_decl_elim_constraints = Sorts.ElimConstraints. empty;
270+ sort_poly_decl_extensible_qualities = false ;
271+ sort_poly_decl_extensible_constraints;
272+ sort_poly_decl_univ_constraints;
273+ sort_poly_decl_instance}
274+ let default_univ_decl = UState. default_sort_poly_decl
275+ let dest_udecl ({ UState. sort_poly_decl_instance ; sort_poly_decl_univ_constraints } : UState.sort_poly_decl ) =
276+ sort_poly_decl_instance, sort_poly_decl_univ_constraints
277+
278+ let universe_constraint : univ_cst API.Conversion.t =
279+ let open API.Conversion in let open API.AlgebraicData in declare {
280+ ty = TyName " univ-constraint" ;
281+ doc = " Constraint between two universes level variables" ;
282+ pp = (fun fmt _ -> Format. fprintf fmt " <todo>" );
283+ constructors = [
284+ K (" lt" ," " ,A (universe_level_variable,A (universe_level_variable,N )),
285+ B (fun u1 u2 -> (u1,univ_lt,u2)),
286+ M (fun ~ok ~ko -> function (l1 ,Univ.UnivConstraint. Lt ,l2 ) -> ok l1 l2 | _ -> ko () ));
287+ K (" le" ," " ,A (universe_level_variable,A (universe_level_variable,N )),
288+ B (fun u1 u2 -> (u1,univ_le,u2)),
289+ M (fun ~ok ~ko -> function (l1 ,Univ.UnivConstraint. Le ,l2 ) -> ok l1 l2 | _ -> ko () ));
290+ K (" eq" ," " ,A (universe_level_variable,A (universe_level_variable,N )),
291+ B (fun u1 u2 -> (u1,univ_eq,u2)),
292+ M (fun ~ok ~ko -> function (l1 ,Univ.UnivConstraint. Eq ,l2 ) -> ok l1 l2 | _ -> ko () ))
293+ ]
294+ } |> API.ContextualConversion. (! < )
295+ [%% endif]
296+
224297
225298let universe_variance : (Univ.Level.t * UVars.Variance.t option) API.Conversion.t =
226299 let open API.Conversion in let open API.AlgebraicData in declare {
@@ -243,8 +316,8 @@ let universe_variance : (Univ.Level.t * UVars.Variance.t option) API.Conversion.
243316 ]
244317} |> API.ContextualConversion. (! < )
245318
246- type universe_decl = (Univ.Level .t list * bool ) * (Univ.Constraints .t * bool )
247- type universe_decl_cumul = ((Univ.Level .t * UVars.Variance .t option ) list * bool ) * (Univ.Constraints .t * bool )
319+ type universe_decl = (Univ.Level .t list * bool ) * (univ_csts * bool )
320+ type universe_decl_cumul = ((Univ.Level .t * UVars.Variance .t option ) list * bool ) * (univ_csts * bool )
248321
249322type any_universe_decl =
250323 | NonCumul of universe_decl
@@ -257,11 +330,11 @@ let universe_decl : any_universe_decl API.Conversion.t =
257330 pp = (fun fmt _ -> Format. fprintf fmt " <todo>" );
258331 constructors = [
259332 K (" upoly-decl" ," " ,A (list universe_level_variable,A (bool ,A (list universe_constraint,A (bool ,N )))),
260- B (fun x sx y sy -> NonCumul ((x,sx),(Univ.Constraints. of_list y,sy))),
261- M (fun ~ok ~ko -> function NonCumul ((x ,sx ),(y ,sy )) -> ok x sx (Univ.Constraints. elements y) sy | Cumul _ -> ko () ));
333+ B (fun x sx y sy -> NonCumul ((x,sx),(univ_csts_of_list y,sy))),
334+ M (fun ~ok ~ko -> function NonCumul ((x ,sx ),(y ,sy )) -> ok x sx (univ_csts_to_list y) sy | Cumul _ -> ko () ));
262335 K (" upoly-decl-cumul" ," " ,A (list universe_variance,A (bool ,A (list universe_constraint,A (bool ,N )))),
263- B (fun x sx y sy -> Cumul ((x,sx),(Univ.Constraints. of_list y,sy))),
264- M (fun ~ok ~ko -> function Cumul ((x ,sx ),(y ,sy )) -> ok x sx (Univ.Constraints. elements y) sy | NonCumul _ -> ko () ))
336+ B (fun x sx y sy -> Cumul ((x,sx),(univ_csts_of_list y,sy))),
337+ M (fun ~ok ~ko -> function Cumul ((x ,sx ),(y ,sy )) -> ok x sx (univ_csts_to_list y) sy | NonCumul _ -> ko () ))
265338 ]
266339} |> API.ContextualConversion. (! < )
267340
@@ -889,8 +962,8 @@ module CoqEngine_HOAS : sig
889962
890963 (* when the env changes under the hood, we can adapt sigma or drop it but keep
891964 its constraints *)
892- val from_env_keep_univ_of_sigma : uctx :Univ . ContextSet . t -> env0 :Environ .env -> env :Environ .env -> Evd .evar_map -> coq_engine
893- val from_env_keep_univ_and_sigma : uctx :Univ . ContextSet . t -> env0 :Environ .env -> env :Environ .env -> Evd .evar_map -> coq_engine
965+ val from_env_keep_univ_of_sigma : uctx :univ_ctx_set -> env0 :Environ .env -> env :Environ .env -> Evd .evar_map -> coq_engine
966+ val from_env_keep_univ_and_sigma : uctx :univ_ctx_set -> env0 :Environ .env -> env :Environ .env -> Evd .evar_map -> coq_engine
894967
895968end = struct
896969
@@ -1690,11 +1763,11 @@ let body_of_constant state c inst_opt = S.update_return engine state (fun x ->
16901763 let c, ctx = UnivGen. fresh_global_instance x.global_env (ConstRef c) ?names:inst_opt in
16911764 let c, inst = Constr. destConst c in
16921765 let bo = Vars. subst_instance_constr inst bo in
1693- let sigma = Evd. merge_sort_context_set Evd. univ_rigid x.sigma ctx in
1766+ let sigma = evd_merge_ctx_set Evd. univ_rigid x.sigma ctx in
16941767 let sigma = match priv with
16951768 | Opaqueproof. PrivateMonomorphic () -> sigma
16961769 | Opaqueproof. PrivatePolymorphic ctx ->
1697- let ctx = Util. on_snd (Univ. subst_univs_level_constraints (snd (UVars. make_instance_subst inst))) ctx in
1770+ let ctx = Util. on_snd (subst_univs_constraints (snd (UVars. make_instance_subst inst))) ctx in
16981771 Evd. merge_context_set Evd. univ_rigid sigma ctx
16991772 in
17001773 { x with sigma }, (Some (EConstr. of_constr bo), Some inst)
@@ -1852,7 +1925,7 @@ let in_coq_poly_gref ~depth ~origin ~failsafe s t i =
18521925 s, u, []
18531926 with Not_found ->
18541927 let u, ctx = UnivGen. fresh_global_instance (get_global_env s) t in
1855- let s = update_sigma s (fun sigma -> Evd. merge_sort_context_set UState. univ_flexible_alg sigma ctx) in
1928+ let s = update_sigma s (fun sigma -> evd_merge_ctx_set UState. univ_flexible_alg sigma ctx) in
18561929 let u =
18571930 match C. kind u with
18581931 | C. Const (_ , u ) -> u
@@ -2943,9 +3016,9 @@ let universes_of_term state t =
29433016 let sigma = get_sigma state in
29443017 snd (EConstr. universes_of_constr sigma t)
29453018
2946- let universes_of_udecl state ( { UState. univdecl_instance ; univdecl_constraints } : UState.universe_decl ) =
2947- let used1 = univdecl_instance in
2948- let used2 = List. map (fun (x ,_ ,y ) -> [x;y]) (Univ.Constraints. elements univdecl_constraints ) in
3019+ let universes_of_udecl state udecl =
3020+ let used1, csts = dest_udecl udecl in
3021+ let used2 = List. map (fun (x ,_ ,y ) -> [x;y]) (univ_csts_to_list csts ) in
29493022 let used = List. fold_right Univ.Level.Set. add used1 Univ.Level.Set. empty in
29503023 let used = List. fold_right Univ.Level.Set. add (List. flatten used2) used in
29513024 used
@@ -2966,18 +3039,9 @@ let name_universe_level state l =
29663039 )
29673040
29683041
2969- let mk_universe_decl univdecl_extensible_instance univdecl_extensible_constraints univdecl_constraints univdecl_instance =
2970- let open UState in
2971- { univdecl_qualities = [] ;
2972- univdecl_extensible_instance;
2973- univdecl_extensible_qualities = false ;
2974- univdecl_extensible_constraints;
2975- univdecl_constraints;
2976- univdecl_instance}
2977-
29783042let poly_cumul_udecl_variance_of_options state options =
29793043 match options.universe_decl with
2980- | NotUniversePolymorphic -> state, false , false , UState. default_univ_decl, [| |]
3044+ | NotUniversePolymorphic -> state, false , false , default_univ_decl, [| |]
29813045 | Cumulative ((univ_lvlt_var ,univdecl_extensible_instance ),(univdecl_constraints ,univdecl_extensible_constraints )) ->
29823046 let univdecl_instance, variance = List. split univ_lvlt_var in
29833047 state, true , true ,
@@ -3536,7 +3600,7 @@ let upoly_decl_of ~depth state ~loose_udecl mie =
35363600 if not (CArray. is_empty qvars) then nYI " sort poly inductives"
35373601 else
35383602 let state, vars = CArray. fold_left_map (fun s l -> fst (name_universe_level s l), l) state vars in
3539- let csts = UVars.UContext. constraints uc in
3603+ let csts = univs_of_csts uc in
35403604 begin match mie.mind_entry_variance with
35413605 | None ->
35423606 let state, up, gls = universe_decl.API.Conversion. embed ~depth state (NonCumul ((Array. to_list vars,loose_udecl),(csts,loose_udecl))) in
0 commit comments