aboutsummaryrefslogtreecommitdiffhomepage
path: root/pretyping/term_dnet.ml
diff options
context:
space:
mode:
Diffstat (limited to 'pretyping/term_dnet.ml')
-rw-r--r--pretyping/term_dnet.ml102
1 files changed, 51 insertions, 51 deletions
diff --git a/pretyping/term_dnet.ml b/pretyping/term_dnet.ml
index 4c6c5e631..f47485780 100644
--- a/pretyping/term_dnet.ml
+++ b/pretyping/term_dnet.ml
@@ -20,9 +20,9 @@ open Pp (* debug *)
(* Representation/approximation of terms to use in the dnet:
- *
+ *
* - no meta or evar (use ['a pattern] for that)
- *
+ *
* - [Rel]s and [Sort]s are not taken into account (that's why we need
* a second pass of linear filterin on the results - it's not a perfect
* term indexing structure)
@@ -52,7 +52,7 @@ struct
| DNil
type dconstr = dconstr t
-
+
(* debug *)
let rec pr_dconstr f : 'a t -> std_ppcmds = function
| DRel -> str "*"
@@ -64,7 +64,7 @@ struct
| DCase (_,t1,t2,ta) -> str "case"
| DFix _ -> str "fix"
| DCoFix _ -> str "cofix"
- | DCons ((t,dopt),tl) -> f t ++ (match dopt with
+ | DCons ((t,dopt),tl) -> f t ++ (match dopt with
Some t' -> str ":=" ++ f t'
| None -> str "") ++ spc() ++ str "::" ++ spc() ++ f tl
| DNil -> str "[]"
@@ -116,10 +116,10 @@ struct
then invalid_arg "fold2:compare" else
match c1,c2 with
| (DRel, DRel | DNil, DNil | DSort, DSort | DRef _, DRef _) -> acc
- | (DCtx (c1,t1), DCtx (c2,t2)
+ | (DCtx (c1,t1), DCtx (c2,t2)
| DApp (c1,t1), DApp (c2,t2)
| DLambda (c1,t1), DLambda (c2,t2)) -> f (f acc c1 c2) t1 t2
- | DCase (ci,p1,c1,bl1),DCase (_,p2,c2,bl2) ->
+ | DCase (ci,p1,c1,bl1),DCase (_,p2,c2,bl2) ->
array_fold_left2 f (f (f acc p1 p2) c1 c2) bl1 bl2
| DFix (ia,i,ta1,ca1), DFix (_,_,ta2,ca2) ->
array_fold_left2 f (array_fold_left2 f acc ta1 ta2) ca1 ca2
@@ -129,7 +129,7 @@ struct
f (Option.fold_left2 f (f acc t1 t2) topt1 topt2) u1 u2
| _ -> assert false
- let map2 (f:'a -> 'b -> 'c) (c1:'a t) (c2:'b t) : 'c t =
+ let map2 (f:'a -> 'b -> 'c) (c1:'a t) (c2:'b t) : 'c t =
let head w = map (fun _ -> ()) w in
if compare (head c1) (head c2) <> 0
then invalid_arg "map2_t:compare" else
@@ -139,29 +139,29 @@ struct
| DCtx (c1,t1), DCtx (c2,t2) -> DCtx (f c1 c2, f t1 t2)
| DLambda (t1,c1), DLambda (t2,c2) -> DLambda (f t1 t2, f c1 c2)
| DApp (t1,u1), DApp (t2,u2) -> DApp (f t1 t2,f u1 u2)
- | DCase (ci,p1,c1,bl1), DCase (_,p2,c2,bl2) ->
+ | DCase (ci,p1,c1,bl1), DCase (_,p2,c2,bl2) ->
DCase (ci, f p1 p2, f c1 c2, array_map2 f bl1 bl2)
| DFix (ia,i,ta1,ca1), DFix (_,_,ta2,ca2) ->
DFix (ia,i,array_map2 f ta1 ta2,array_map2 f ca1 ca2)
| DCoFix (i,ta1,ca1), DCoFix (_,ta2,ca2) ->
DCoFix (i,array_map2 f ta1 ta2,array_map2 f ca1 ca2)
- | DCons ((t1,topt1),u1), DCons ((t2,topt2),u2) ->
+ | DCons ((t1,topt1),u1), DCons ((t2,topt2),u2) ->
DCons ((f t1 t2,Option.lift2 f topt1 topt2), f u1 u2)
| _ -> assert false
let terminal = function
| (DRel | DSort | DNil | DRef _) -> true
- | _ -> false
+ | _ -> false
end
-
+
(*
* Terms discrimination nets
* Uses the general dnet datatype on DTerm.t
* (here you can restart reading)
*)
-(*
- * Construction of the module
+(*
+ * Construction of the module
*)
module type IDENT =
@@ -185,7 +185,7 @@ struct
module TDnet : Dnet.S with type ident=Ident.t
and type 'a structure = 'a DTerm.t
- and type meta = metavariable
+ and type meta = metavariable
= Dnet.Make(DTerm)(Ident)
(struct
type t = metavariable
@@ -193,20 +193,20 @@ struct
end)
type t = TDnet.t
-
+
type ident = TDnet.ident
-
+
type 'a pattern = 'a TDnet.pattern
type term_pattern = term_pattern DTerm.t pattern
-
+
type idset = TDnet.Idset.t
type result = ident * (constr*existential_key) * Termops.subst
open DTerm
open TDnet
-
- let rec pat_of_constr c : term_pattern =
+
+ let rec pat_of_constr c : term_pattern =
match kind_of_term c with
| Rel _ -> Term DRel
| Sort _ -> Term DSort
@@ -216,46 +216,46 @@ struct
| Construct c -> Term (DRef (ConstructRef c))
| Term.Meta _ -> assert false
| Evar (i,_) -> Meta i
- | Case (ci,c1,c2,ca) ->
+ | Case (ci,c1,c2,ca) ->
Term(DCase(ci,pat_of_constr c1,pat_of_constr c2,Array.map pat_of_constr ca))
- | Fix ((ia,i),(_,ta,ca)) ->
+ | Fix ((ia,i),(_,ta,ca)) ->
Term(DFix(ia,i,Array.map pat_of_constr ta, Array.map pat_of_constr ca))
- | CoFix (i,(_,ta,ca)) ->
+ | CoFix (i,(_,ta,ca)) ->
Term(DCoFix(i,Array.map pat_of_constr ta,Array.map pat_of_constr ca))
| Cast (c,_,_) -> pat_of_constr c
| Lambda (_,t,c) -> Term(DLambda (pat_of_constr t, pat_of_constr c))
- | (Prod (_,_,_) | LetIn(_,_,_,_)) ->
+ | (Prod (_,_,_) | LetIn(_,_,_,_)) ->
let (ctx,c) = ctx_of_constr (Term DNil) c in Term (DCtx (ctx,c))
- | App (f,ca) ->
+ | App (f,ca) ->
Array.fold_left (fun c a -> Term (DApp (c,a)))
(pat_of_constr f) (Array.map pat_of_constr ca)
- and ctx_of_constr ctx c : term_pattern * term_pattern =
+ and ctx_of_constr ctx c : term_pattern * term_pattern =
match kind_of_term c with
| Prod (_,t,c) -> ctx_of_constr (Term(DCons((pat_of_constr t,None),ctx))) c
| LetIn(_,d,t,c) -> ctx_of_constr (Term(DCons((pat_of_constr t, Some (pat_of_constr d)),ctx))) c
| _ -> ctx,pat_of_constr c
-
+
let empty_ctx : term_pattern -> term_pattern = function
| Meta _ as c -> c
| Term (DCtx(_,_)) as c -> c
| c -> Term (DCtx (Term DNil, c))
-
- (*
+
+ (*
* Basic primitives
*)
let empty = TDnet.empty
-
- let subst s t =
+
+ let subst s t =
let sleaf id = Ident.subst s id in
let snode = function
| DTerm.DRef gr -> DTerm.DRef (fst (subst_global s gr))
| n -> n in
TDnet.map sleaf snode t
-
+
let union = TDnet.union
-
+
let add (c:constr) (id:Ident.t) (dn:t) =
let c = Opt.reduce c in
let c = empty_ctx (pat_of_constr c) in
@@ -264,11 +264,11 @@ struct
let new_meta_no =
let ctr = ref 0 in
fun () -> decr ctr; !ctr
-
+
let new_meta_no = Evarutil.new_untyped_evar
let neutral_meta = new_meta_no()
-
+
let new_meta () = Meta (new_meta_no())
let new_evar () = mkEvar(new_meta_no(),[||])
@@ -292,19 +292,19 @@ struct
let subst_evar i c = e_subst_evar i (fun _ -> c)
(* debug *)
- let rec pr_term_pattern p =
- (fun pr_t -> function
+ let rec pr_term_pattern p =
+ (fun pr_t -> function
| Term t -> pr_t t
| Meta m -> str"["++Util.pr_int (Obj.magic m)++str"]"
) (pr_dconstr pr_term_pattern) p
- let search_pat cpat dpat dn (up,plug) =
+ let search_pat cpat dpat dn (up,plug) =
let whole_c = subst_evar plug cpat up in
TDnet.Idset.fold
- (fun id acc ->
+ (fun id acc ->
let c_id = Opt.reduce (Ident.constr_of id) in
- let (ctx,wc) =
- try Termops.align_prod_letin whole_c c_id
+ let (ctx,wc) =
+ try Termops.align_prod_letin whole_c c_id
with Invalid_argument _ -> [],c_id in
let up = it_mkProd_or_LetIn up ctx in
let wc,whole_c = if Opt.direction then whole_c,wc else wc,whole_c in
@@ -326,11 +326,11 @@ struct
let fold_pattern_up f acc dpat cpat dn (up,plug) =
fold_pattern_nonlin
( fun m dn acc ->
- f dn (subst_evar plug (e_subst_evar neutral_meta new_evar cpat) up, m) acc
+ f dn (subst_evar plug (e_subst_evar neutral_meta new_evar cpat) up, m) acc
) acc dpat dn
- let possibly_under pat k dn (up,plug) =
- let rec aux fst dn (up,plug) acc =
+ let possibly_under pat k dn (up,plug) =
+ let rec aux fst dn (up,plug) acc =
let cpat = pat() in
let dpat = pat_of_constr cpat in
let dpat = if fst then empty_ctx dpat else dpat in
@@ -345,24 +345,24 @@ struct
* High-level primitives describing specific search problems
*)
- let search_pattern dn pat =
+ let search_pattern dn pat =
let pat = Opt.reduce pat in
search_pat pat (empty_ctx (pat_of_constr pat)) dn init
-
+
let search_concl dn pat =
let pat = Opt.reduce pat in
search_pat pat (under_prod (empty_ctx (pat_of_constr pat))) dn init
- let search_eq_concl dn eq pat =
+ let search_eq_concl dn eq pat =
let pat = Opt.reduce pat in
let eq_pat = eq_pat eq () in
let eq_dpat = under_prod (empty_ctx (pat_of_constr eq_pat)) in
snd (fold_pattern_up
- (fun dn up acc ->
+ (fun dn up acc ->
search_pat pat (pat_of_constr pat) dn up @ acc
) [] eq_dpat eq_pat dn init)
-
- let search_head_concl dn pat =
+
+ let search_head_concl dn pat =
let pat = Opt.reduce pat in
possibly_under app_pat (search_pat pat (pat_of_constr pat)) dn init
@@ -370,12 +370,12 @@ struct
let map f dn = TDnet.map f (fun x -> x) dn
end
-
+
module type S =
sig
type t
type ident
-
+
type result = ident * (constr*existential_key) * Termops.subst
val empty : t