diff options
Diffstat (limited to 'pretyping')
| -rw-r--r-- | pretyping/evarutil.ml | 22 | ||||
| -rw-r--r-- | pretyping/evarutil.mli | 10 | ||||
| -rw-r--r-- | pretyping/evd.ml | 29 | ||||
| -rw-r--r-- | pretyping/evd.mli | 3 | ||||
| -rw-r--r-- | pretyping/typeclasses.ml | 5 | ||||
| -rw-r--r-- | pretyping/typeclasses.mli | 3 |
6 files changed, 37 insertions, 35 deletions
diff --git a/pretyping/evarutil.ml b/pretyping/evarutil.ml index a4eae5fdff..128a7e55c4 100644 --- a/pretyping/evarutil.ml +++ b/pretyping/evarutil.ml @@ -355,47 +355,41 @@ let new_pure_evar_full evd evi = let evd = Evd.add evd evk evi in (evd, evk) -let new_pure_evar evd sign ?(src=default_source) ?filter ?candidates typ = +let new_pure_evar evd sign ?(src=default_source) ?filter ?candidates ?store typ = let newevk = new_untyped_evar() in - let evd = evar_declare sign newevk typ ~src ?filter ?candidates evd in + let evd = evar_declare sign newevk typ ~src ?filter ?candidates ?store evd in (evd,newevk) -let new_evar_instance sign evd typ ?src ?filter ?candidates instance = +let new_evar_instance sign evd typ ?src ?filter ?candidates ?store instance = assert (not !Flags.debug || List.distinct (ids_of_named_context (named_context_of_val sign))); - let evd,newevk = new_pure_evar evd sign ?src ?filter ?candidates typ in + let evd,newevk = new_pure_evar evd sign ?src ?filter ?candidates ?store typ in (evd,mkEvar (newevk,Array.of_list instance)) (* [new_evar] declares a new existential in an env env with type typ *) (* Converting the env into the sign of the evar to define *) -let new_evar evd env ?src ?filter ?candidates typ = +let new_evar evd env ?src ?filter ?candidates ?store typ = let sign,typ',instance,subst,vsubst = push_rel_context_to_named_context env typ in let candidates = Option.map (List.map (subst2 subst vsubst)) candidates in let instance = match filter with | None -> instance | Some filter -> Filter.filter_list filter instance in - new_evar_instance sign evd typ' ?src ?filter ?candidates instance + new_evar_instance sign evd typ' ?src ?filter ?candidates ?store instance let new_type_evar ?src ?filter rigid evd env = let evd', s = new_sort_variable rigid evd in let evd', e = new_evar evd' env ?src ?filter (mkSort s) in evd', (e, s) - (* The same using side-effect *) -let e_new_evar evdref env ?(src=(Loc.ghost,Evar_kinds.InternalHole)) ?filter ?candidates ty = - let (evd',ev) = new_evar !evdref env ~src:src ?filter ?candidates ty in - evdref := evd'; - ev - let e_new_type_evar evdref ?src ?filter rigid env = let evd', c = new_type_evar ?src ?filter rigid !evdref env in evdref := evd'; c (* The same using side-effect *) -let e_new_evar evdref env ?(src=default_source) ?filter ?candidates ty = - let (evd',ev) = new_evar !evdref env ~src:src ?filter ?candidates ty in +let e_new_evar evdref env ?(src=default_source) ?filter ?candidates ?store ty = + let (evd',ev) = new_evar !evdref env ~src:src ?filter ?candidates ?store ty in evdref := evd'; ev diff --git a/pretyping/evarutil.mli b/pretyping/evarutil.mli index d197ad2efe..7715691b0c 100644 --- a/pretyping/evarutil.mli +++ b/pretyping/evarutil.mli @@ -23,18 +23,18 @@ val mk_new_meta : unit -> constr (** {6 Creating a fresh evar given their type and context} *) val new_evar : evar_map -> env -> ?src:Loc.t * Evar_kinds.t -> ?filter:Filter.t -> - ?candidates:constr list -> types -> evar_map * constr + ?candidates:constr list -> ?store:Store.t -> types -> evar_map * constr val new_pure_evar : evar_map -> named_context_val -> ?src:Loc.t * Evar_kinds.t -> ?filter:Filter.t -> - ?candidates:constr list -> types -> evar_map * evar + ?candidates:constr list -> ?store:Store.t -> types -> evar_map * evar val new_pure_evar_full : evar_map -> evar_info -> evar_map * evar (** the same with side-effects *) val e_new_evar : evar_map ref -> env -> ?src:Loc.t * Evar_kinds.t -> ?filter:Filter.t -> - ?candidates:constr list -> types -> constr + ?candidates:constr list -> ?store:Store.t -> types -> constr (** Create a new Type existential variable, as we keep track of them during type-checking and unification. *) @@ -57,7 +57,9 @@ val e_new_global : evar_map ref -> Globnames.global_reference -> constr of [inst] are typed in the occurrence context and their type (seen as a telescope) is [sign] *) val new_evar_instance : - named_context_val -> evar_map -> types -> ?src:Loc.t * Evar_kinds.t -> ?filter:Filter.t -> ?candidates:constr list -> constr list -> evar_map * constr + named_context_val -> evar_map -> types -> + ?src:Loc.t * Evar_kinds.t -> ?filter:Filter.t -> ?candidates:constr list -> + ?store:Store.t -> constr list -> evar_map * constr val make_pure_subst : evar_info -> constr array -> (Id.t * constr) list diff --git a/pretyping/evd.ml b/pretyping/evd.ml index 1bd995d5d1..5a9281c890 100644 --- a/pretyping/evd.ml +++ b/pretyping/evd.ml @@ -295,7 +295,6 @@ let is_empty_evar_universe_context ctx = let union_evar_universe_context ctx ctx' = if ctx == ctx' then ctx - else if is_empty_evar_universe_context ctx then ctx' else if is_empty_evar_universe_context ctx' then ctx else let local = @@ -331,7 +330,7 @@ let diff_evar_universe_context ctx' ctx = Univ.LSet.diff ctx'.uctx_univ_algebraic ctx.uctx_univ_algebraic; uctx_univ_template = Univ.LSet.diff ctx'.uctx_univ_template ctx.uctx_univ_template; - uctx_universes = Univ.empty_universes; + uctx_universes = ctx.uctx_initial_universes; uctx_initial_universes = ctx.uctx_initial_universes } (* let diff_evar_universe_context_key = Profile.declare_profile "diff_evar_universe_context";; *) @@ -354,7 +353,7 @@ let instantiate_variable l b v = exception UniversesDiffer -let process_universe_constraints univs vars alg templ local cstrs = +let process_universe_constraints univs vars alg templ cstrs = let vars = ref vars in let normalize = Universes.normalize_universe_opt_subst vars in let rec unify_universes fo l d r local = @@ -370,10 +369,11 @@ let process_universe_constraints univs vars alg templ local cstrs = if Univ.check_leq univs l r then (** Keep Prop/Set <= var around if var might be instantiated by prop or set later. *) - if Univ.is_small_univ l && not (Univ.is_small_univ r) then - match Univ.Universe.level l, Univ.Universe.level r with - | Some l, Some r -> Univ.Constraint.add (l,Univ.Le,r) local - | _, _ -> local + if Univ.is_small_univ l then + match Univ.Universe.level r with + | Some r when Univ.LMap.mem r !vars -> + Univ.Constraint.add (Option.get (Univ.Universe.level l),Univ.Le,r) local + | _ -> local else local else match Univ.Universe.level r with @@ -423,7 +423,7 @@ let process_universe_constraints univs vars alg templ local cstrs = in let local = Univ.UniverseConstraints.fold (fun (l,d,r) local -> unify_universes false l d r local) - cstrs local + cstrs Univ.Constraint.empty in !vars, local @@ -440,7 +440,7 @@ let add_constraints_context ctx cstrs = let vars, local' = process_universe_constraints ctx.uctx_universes ctx.uctx_univ_variables ctx.uctx_univ_algebraic - ctx.uctx_univ_template local cstrs' + ctx.uctx_univ_template cstrs' in { ctx with uctx_local = (univs, Univ.Constraint.union local local'); uctx_univ_variables = vars; @@ -454,7 +454,7 @@ let add_universe_constraints_context ctx cstrs = let vars, local' = process_universe_constraints ctx.uctx_universes ctx.uctx_univ_variables ctx.uctx_univ_algebraic - ctx.uctx_univ_template local cstrs + ctx.uctx_univ_template cstrs in { ctx with uctx_local = (univs, Univ.Constraint.union local local'); uctx_univ_variables = vars; @@ -769,7 +769,8 @@ let define evk body evd = in { evd with defn_evars; undf_evars; last_mods; } -let evar_declare hyps evk ty ?(src=(Loc.ghost,Evar_kinds.InternalHole)) ?(filter = Filter.identity) ?candidates evd = +let evar_declare hyps evk ty ?(src=(Loc.ghost,Evar_kinds.InternalHole)) + ?(filter=Filter.identity) ?candidates ?(store=Store.empty) evd = let () = match Filter.repr filter with | None -> () | Some filter -> @@ -782,7 +783,7 @@ let evar_declare hyps evk ty ?(src=(Loc.ghost,Evar_kinds.InternalHole)) ?(filter evar_filter = filter; evar_source = src; evar_candidates = candidates; - evar_extra = Store.empty; } + evar_extra = store; } in { evd with undf_evars = EvMap.add evk evar_info evd.undf_evars; } @@ -1128,9 +1129,9 @@ let set_leq_sort evd s1 s2 = | Prop c, Prop c' -> if c == Null && c' == Pos then evd else (raise (Univ.UniverseInconsistency (Univ.Le, u1, u2, []))) - | _, _ -> + | _, _ -> add_universe_constraints evd (Univ.UniverseConstraints.singleton (u1,Univ.ULe,u2)) - + let check_eq evd s s' = Univ.check_eq evd.universes.uctx_universes s s' diff --git a/pretyping/evd.mli b/pretyping/evd.mli index fb348ae226..49a91f524e 100644 --- a/pretyping/evd.mli +++ b/pretyping/evd.mli @@ -234,7 +234,8 @@ val evars_reset_evd : ?with_conv_pbs:bool -> ?with_univs:bool -> val evar_declare : named_context_val -> evar -> types -> ?src:Loc.t * Evar_kinds.t -> - ?filter:Filter.t -> ?candidates:constr list -> evar_map -> evar_map + ?filter:Filter.t -> ?candidates:constr list -> ?store:Store.t -> + evar_map -> evar_map (** Convenience function. Just a wrapper around {!add}. *) val evar_source : existential_key -> evar_map -> Evar_kinds.t located diff --git a/pretyping/typeclasses.ml b/pretyping/typeclasses.ml index ada497ece7..8364387783 100644 --- a/pretyping/typeclasses.ml +++ b/pretyping/typeclasses.ml @@ -507,6 +507,9 @@ let is_implicit_arg = function let resolvable = Store.field () +let set_resolvable s b = + Store.set s resolvable b + let is_resolvable evi = assert (match evi.evar_body with Evar_empty -> true | _ -> false); Option.default true (Store.get evi.evar_extra resolvable) @@ -540,7 +543,7 @@ let mark_resolvability filter b sigma = Evd.raw_map_undefined map sigma let mark_unresolvables ?(filter=all_evars) sigma = mark_resolvability filter false sigma -let mark_resolvables sigma = mark_resolvability all_evars true sigma +let mark_resolvables ?(filter=all_evars) sigma = mark_resolvability filter true sigma let has_typeclasses filter evd = let check ev evi = diff --git a/pretyping/typeclasses.mli b/pretyping/typeclasses.mli index a8ce9ca7c9..ebc6be45fb 100644 --- a/pretyping/typeclasses.mli +++ b/pretyping/typeclasses.mli @@ -92,11 +92,12 @@ val no_goals_or_obligations : evar_filter (** Resolvability. Only undefined evars can be marked or checked for resolvability. *) +val set_resolvable : Evd.Store.t -> bool -> Evd.Store.t val is_resolvable : evar_info -> bool val mark_unresolvable : evar_info -> evar_info val mark_unresolvables : ?filter:evar_filter -> evar_map -> evar_map +val mark_resolvables : ?filter:evar_filter -> evar_map -> evar_map val mark_resolvable : evar_info -> evar_info -val mark_resolvables : evar_map -> evar_map val is_class_evar : evar_map -> evar_info -> bool val resolve_typeclasses : ?filter:evar_filter -> ?split:bool -> ?fail:bool -> |
