diff options
author | filliatr <filliatr@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2000-11-24 14:21:15 +0000 |
---|---|---|
committer | filliatr <filliatr@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2000-11-24 14:21:15 +0000 |
commit | 6e3c29e69a7157dbe00055a19d56c184ee9aac71 (patch) | |
tree | 79f233ee0f77fce0ac87a7c9e7c5a66d9455bfc5 | |
parent | 158a4ca82067adc42cd25b90e46bad1dd3c1f74a (diff) |
SearchPattern et SearchRewrite
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@943 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r-- | .depend | 82 | ||||
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | parsing/g_basevernac.ml4 | 9 | ||||
-rw-r--r-- | parsing/pretty.ml | 63 | ||||
-rw-r--r-- | parsing/pretty.mli | 2 | ||||
-rw-r--r-- | parsing/search.ml | 175 | ||||
-rw-r--r-- | parsing/search.mli | 17 | ||||
-rw-r--r-- | toplevel/vernacentries.ml | 42 |
8 files changed, 306 insertions, 89 deletions
@@ -71,6 +71,8 @@ parsing/pretty.cmi: kernel/declarations.cmi kernel/environ.cmi \ parsing/printer.cmi: parsing/coqast.cmi kernel/environ.cmi kernel/names.cmi \ parsing/pattern.cmi lib/pp.cmi pretyping/rawterm.cmi kernel/sign.cmi \ kernel/term.cmi +parsing/search.cmi: kernel/environ.cmi parsing/pattern.cmi lib/pp.cmi \ + kernel/term.cmi parsing/termast.cmi: parsing/coqast.cmi kernel/environ.cmi kernel/names.cmi \ parsing/pattern.cmi pretyping/rawterm.cmi kernel/sign.cmi kernel/term.cmi pretyping/cases.cmi: kernel/environ.cmi pretyping/evarutil.cmi kernel/evd.cmi \ @@ -439,6 +441,14 @@ parsing/extend.cmo: parsing/ast.cmi parsing/coqast.cmi parsing/lexer.cmi \ parsing/pcoq.cmi lib/pp.cmi lib/util.cmi parsing/extend.cmi parsing/extend.cmx: parsing/ast.cmx parsing/coqast.cmx parsing/lexer.cmx \ parsing/pcoq.cmx lib/pp.cmx lib/util.cmx parsing/extend.cmi +parsing/g_basevernac.cmo: parsing/ast.cmi parsing/coqast.cmi parsing/pcoq.cmi \ + toplevel/vernac.cmi +parsing/g_basevernac.cmx: parsing/ast.cmx parsing/coqast.cmx parsing/pcoq.cmx \ + toplevel/vernac.cmx +parsing/g_cases.cmo: parsing/coqast.cmi parsing/pcoq.cmi +parsing/g_cases.cmx: parsing/coqast.cmx parsing/pcoq.cmx +parsing/g_constr.cmo: parsing/ast.cmi parsing/coqast.cmi parsing/pcoq.cmi +parsing/g_constr.cmx: parsing/ast.cmx parsing/coqast.cmx parsing/pcoq.cmx parsing/g_natsyntax.cmo: parsing/ast.cmi parsing/astterm.cmi \ parsing/coqast.cmi parsing/esyntax.cmi kernel/names.cmi parsing/pcoq.cmi \ lib/pp.cmi lib/util.cmi parsing/g_natsyntax.cmi @@ -447,12 +457,24 @@ parsing/g_natsyntax.cmx: parsing/ast.cmx parsing/astterm.cmx \ lib/pp.cmx lib/util.cmx parsing/g_natsyntax.cmi parsing/g_prim.cmo: parsing/coqast.cmi parsing/pcoq.cmi toplevel/vernac.cmi parsing/g_prim.cmx: parsing/coqast.cmx parsing/pcoq.cmx toplevel/vernac.cmx +parsing/g_proofs.cmo: parsing/coqast.cmi parsing/pcoq.cmi lib/pp.cmi \ + lib/util.cmi toplevel/vernac.cmi +parsing/g_proofs.cmx: parsing/coqast.cmx parsing/pcoq.cmx lib/pp.cmx \ + lib/util.cmx toplevel/vernac.cmx parsing/g_rsyntax.cmo: parsing/ast.cmi parsing/astterm.cmi parsing/coqast.cmi \ parsing/esyntax.cmi kernel/names.cmi parsing/pcoq.cmi lib/pp.cmi \ lib/util.cmi parsing/g_rsyntax.cmx: parsing/ast.cmx parsing/astterm.cmx parsing/coqast.cmx \ parsing/esyntax.cmx kernel/names.cmx parsing/pcoq.cmx lib/pp.cmx \ lib/util.cmx +parsing/g_tactic.cmo: parsing/ast.cmi parsing/coqast.cmi parsing/pcoq.cmi \ + lib/pp.cmi lib/util.cmi +parsing/g_tactic.cmx: parsing/ast.cmx parsing/coqast.cmx parsing/pcoq.cmx \ + lib/pp.cmx lib/util.cmx +parsing/g_vernac.cmo: parsing/coqast.cmi parsing/pcoq.cmi lib/pp.cmi \ + lib/util.cmi toplevel/vernac.cmi +parsing/g_vernac.cmx: parsing/coqast.cmx parsing/pcoq.cmx lib/pp.cmx \ + lib/util.cmx toplevel/vernac.cmx parsing/g_zsyntax.cmo: parsing/ast.cmi parsing/astterm.cmi parsing/coqast.cmi \ parsing/esyntax.cmi kernel/names.cmi parsing/pcoq.cmi lib/pp.cmi \ lib/util.cmi parsing/g_zsyntax.cmi @@ -474,17 +496,17 @@ parsing/pcoq.cmx: parsing/coqast.cmx parsing/lexer.cmx lib/pp.cmx \ parsing/pretty.cmo: pretyping/classops.cmi kernel/declarations.cmi \ library/declare.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \ library/impargs.cmi kernel/inductive.cmi kernel/instantiate.cmi \ - library/lib.cmi library/libobject.cmi library/library.cmi \ - kernel/names.cmi lib/pp.cmi parsing/printer.cmi kernel/reduction.cmi \ - kernel/sign.cmi pretyping/syntax_def.cmi kernel/term.cmi \ - kernel/typeops.cmi lib/util.cmi parsing/pretty.cmi + library/lib.cmi library/libobject.cmi kernel/names.cmi lib/pp.cmi \ + parsing/printer.cmi kernel/reduction.cmi kernel/sign.cmi \ + pretyping/syntax_def.cmi kernel/term.cmi kernel/typeops.cmi lib/util.cmi \ + parsing/pretty.cmi parsing/pretty.cmx: pretyping/classops.cmx kernel/declarations.cmx \ library/declare.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \ library/impargs.cmx kernel/inductive.cmx kernel/instantiate.cmx \ - library/lib.cmx library/libobject.cmx library/library.cmx \ - kernel/names.cmx lib/pp.cmx parsing/printer.cmx kernel/reduction.cmx \ - kernel/sign.cmx pretyping/syntax_def.cmx kernel/term.cmx \ - kernel/typeops.cmx lib/util.cmx parsing/pretty.cmi + library/lib.cmx library/libobject.cmx kernel/names.cmx lib/pp.cmx \ + parsing/printer.cmx kernel/reduction.cmx kernel/sign.cmx \ + pretyping/syntax_def.cmx kernel/term.cmx kernel/typeops.cmx lib/util.cmx \ + parsing/pretty.cmi parsing/printer.cmo: parsing/ast.cmi parsing/coqast.cmi library/declare.cmi \ kernel/environ.cmi parsing/esyntax.cmi parsing/extend.cmi \ library/global.cmi kernel/names.cmi lib/options.cmi parsing/pattern.cmi \ @@ -497,6 +519,18 @@ parsing/printer.cmx: parsing/ast.cmx parsing/coqast.cmx library/declare.cmx \ lib/util.cmx parsing/printer.cmi parsing/q_coqast.cmo: parsing/coqast.cmi parsing/pcoq.cmi parsing/q_coqast.cmx: parsing/coqast.cmx parsing/pcoq.cmx +parsing/search.cmo: parsing/astterm.cmi parsing/coqast.cmi \ + kernel/declarations.cmi library/declare.cmi kernel/environ.cmi \ + kernel/evd.cmi library/global.cmi library/libobject.cmi \ + library/library.cmi kernel/names.cmi library/nametab.cmi \ + parsing/pattern.cmi lib/pp.cmi parsing/pretty.cmi parsing/printer.cmi \ + kernel/term.cmi pretyping/typing.cmi lib/util.cmi parsing/search.cmi +parsing/search.cmx: parsing/astterm.cmx parsing/coqast.cmx \ + kernel/declarations.cmx library/declare.cmx kernel/environ.cmx \ + kernel/evd.cmx library/global.cmx library/libobject.cmx \ + library/library.cmx kernel/names.cmx library/nametab.cmx \ + parsing/pattern.cmx lib/pp.cmx parsing/pretty.cmx parsing/printer.cmx \ + kernel/term.cmx pretyping/typing.cmx lib/util.cmx parsing/search.cmi parsing/termast.cmo: parsing/ast.cmi pretyping/classops.cmi \ parsing/coqast.cmi library/declare.cmi pretyping/detyping.cmi \ kernel/environ.cmi library/impargs.cmi kernel/inductive.cmi \ @@ -929,6 +963,12 @@ tactics/tactics.cmx: parsing/astterm.cmx proofs/clenv.cmx \ kernel/reduction.cmx kernel/sign.cmx lib/stamps.cmx proofs/tacinterp.cmx \ proofs/tacmach.cmx pretyping/tacred.cmx tactics/tacticals.cmx \ kernel/term.cmx lib/util.cmx tactics/tactics.cmi +tactics/tauto.cmo: parsing/ast.cmi parsing/coqast.cmi tactics/hipattern.cmi \ + kernel/names.cmi lib/pp.cmi proofs/proof_type.cmi proofs/tacinterp.cmi \ + proofs/tacmach.cmi tactics/tacticals.cmi tactics/tactics.cmi +tactics/tauto.cmx: parsing/ast.cmx parsing/coqast.cmx tactics/hipattern.cmx \ + kernel/names.cmx lib/pp.cmx proofs/proof_type.cmx proofs/tacinterp.cmx \ + proofs/tacmach.cmx tactics/tacticals.cmx tactics/tactics.cmx tactics/termdn.cmo: tactics/dn.cmi kernel/names.cmi parsing/pattern.cmi \ pretyping/rawterm.cmi kernel/term.cmi lib/util.cmi tactics/termdn.cmi tactics/termdn.cmx: tactics/dn.cmx kernel/names.cmx parsing/pattern.cmx \ @@ -1081,8 +1121,8 @@ toplevel/toplevel.cmx: parsing/ast.cmx toplevel/errors.cmx toplevel/mltop.cmi \ kernel/names.cmx lib/options.cmx parsing/pcoq.cmx proofs/pfedit.cmx \ lib/pp.cmx toplevel/protectedtoplevel.cmx lib/util.cmx \ toplevel/vernac.cmx toplevel/vernacinterp.cmx toplevel/toplevel.cmi -toplevel/usage.cmo: toplevel/usage.cmi -toplevel/usage.cmx: toplevel/usage.cmi +toplevel/usage.cmo: config/coq_config.cmi toplevel/usage.cmi +toplevel/usage.cmx: config/coq_config.cmx toplevel/usage.cmi toplevel/vernac.cmo: parsing/ast.cmi parsing/coqast.cmi \ toplevel/discharge.cmi library/library.cmi lib/options.cmi \ parsing/pcoq.cmi proofs/pfedit.cmi lib/pp.cmi library/states.cmi \ @@ -1101,11 +1141,12 @@ toplevel/vernacentries.cmo: parsing/ast.cmi parsing/astterm.cmi \ lib/options.cmi proofs/pfedit.cmi lib/pp.cmi lib/pp_control.cmi \ parsing/pretty.cmi pretyping/pretype_errors.cmi parsing/printer.cmi \ proofs/proof_trees.cmi proofs/proof_type.cmi toplevel/record.cmi \ - kernel/reduction.cmi proofs/refiner.cmi lib/stamps.cmi library/states.cmi \ - pretyping/syntax_def.cmi lib/system.cmi proofs/tacinterp.cmi \ - proofs/tacmach.cmi pretyping/tacred.cmi proofs/tactic_debug.cmi \ - tactics/tactics.cmi kernel/term.cmi kernel/typeops.cmi lib/util.cmi \ - toplevel/vernacinterp.cmi toplevel/vernacentries.cmi + kernel/reduction.cmi proofs/refiner.cmi parsing/search.cmi lib/stamps.cmi \ + library/states.cmi pretyping/syntax_def.cmi lib/system.cmi \ + proofs/tacinterp.cmi proofs/tacmach.cmi pretyping/tacred.cmi \ + proofs/tactic_debug.cmi tactics/tactics.cmi kernel/term.cmi \ + kernel/typeops.cmi lib/util.cmi toplevel/vernacinterp.cmi \ + toplevel/vernacentries.cmi toplevel/vernacentries.cmx: parsing/ast.cmx parsing/astterm.cmx \ toplevel/class.cmx toplevel/command.cmx parsing/coqast.cmx \ library/declare.cmx toplevel/discharge.cmx kernel/environ.cmx \ @@ -1116,11 +1157,12 @@ toplevel/vernacentries.cmx: parsing/ast.cmx parsing/astterm.cmx \ lib/options.cmx proofs/pfedit.cmx lib/pp.cmx lib/pp_control.cmx \ parsing/pretty.cmx pretyping/pretype_errors.cmx parsing/printer.cmx \ proofs/proof_trees.cmx proofs/proof_type.cmx toplevel/record.cmx \ - kernel/reduction.cmx proofs/refiner.cmx lib/stamps.cmx library/states.cmx \ - pretyping/syntax_def.cmx lib/system.cmx proofs/tacinterp.cmx \ - proofs/tacmach.cmx pretyping/tacred.cmx proofs/tactic_debug.cmx \ - tactics/tactics.cmx kernel/term.cmx kernel/typeops.cmx lib/util.cmx \ - toplevel/vernacinterp.cmx toplevel/vernacentries.cmi + kernel/reduction.cmx proofs/refiner.cmx parsing/search.cmx lib/stamps.cmx \ + library/states.cmx pretyping/syntax_def.cmx lib/system.cmx \ + proofs/tacinterp.cmx proofs/tacmach.cmx pretyping/tacred.cmx \ + proofs/tactic_debug.cmx tactics/tactics.cmx kernel/term.cmx \ + kernel/typeops.cmx lib/util.cmx toplevel/vernacinterp.cmx \ + toplevel/vernacentries.cmi toplevel/vernacinterp.cmo: parsing/ast.cmi parsing/astterm.cmi \ toplevel/command.cmi parsing/coqast.cmi lib/dyn.cmi toplevel/himsg.cmi \ kernel/names.cmi library/nametab.cmi lib/options.cmi lib/pp.cmi \ @@ -91,7 +91,8 @@ PARSING=parsing/lexer.cmo parsing/coqast.cmo parsing/pcoq.cmo parsing/ast.cmo \ parsing/g_vernac.cmo parsing/g_proofs.cmo parsing/g_tactic.cmo \ parsing/g_constr.cmo parsing/g_cases.cmo \ parsing/extend.cmo parsing/esyntax.cmo \ - parsing/printer.cmo parsing/pretty.cmo parsing/egrammar.cmo \ + parsing/printer.cmo parsing/pretty.cmo parsing/search.cmo \ + parsing/egrammar.cmo \ parsing/g_natsyntax.cmo parsing/g_zsyntax.cmo parsing/g_rsyntax.cmo ARITHSYNTAX=parsing/g_natsyntax.cmo parsing/g_zsyntax.cmo parsing/g_rsyntax.cmo @@ -192,7 +193,7 @@ clean:: archclean:: rm -f $(COQTOPBYTE) $(COQTOPOPT) $(BESTCOQTOP) $(COQC) $(COQMKTOP) -# we provide targets for each subdirectories +# we provide targets for each subdirectory lib: $(LIB) kernel: $(KERNEL) diff --git a/parsing/g_basevernac.ml4 b/parsing/g_basevernac.ml4 index d9eaf2a0a..e5ed92ea2 100644 --- a/parsing/g_basevernac.ml4 +++ b/parsing/g_basevernac.ml4 @@ -97,6 +97,10 @@ GEXTEND Gram | IDENT "Print"; id = identarg; "." -> <:ast< (PrintId $id) >> | IDENT "Search"; id = Tactic.qualidarg; "." -> <:ast< (SEARCH $id) >> | IDENT "Inspect"; n = numarg; "." -> <:ast< (INSPECT $n) >> + | IDENT "SearchPattern"; c = constrarg; l = in_or_out_modules; "." -> + <:ast< (SearchPattern $c ($LIST $l)) >> + | IDENT "SearchRewrite"; c = constrarg; l = in_or_out_modules; "." -> + <:ast< (SearchRewrite $c ($LIST $l)) >> (* TODO: rapprocher Eval et Check *) | IDENT "Eval"; r = Tactic.red_tactic; "in"; c = constrarg; "." -> <:ast< (Eval (TACTIC_ARG (REDEXP $r)) $c) >> @@ -186,6 +190,11 @@ GEXTEND Gram [ [ IDENT "Check" -> <:ast< "CHECK" >> | "Type" -> <:ast< "PRINTTYPE" >> ] ] (* pas dans le RefMan *) ; + in_or_out_modules: + [ [ IDENT "inside"; l = ne_identarg_list -> <:ast< "inside" >> :: l + | IDENT "outside"; l = ne_identarg_list -> <:ast< "outside" >> :: l + | -> [] ] ] + ; END; (* Grammar extensions *) diff --git a/parsing/pretty.ml b/parsing/pretty.ml index ff1e7275e..7c4c40aa1 100644 --- a/parsing/pretty.ml +++ b/parsing/pretty.ml @@ -274,13 +274,6 @@ let print_full_context_typ () = print_context false (Lib.contents_after None) assume that the declaration of constructors and eliminations follows the definition of the inductive type *) -let rec head_const c = match kind_of_term c with - | IsProd (_,_,d) -> head_const d - | IsLetIn (_,_,_,d) -> head_const d - | IsApp (f,_) -> head_const f - | IsCast (d,_) -> head_const d - | _ -> c - let list_filter_vec f vec = let rec frec n lf = if n < 0 then lf @@ -291,62 +284,6 @@ let list_filter_vec f vec = in frec (Array.length vec -1) [] - (* The functions print_constructors and crible implement the behavior needed - for the Coq Search command. - These functions take as first argument the procedure - that will be called to treat each entry. This procedure receives the name - of the object, the assumptions that will make it possible to print its type, - and the constr term that represent its type. *) - -let print_constructors fn env_ar mip = - let _ = - array_map2 (fun id c -> fn (pr_id id) (* il faudrait qualifier... *) - env_ar (body_of_type c)) - mip.mind_consnames (mind_user_lc mip) - in () - -let crible (fn : std_ppcmds -> env -> constr -> unit) ref = - let env = Global.env () in - let imported = Library.opened_modules() in - let const = constr_of_reference Evd.empty env ref in - let crible_rec sp lobj = - match object_tag lobj with - | "VARIABLE" -> - let ((idc,_,typ),_,_) = get_variable sp in - if (head_const (body_of_type typ)) = const then - fn (pr_id idc) env (body_of_type typ) - | "CONSTANT" - | "PARAMETER" -> - let {const_type=typ} = Global.lookup_constant sp in - if (head_const (body_of_type typ)) = const then - fn (pr_global (ConstRef sp)) env (body_of_type typ) - | "INDUCTIVE" -> - let mib = Global.lookup_mind sp in - let arities = - array_map_to_list - (fun mip -> - (Name mip.mind_typename, None, mip.mind_nf_arity)) - mib.mind_packets in - let env_ar = push_rels arities env in - (match kind_of_term const with - | IsMutInd ((sp',tyi),_) -> - if sp=sp' then (*Suffit pas, cf les inds de Ensemble.v*) - print_constructors fn env_ar - (mind_nth_type_packet mib tyi) - | _ -> ()) - | _ -> () - in - try - Library.iter_all_segments false crible_rec - with Not_found -> - errorlabstrm "search" - [< pr_global ref; 'sPC; 'sTR "not declared" >] - -let search_by_head ref = - crible (fun pname ass_name constr -> - let pc = prterm_env ass_name constr in - mSG[< pname; 'sTR":"; pc; 'fNL >]) ref - let read_sec_context sec = let rec get_cxt in_cxt = function | ((sp,Lib.OpenedSection str) as hd)::rest -> diff --git a/parsing/pretty.mli b/parsing/pretty.mli index 0c792094b..94bdcea67 100644 --- a/parsing/pretty.mli +++ b/parsing/pretty.mli @@ -46,7 +46,5 @@ val print_coercions : unit -> std_ppcmds val print_path_between : identifier -> identifier -> std_ppcmds -val search_by_head : global_reference -> unit -val crible : (std_ppcmds -> env -> constr -> unit) -> global_reference -> unit val inspect : int -> std_ppcmds diff --git a/parsing/search.ml b/parsing/search.ml new file mode 100644 index 000000000..96d35cc46 --- /dev/null +++ b/parsing/search.ml @@ -0,0 +1,175 @@ + +(* $Id$ *) + +open Pp +open Util +open Names +open Term +open Declarations +open Libobject +open Declare +open Coqast +open Astterm +open Pretty +open Environ +open Pattern +open Printer + +(* The functions print_constructors and crible implement the behavior needed + for the Coq Search command. + These functions take as first argument the procedure + that will be called to treat each entry. This procedure receives the name + of the object, the assumptions that will make it possible to print its type, + and the constr term that represent its type. *) + +let print_constructors fn env_ar mip = + let _ = + array_map2 (fun id c -> fn (pr_id id) (* il faudrait qualifier... *) + env_ar (body_of_type c)) + mip.mind_consnames (mind_user_lc mip) + in () + +let rec head_const c = match kind_of_term c with + | IsProd (_,_,d) -> head_const d + | IsLetIn (_,_,_,d) -> head_const d + | IsApp (f,_) -> head_const f + | IsCast (d,_) -> head_const d + | _ -> c + +let crible (fn : std_ppcmds -> env -> constr -> unit) ref = + let env = Global.env () in + let imported = Library.opened_modules() in + let const = constr_of_reference Evd.empty env ref in + let crible_rec sp lobj = + match object_tag lobj with + | "VARIABLE" -> + let ((idc,_,typ),_,_) = get_variable sp in + if (head_const (body_of_type typ)) = const then + fn (pr_id idc) env (body_of_type typ) + | "CONSTANT" + | "PARAMETER" -> + let {const_type=typ} = Global.lookup_constant sp in + if (head_const (body_of_type typ)) = const then + fn (pr_global (ConstRef sp)) env (body_of_type typ) + | "INDUCTIVE" -> + let mib = Global.lookup_mind sp in + let arities = + array_map_to_list + (fun mip -> + (Name mip.mind_typename, None, mip.mind_nf_arity)) + mib.mind_packets in + let env_ar = push_rels arities env in + (match kind_of_term const with + | IsMutInd ((sp',tyi),_) -> + if sp=sp' then (*Suffit pas, cf les inds de Ensemble.v*) + print_constructors fn env_ar + (mind_nth_type_packet mib tyi) + | _ -> ()) + | _ -> () + in + try + Library.iter_all_segments false crible_rec + with Not_found -> + errorlabstrm "search" + [< pr_global ref; 'sPC; 'sTR "not declared" >] + +let search_by_head ref = + crible (fun pname ass_name constr -> + let pc = prterm_env ass_name constr in + mSG[< pname; 'sTR":"; pc; 'fNL >]) ref + +(* Fine Search. By Yves Bertot. *) + +exception No_section_path + +let rec head c = + let c = strip_outer_cast c in + match kind_of_term c with + | IsProd (_,_,c) -> head c + | _ -> c + +let constr_to_section_path c = match kind_of_term c with + | IsConst (sp,_) -> sp + | _ -> raise No_section_path + +let xor a b = (a or b) & (not (a & b)) + +let plain_display s a c = + let pc = Printer.prterm_env a c in + mSG [< s; 'sTR":"; pc; 'fNL>] + +let filter_by_module module_list accept _ _ c = + try + let sp = constr_to_section_path c in + let sl = dirpath sp in + let rec filter_aux = function + | m :: tl -> (not (List.mem m sl)) && (filter_aux tl) + | [] -> true + in + xor accept (filter_aux module_list) + with No_section_path -> + false + +let gref_eq = IndRef (make_path ["Logic"] (id_of_string "eq") CCI, 0) + +let mk_rewrite_pattern1 pattern = + PApp (PRef gref_eq, [| PMeta None; pattern; PMeta None |]) + +let mk_rewrite_pattern2 pattern = + PApp (PRef gref_eq, [| PMeta None; PMeta None; pattern |]) + +let pattern_filter pat _ a c = + try + try + Pattern.is_matching pat (head c) + with _ -> + Pattern.is_matching + pat (head (Typing.type_of (Global.env()) Evd.empty c)) + with UserError _ -> + false + +let filtered_search filter_function display_function ref = + crible + (fun s a c -> if filter_function s a c then display_function s a c) + ref + +let rec id_from_pattern = function + | PRef gr -> gr + | PVar id -> Nametab.sp_of_id CCI id + | PApp (p,_) -> id_from_pattern p + | _ -> error "the pattern is not simple enough" + +let pattern_search extra_filter display_function pat = + let name = id_from_pattern pat in + filtered_search + (fun s a c -> (pattern_filter pat s a c) & extra_filter s a c) + display_function name + +let search_rewrite extra_filter display_function pattern = + filtered_search + (fun s a c -> + ((pattern_filter (mk_rewrite_pattern1 pattern) s a c) || + (pattern_filter (mk_rewrite_pattern2 pattern) s a c)) + && extra_filter s a c) + display_function gref_eq + +let text_pattern_search extra_filter = + pattern_search extra_filter plain_display + +let text_search_rewrite extra_filter = + search_rewrite extra_filter plain_display + +let filter_by_module_from_list = function + | [], _ -> (fun _ _ _ -> true) + | l, s -> filter_by_module l (s = "inside") + +let search_modules ref inout = + filtered_search (filter_by_module_from_list inout) plain_display ref + +let search_rewrite pat inout = + text_search_rewrite (filter_by_module_from_list inout) pat + +let search_pattern pat inout = + text_pattern_search (filter_by_module_from_list inout) pat + + diff --git a/parsing/search.mli b/parsing/search.mli new file mode 100644 index 000000000..42e277a5d --- /dev/null +++ b/parsing/search.mli @@ -0,0 +1,17 @@ + +(* $Id$ *) + +open Pp +open Term +open Environ +open Pattern + +(*s Search facilities. *) + +val crible : (std_ppcmds -> env -> constr -> unit) -> global_reference -> unit + +val search_by_head : global_reference -> unit + +val search_modules : global_reference -> string list * string -> unit +val search_rewrite : Pattern.constr_pattern -> string list * string -> unit +val search_pattern : Pattern.constr_pattern -> string list * string -> unit diff --git a/toplevel/vernacentries.ml b/toplevel/vernacentries.ml index 8bf20ca69..1f0524aaf 100644 --- a/toplevel/vernacentries.ml +++ b/toplevel/vernacentries.ml @@ -888,11 +888,12 @@ let _ = | [VARG_QUALID qid] -> (fun () -> let ref = - try Nametab.locate qid + try + Nametab.locate qid with Not_found -> Pretype_errors.error_global_not_found_loc loc qid in - search_by_head ref) + Search.search_by_head ref) | _ -> bad_vernac_args "SEARCH") let _ = @@ -901,6 +902,43 @@ let _ = | [VARG_NUMBER n] -> (fun () -> mSG(inspect n)) | _ -> bad_vernac_args "INSPECT") +let string_of_id_list = + List.map (function + | VARG_IDENTIFIER s -> string_of_id s + | _ -> bad_vernac_args "string_of_id_list") + +let inside_outside = function + | (VARG_STRING s) :: l -> string_of_id_list l, s + | [] -> [], "" + | _ -> bad_vernac_args "inside/outside" + +let _ = + add "SearchModules" + (function + | (VARG_IDENTIFIER id) :: l -> + (fun () -> + let ref = Nametab.sp_of_id CCI id in + Search.search_modules ref (inside_outside l)) + | _ -> bad_vernac_args "SearchModules") + +let _ = + add "SearchRewrite" + (function + | (VARG_CONSTR c) :: l -> + (fun () -> + let _,pat = interp_constrpattern Evd.empty (Global.env()) c in + Search.search_rewrite pat (inside_outside l)) + | _ -> bad_vernac_args "SearchRewrite") + +let _ = + add "SearchPattern" + (function + | (VARG_CONSTR c) :: l -> + (fun () -> + let _,pat = interp_constrpattern Evd.empty (Global.env()) c in + Search.search_pattern pat (inside_outside l)) + | _ -> bad_vernac_args "SearchPattern") + let _ = add "SETUNDO" (function |