aboutsummaryrefslogtreecommitdiff
path: root/plugins/subtac/eterm.ml
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/subtac/eterm.ml')
-rw-r--r--plugins/subtac/eterm.ml68
1 files changed, 45 insertions, 23 deletions
diff --git a/plugins/subtac/eterm.ml b/plugins/subtac/eterm.ml
index 3c947e29cf..d9b73109a2 100644
--- a/plugins/subtac/eterm.ml
+++ b/plugins/subtac/eterm.ml
@@ -1,4 +1,4 @@
-(* -*- compile-command: "make -C ../.. bin/coqtop.byte" -*- *)
+(* -*- compile-command: "make -C ../.. plugins/subtac/subtac_plugin.cma" -*- *)
(**
- Get types of existentials ;
- Flatten dependency tree (prefix order) ;
@@ -30,13 +30,13 @@ type oblinfo =
ev_chop: int option;
ev_loc: Util.loc;
ev_typ: types;
- ev_tac: Tacexpr.raw_tactic_expr option;
+ ev_tac: tactic option;
ev_deps: Intset.t }
(** Substitute evar references in t using De Bruijn indices,
where n binders were passed through. *)
-let subst_evar_constr evs n t =
+let subst_evar_constr evs n idf t =
let seen = ref Intset.empty in
let transparent = ref Idset.empty in
let evar_info id = List.assoc id evs in
@@ -70,7 +70,7 @@ let subst_evar_constr evs n t =
in
if List.exists (fun x -> match kind_of_term x with Rel n -> List.mem n fixrels | _ -> false) args then
transparent := Idset.add idstr !transparent;
- mkApp (mkVar idstr, Array.of_list args)
+ mkApp (idf idstr, Array.of_list args)
| Fix _ ->
map_constr_with_binders succfix substrec (depth, 1 :: fixrels) c
| _ -> map_constr_with_binders succfix substrec (depth, fixrels) c
@@ -96,14 +96,14 @@ let subst_vars acc n t =
let etype_of_evar evs hyps concl =
let rec aux acc n = function
(id, copt, t) :: tl ->
- let t', s, trans = subst_evar_constr evs n t in
+ let t', s, trans = subst_evar_constr evs n mkVar t in
let t'' = subst_vars acc 0 t' in
let rest, s', trans' = aux (id :: acc) (succ n) tl in
let s' = Intset.union s s' in
let trans' = Idset.union trans trans' in
(match copt with
- Some c ->
- let c', s'', trans'' = subst_evar_constr evs n c in
+ Some c ->
+ let c', s'', trans'' = subst_evar_constr evs n mkVar c in
let c' = subst_vars acc 0 c' in
mkNamedProd_or_LetIn (id, Some c', t'') rest,
Intset.union s'' s',
@@ -111,7 +111,7 @@ let etype_of_evar evs hyps concl =
| None ->
mkNamedProd_or_LetIn (id, None, t'') rest, s', trans')
| [] ->
- let t', s, trans = subst_evar_constr evs n concl in
+ let t', s, trans = subst_evar_constr evs n mkVar concl in
subst_vars acc 0 t', s, trans
in aux [] 0 (rev hyps)
@@ -143,13 +143,33 @@ let evar_dependencies evm ev =
in aux (Intset.singleton ev)
let sort_dependencies evl =
- List.sort (fun (_, _, deps) (_, _, deps') ->
- if Intset.subset deps deps' then (* deps' depends on deps *) -1
- else if Intset.subset deps' deps then 1
- else Intset.compare deps deps')
- evl
-
-let eterm_obligations env name isevars evm fs ?status t ty =
+ let one_step deps ine oute =
+ List.fold_left (fun (ine, oute, acc) (id, _, deps' as d) ->
+ if not (Intset.mem id deps) then
+ if Intset.subset deps' (Intset.add id deps) then
+ (d :: ine, oute, Intset.add id acc)
+ else (ine, d :: oute, acc)
+ else (ine, oute, acc))
+ (ine, [], deps) oute
+ in
+ let rec aux deps evsin evsout =
+ let (evsin, evsout, deps') = one_step deps evsin evsout in
+ if evsout = [] then List.rev evsin
+ else aux deps' evsin evsout
+ in aux Intset.empty [] evl
+
+let map_evar_body f = function
+ | Evar_empty -> Evar_empty
+ | Evar_defined c -> Evar_defined (f c)
+
+open Environ
+
+let map_evar_info f evi =
+ { evi with evar_hyps = val_of_named_context (map_named_context f (named_context_of_val evi.evar_hyps));
+ evar_concl = f evi.evar_concl;
+ evar_body = map_evar_body f evi.evar_body }
+
+let eterm_obligations env name isevars evm fs ?status t ty =
(* 'Serialize' the evars *)
let nc = Environ.named_context env in
let nc_len = Sign.named_context_length nc in
@@ -188,7 +208,8 @@ let eterm_obligations env name isevars evm fs ?status t ty =
let tac = match ev.evar_extra with
| Some t ->
if Dyn.tag t = "tactic" then
- Some (Tacinterp.globTacticIn (Tacinterp.tactic_out t))
+ Some (Tacinterp.interp
+ (Tacinterp.globTacticIn (Tacinterp.tactic_out t)))
else None
| None -> None
in
@@ -199,11 +220,11 @@ let eterm_obligations env name isevars evm fs ?status t ty =
evn []
in
let t', _, transparent = (* Substitute evar refs in the term by variables *)
- subst_evar_constr evts 0 t
+ subst_evar_constr evts 0 mkVar t
in
- let ty, _, _ = subst_evar_constr evts 0 ty in
- let evars =
- List.map (fun (_, info) ->
+ let ty, _, _ = subst_evar_constr evts 0 mkVar ty in
+ let evars =
+ List.map (fun (ev, info) ->
let { ev_name = (_, name); ev_status = status;
ev_loc = loc; ev_typ = typ; ev_deps = deps; ev_tac = tac } = info
in
@@ -211,8 +232,9 @@ let eterm_obligations env name isevars evm fs ?status t ty =
| Define true when Idset.mem name transparent -> Define false
| _ -> status
in name, typ, loc, status, deps, tac) evts
- in Array.of_list (List.rev evars), t', ty
+ in
+ let evnames = List.map (fun (ev, info) -> ev, snd info.ev_name) evts in
+ let evmap f c = pi1 (subst_evar_constr evts 0 f c) in
+ Array.of_list (List.rev evars), (evnames, evmap), t', ty
let mkMetas n = list_tabulate (fun _ -> Evarutil.mk_new_meta ()) n
-
-let etermtac (evm, t) = assert(false) (*eterm evm t None *)