aboutsummaryrefslogtreecommitdiff
path: root/interp
diff options
context:
space:
mode:
Diffstat (limited to 'interp')
-rw-r--r--interp/constrextern.ml1
-rw-r--r--interp/constrintern.ml22
-rw-r--r--interp/declare.ml2
-rw-r--r--interp/discharge.ml4
-rw-r--r--interp/impargs.ml72
-rw-r--r--interp/impargs.mli9
-rw-r--r--interp/implicit_quantifiers.ml5
7 files changed, 86 insertions, 29 deletions
diff --git a/interp/constrextern.ml b/interp/constrextern.ml
index 8e49800982..d5cb25d1fb 100644
--- a/interp/constrextern.ml
+++ b/interp/constrextern.ml
@@ -755,6 +755,7 @@ let extended_glob_local_binder_of_decl ?loc u = DAst.make ?loc (extended_glob_lo
(* mapping glob_constr to constr_expr *)
let extern_glob_sort = function
+ | GSProp -> GSProp
| GProp -> GProp
| GSet -> GSet
| GType _ as s when !print_universes -> s
diff --git a/interp/constrintern.ml b/interp/constrintern.ml
index 24894fc9f5..5ede9d6a99 100644
--- a/interp/constrintern.ml
+++ b/interp/constrintern.ml
@@ -16,6 +16,7 @@ open Names
open Nameops
open Namegen
open Constr
+open Context
open Libnames
open Globnames
open Impargs
@@ -1020,6 +1021,7 @@ let sort_info_of_level_info (info: level_info) : (Libnames.qualid * int) option
let glob_sort_of_level (level: glob_level) : glob_sort =
match level with
+ | GSProp -> GSProp
| GProp -> GProp
| GSet -> GSet
| GType info -> GType [sort_info_of_level_info info]
@@ -1188,7 +1190,6 @@ let check_constructor_length env loc cstr len_pl pl0 =
(error_wrong_numarg_constructor ?loc env cstr
(Inductiveops.constructor_nrealargs cstr)))
-open Term
open Declarations
(* Similar to Cases.adjust_local_defs but on RCPat *)
@@ -1197,16 +1198,15 @@ let insert_local_defs_in_pattern (ind,j) l =
if mip.mind_consnrealdecls.(j-1) = mip.mind_consnrealargs.(j-1) then
(* Optimisation *) l
else
- let typi = mip.mind_nf_lc.(j-1) in
- let (_,typi) = decompose_prod_n_assum (Context.Rel.length mib.mind_params_ctxt) typi in
- let (decls,_) = decompose_prod_assum typi in
+ let (ctx, _) = mip.mind_nf_lc.(j-1) in
+ let decls = List.skipn (Context.Rel.length mib.mind_params_ctxt) (List.rev ctx) in
let rec aux decls args =
match decls, args with
| Context.Rel.Declaration.LocalDef _ :: decls, args -> (DAst.make @@ RCPatAtom None) :: aux decls args
| _, [] -> [] (* In particular, if there were trailing local defs, they have been inserted *)
| Context.Rel.Declaration.LocalAssum _ :: decls, a :: args -> a :: aux decls args
| _ -> assert false in
- aux (List.rev decls) l
+ aux decls l
let add_local_defs_and_check_length loc env g pl args = match g with
| ConstructRef cstr ->
@@ -2184,7 +2184,7 @@ let internalize globalenv env pattern_mode (_, ntnvars as lvar) c =
(add_name match_acc CAst.(make ?loc x)) (CAst.make ?loc x::var_acc)
| _ ->
let fresh =
- Namegen.next_name_away_with_default_using_types "iV" cano_name forbidden_names (EConstr.of_constr ty) in
+ Namegen.next_name_away_with_default_using_types "iV" cano_name.binder_name forbidden_names (EConstr.of_constr ty) in
canonize_args t tt (Id.Set.add fresh forbidden_names)
((fresh,c)::match_acc) ((CAst.make ?loc:(cases_pattern_loc c) @@ Name fresh)::var_acc)
end
@@ -2433,9 +2433,10 @@ let interp_glob_context_evars ?(program_mode=false) env sigma k bl =
in
let sigma, t = understand_tcc ~flags env sigma ~expected_type:IsType t' in
match b with
- None ->
- let d = LocalAssum (na,t) in
- let impls =
+ None ->
+ let r = Retyping.relevance_of_type env sigma t in
+ let d = LocalAssum (make_annot na r,t) in
+ let impls =
if k == Implicit then
let na = match na with Name n -> Some n | Anonymous -> None in
(ExplByPos (n, na), (true, true, true)) :: impls
@@ -2444,7 +2445,8 @@ let interp_glob_context_evars ?(program_mode=false) env sigma k bl =
(push_rel d env, sigma, d::params, succ n, impls)
| Some b ->
let sigma, c = understand_tcc ~flags env sigma ~expected_type:(OfType t) b in
- let d = LocalDef (na, c, t) in
+ let r = Retyping.relevance_of_type env sigma t in
+ let d = LocalDef (make_annot na r, c, t) in
(push_rel d env, sigma, d::params, n, impls))
(env,sigma,[],k+1,[]) (List.rev bl)
in sigma, ((env, par), impls)
diff --git a/interp/declare.ml b/interp/declare.ml
index 4371b15c82..08a6ac5f7b 100644
--- a/interp/declare.ml
+++ b/interp/declare.ml
@@ -370,7 +370,7 @@ let declare_projections univs mind =
let mib = Environ.lookup_mind mind env in
match mib.mind_record with
| PrimRecord info ->
- let iter_ind i (_, labs, _) =
+ let iter_ind i (_, labs, _, _) =
let ind = (mind, i) in
let projs = Inductiveops.compute_projections env ind in
Array.iter2_i (declare_one_projection univs ind ~proj_npars:mib.mind_nparams) labs projs
diff --git a/interp/discharge.ml b/interp/discharge.ml
index 353b0f6057..1efd13adb1 100644
--- a/interp/discharge.ml
+++ b/interp/discharge.ml
@@ -69,7 +69,7 @@ let refresh_polymorphic_type_of_inductive (_,mip) =
| RegularArity s -> s.mind_user_arity, false
| TemplateArity ar ->
let ctx = List.rev mip.mind_arity_ctxt in
- mkArity (List.rev ctx, Type ar.template_level), true
+ mkArity (List.rev ctx, Sorts.sort_of_univ ar.template_level), true
let process_inductive info modlist mib =
let section_decls = Lib.named_of_variable_context info.Lib.abstr_ctx in
@@ -103,7 +103,7 @@ let process_inductive info modlist mib =
let (params',inds') = abstract_inductive section_decls' nparamdecls inds in
let record = match mib.mind_record with
| PrimRecord info ->
- Some (Some (Array.map pi1 info))
+ Some (Some (Array.map (fun (x,_,_,_) -> x) info))
| FakeRecord -> Some None
| NotRecord -> None
in
diff --git a/interp/impargs.ml b/interp/impargs.ml
index 6fd52d98dd..d83a0ce918 100644
--- a/interp/impargs.ml
+++ b/interp/impargs.ml
@@ -243,7 +243,7 @@ let compute_implicits_names_gen all env sigma t =
let t = whd_all env sigma t in
match kind sigma t with
| Prod (na,a,b) ->
- let na',avoid' = find_displayed_name_in sigma all avoid na (names,b) in
+ let na',avoid' = find_displayed_name_in sigma all avoid na.Context.binder_name (names,b) in
aux (push_rel (LocalAssum (na,a)) env) avoid' (na'::names) b
| _ -> List.rev names
in aux env Id.Set.empty [] t
@@ -445,16 +445,18 @@ let compute_mib_implicits flags kn =
(fun i mip ->
(* No need to care about constraints here *)
let ty, _ = Typeops.type_of_global_in_context env (IndRef (kn,i)) in
- Context.Rel.Declaration.LocalAssum (Name mip.mind_typename, ty))
+ let r = Inductive.relevance_of_inductive env (kn,i) in
+ Context.Rel.Declaration.LocalAssum (Context.make_annot (Name mip.mind_typename) r, ty))
mib.mind_packets) in
let env_ar = Environ.push_rel_context ar env in
let imps_one_inductive i mip =
let ind = (kn,i) in
let ar, _ = Typeops.type_of_global_in_context env (IndRef ind) in
((IndRef ind,compute_semi_auto_implicits env sigma flags (of_constr ar)),
- Array.mapi (fun j c ->
+ Array.mapi (fun j (ctx, cty) ->
+ let c = of_constr (Term.it_mkProd_or_LetIn cty ctx) in
(ConstructRef (ind,j+1),compute_semi_auto_implicits env_ar sigma flags c))
- (Array.map of_constr mip.mind_nf_lc))
+ mip.mind_nf_lc)
in
Array.mapi imps_one_inductive mib.mind_packets
@@ -674,7 +676,7 @@ let check_inclusion l =
user_err Pp.(str "Sequences of implicit arguments must be of different lengths.");
aux nl
| _ -> () in
- aux (List.map (fun (imps,_) -> List.length imps) l)
+ aux (List.map snd l)
let check_rigidity isrigid =
if not isrigid then
@@ -685,6 +687,8 @@ let projection_implicits env p impls =
CList.skipn_at_least npars impls
let declare_manual_implicits local ref ?enriching l =
+ assert (List.for_all (fun (_, (max, fi, fu)) -> fi && fu) l);
+ assert (List.for_all (fun (ex, _) -> match ex with ExplByPos (_,_) -> true | _ -> false) l);
let flags = !implicit_args in
let env = Global.env () in
let sigma = Evd.from_env env in
@@ -692,29 +696,71 @@ let declare_manual_implicits local ref ?enriching l =
let t = of_constr t in
let enriching = Option.default flags.auto enriching in
let autoimpls = compute_auto_implicits env sigma flags enriching t in
+ let l = [DefaultImpArgs, set_manual_implicits flags enriching autoimpls l] in
+ let req =
+ if is_local local ref then ImplLocal
+ else ImplInteractive(ref,flags,ImplManual (List.length autoimpls))
+ in add_anonymous_leaf (inImplicits (req,[ref,l]))
+
+let maybe_declare_manual_implicits local ref ?enriching l =
+ match l with
+ | [] -> ()
+ | _ -> declare_manual_implicits local ref ?enriching l
+
+(* TODO: either turn these warnings on and document them, or handle these cases sensibly *)
+
+let warn_set_maximal_deprecated =
+ CWarnings.create ~name:"set-maximal-deprecated" ~category:"deprecated"
+ (fun i -> strbrk ("Argument number " ^ string_of_int i ^ " is a trailing implicit so must be maximal"))
+
+type implicit_kind = Implicit | MaximallyImplicit | NotImplicit
+
+let compute_implicit_statuses autoimps l =
+ let rec aux i = function
+ | _ :: autoimps, NotImplicit :: manualimps -> None :: aux (i+1) (autoimps, manualimps)
+ | Name id :: autoimps, MaximallyImplicit :: manualimps ->
+ Some (id, Manual, (true, true)) :: aux (i+1) (autoimps, manualimps)
+ | Name id :: autoimps, Implicit :: manualimps ->
+ let imps' = aux (i+1) (autoimps, manualimps) in
+ let max = set_maximality imps' false in
+ if max then warn_set_maximal_deprecated i;
+ Some (id, Manual, (max, true)) :: imps'
+ | Anonymous :: _, (Implicit | MaximallyImplicit) :: _ ->
+ user_err ~hdr:"set_implicits"
+ (strbrk ("Argument number " ^ string_of_int i ^ " (anonymous in original definition) cannot be declared implicit."))
+ | autoimps, [] -> List.map (fun _ -> None) autoimps
+ | [], _::_ -> assert false
+ in aux 0 (autoimps, l)
+
+let set_implicits local ref l =
+ let flags = !implicit_args in
+ let env = Global.env () in
+ let sigma = Evd.from_env env in
+ let t, _ = Typeops.type_of_global_in_context env ref in
+ let t = of_constr t in
+ let autoimpls = compute_implicits_names env sigma t in
let l' = match l with
| [] -> assert false
| [l] ->
- [DefaultImpArgs, set_manual_implicits flags enriching autoimpls l]
+ [DefaultImpArgs, compute_implicit_statuses autoimpls l]
| _ ->
check_rigidity (is_rigid env sigma t);
- let l = List.map (fun imps -> (imps,List.length imps)) l in
+ (* Sort by number of implicits, decreasing *)
+ let is_implicit = function
+ | NotImplicit -> false
+ | _ -> true in
+ let l = List.map (fun imps -> (imps,List.count is_implicit imps)) l in
let l = List.sort (fun (_,n1) (_,n2) -> n2 - n1) l in
check_inclusion l;
let nargs = List.length autoimpls in
List.map (fun (imps,n) ->
(LessArgsThan (nargs-n),
- set_manual_implicits flags enriching autoimpls imps)) l in
+ compute_implicit_statuses autoimpls imps)) l in
let req =
if is_local local ref then ImplLocal
else ImplInteractive(ref,flags,ImplManual (List.length autoimpls))
in add_anonymous_leaf (inImplicits (req,[ref,l']))
-let maybe_declare_manual_implicits local ref ?enriching l =
- match l with
- | [] -> ()
- | _ -> declare_manual_implicits local ref ?enriching [l]
-
let extract_impargs_data impls =
let rec aux p = function
| (DefaultImpArgs, imps)::_ -> [None,imps]
diff --git a/interp/impargs.mli b/interp/impargs.mli
index 43c26b024f..0070423530 100644
--- a/interp/impargs.mli
+++ b/interp/impargs.mli
@@ -112,13 +112,20 @@ val declare_implicits : bool -> GlobRef.t -> unit
Unsets implicits if [l] is empty. *)
val declare_manual_implicits : bool -> GlobRef.t -> ?enriching:bool ->
- manual_implicits list -> unit
+ manual_implicits -> unit
(** If the list is empty, do nothing, otherwise declare the implicits. *)
val maybe_declare_manual_implicits : bool -> GlobRef.t -> ?enriching:bool ->
manual_implicits -> unit
+type implicit_kind = Implicit | MaximallyImplicit | NotImplicit
+
+(** [set_implicits local ref l]
+ Manual declaration of implicit arguments.
+ `l` is a list of possible sequences of implicit statuses. *)
+val set_implicits : bool -> GlobRef.t -> implicit_kind list list -> unit
+
val implicits_of_global : GlobRef.t -> implicits_list list
val extract_impargs_data :
diff --git a/interp/implicit_quantifiers.ml b/interp/implicit_quantifiers.ml
index 4f3037b1fc..854651e7b7 100644
--- a/interp/implicit_quantifiers.ml
+++ b/interp/implicit_quantifiers.ml
@@ -10,6 +10,7 @@
(*i*)
open Names
+open Context
open Decl_kinds
open CErrors
open Util
@@ -175,10 +176,10 @@ let combine_params avoid fn applied needed =
match app, need with
[], [] -> List.rev ids, avoid
- | app, (_, (LocalAssum (Name id, _) | LocalDef (Name id, _, _))) :: need when Id.List.mem_assoc id named ->
+ | app, (_, (LocalAssum ({binder_name=Name id}, _) | LocalDef ({binder_name=Name id}, _, _))) :: need when Id.List.mem_assoc id named ->
aux (Id.List.assoc id named :: ids) avoid app need
- | (x, None) :: app, (None, (LocalAssum (Name id, _) | LocalDef (Name id, _, _))) :: need ->
+ | (x, None) :: app, (None, (LocalAssum ({binder_name=Name id}, _) | LocalDef ({binder_name=Name id}, _, _))) :: need ->
aux (x :: ids) avoid app need
| _, (Some cl, _ as d) :: need ->