X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Ftactics%2FproofEngineHelpers.ml;h=22b6c8487a8348d74a80f896c501a26f3263aba1;hb=91a095f0686ee569ba035e4e30c7d071588cb8e7;hp=4bb46fc4c011c491abfd316271b6e2b968137413;hpb=a3ed9ca5ff6563d05d2940727e4fa335fdaaeb0f;p=helm.git diff --git a/helm/ocaml/tactics/proofEngineHelpers.ml b/helm/ocaml/tactics/proofEngineHelpers.ml index 4bb46fc4c..22b6c8487 100644 --- a/helm/ocaml/tactics/proofEngineHelpers.ml +++ b/helm/ocaml/tactics/proofEngineHelpers.ml @@ -554,15 +554,17 @@ exception Fail of string in subst,metasenv,ugraph,context_terms, ty_terms -(** locate_in_term what where -* [what] must be a physical pointer to a subterm of [where] -* It returns the context of [what] in [where] *) -let locate_in_term what ~where = +(** locate_in_term equality what where context +* [what] must match a subterm of [where] according to [equality] +* It returns the matched terms together with their contexts in [where] +* [equality] defaults to physical equality +* [context] must be the context of [where] +*) +let locate_in_term ?(equality=(==))what ~where context = let add_ctx context name entry = - (Some (name, entry)) :: context - in + (Some (name, entry)) :: context in let rec aux context where = - if what == where then context + if equality what where then [context,where] else match where with | Cic.Implicit _ @@ -603,8 +605,36 @@ let locate_in_term what ~where = and auxs context tl = (* as aux for list of terms *) List.concat (List.map (fun t -> aux context t) tl) in - aux [] where + aux context where +(** locate_in_term equality what where context +* [what] must match a subterm of [where] according to [equality] +* It returns the matched terms together with their contexts in [where] +* [equality] defaults to physical equality +* [context] must be the context of [where] +*) +let locate_in_conjecture ?(equality=(==)) what (_,context,ty) = + let context,res = + List.fold_right + (fun entry (context,res) -> + match entry with + None -> entry::context, res + | Some (_, Cic.Decl ty) -> + let res = res @ locate_in_term what ~where:ty context in + let context' = entry::context in + context',res + | Some (_, Cic.Def (bo,ty)) -> + let res = res @ locate_in_term what ~where:bo context in + let res = + match ty with + None -> res + | Some ty -> + res @ locate_in_term what ~where:ty context in + let context' = entry::context in + context',res + ) context ([],[]) + in + res @ locate_in_term what ~where:ty context (* saturate_term newmeta metasenv context ty *) (* Given a type [ty] (a backbone), it returns its head and a new metasenv in *)