123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506let__coq_plugin_name="ssrsearch_plugin"let_=Mltop.add_known_module__coq_plugin_name# 7 "plugins/ssrsearch/g_search.mlg"moduleCoqConstr=ConstropenCoqConstropenConstrexpropenEvar_kindsopenGlob_termopenLtac_pluginopenNotation_opsopenNotation_termopenPcoq.PrimopenPcoq.ConstropenPpopenPpconstropenPrinteropenStdargopenSsreflect_plugin.SsrprintersopenSsreflect_plugin.SsrcommonopenSsreflect_plugin.SsrparseropenTermopsopenUtiltyperaw_glob_search_about_item=|RGlobSearchSubPatternofconstr_expr|RGlobSearchStringofLoc.t*string*stringoptionletpr_search_itemenvsigma=function|RGlobSearchString(_,s,_)->strs|RGlobSearchSubPatternp->pr_constr_exprenvsigmapletwit_ssr_searchitem=add_genarg"ssr_searchitem"pr_search_itemletpr_ssr_search_itemenvsigma___=pr_search_itemenvsigma(* Workaround the notation API that can only print notations *)letis_idents=tryCLexer.check_idents;truewith_->falseletis_ident_parts=is_ident("H"^s)letinterp_search_notation?loctagokey=leterrmsg=CErrors.user_err?loc~hdr:"interp_search_notation"msginletmk_pntnsfor_key=letn=String.lengthsinlets'=Bytes.make(n+2)' 'inletrecloopii'=ifi>=nthens',i'-2elseifs.[i]=' 'thenloop(i+1)i'elseletj=tryString.index_froms(i+1)' 'with_->ninletm=j-iinifs.[i]='\''&&i<j-2&&s.[j-1]='\''then(String.blits(i+1)s'i'(m-2);loop(j+1)(i'+m-1))elseiffor_key&&is_ident(String.subsim)then(Bytes.sets'i''_';loop(j+1)(i'+2))else(String.blitsis'i'm;loop(j+1)(i'+m+1))inloop01inlettrim_ntn(pntn,m)=(InConstrEntry,Bytes.sub_stringpntn1(max0m))inletpr_ntnntn=str"("++Notation.pr_notationntn++str")"inletpr_and_listpr=function|[x]->prx|x::lx->pr_listpr_commaprlx++pr_comma()++str"and "++prx|[]->mt()inletpr_scsc=str(ifsc=""then"independently"elsesc)inletpr_scs=function|[""]->pr_sc""|scs->str"in "++pr_and_listpr_scscsinletgenerator,pr_tag_sc=letign_=mt()inmatchokeywith|Somekey->letsc=Notation.find_delimiters_scope?lockeyinletpr_scs_in=strs_in++spc()++strsc++pr_comma()inNotation.pr_scopeignsc,pr_sc|None->Notation.pr_scopesign,igninletqtags_in=pr_tag_scs_in++qstringtag++spc()inletptag,ttag=letptag,m=mk_pntntagfalseinifm<=0thenerr(str"empty notation fragment");ptag,trim_ntn(ptag,m)inletlast=ref""andlast_sc=ref""inletscs=ref[]andntns=ref[]inletpush_scsc=match!scswith|""::scs'->scs:=""::sc::scs'|scs'->scs:=sc::scs'inletgets__=match!lastwith|"Scope "->last_sc:=s;last:=""|"Lonely notation"->last_sc:="";last:=""|"\""->letpntn,m=mk_pntnstrueinifString.string_contains~where:(Bytes.to_stringpntn)~what:(Bytes.to_stringptag)thenbeginletntn=trim_ntn(pntn,m)inmatch!ntnswith|[]->ntns:=[ntn];scs:=[!last_sc]|ntn'::_whenntn'=ntn->push_sc!last_sc|_whenntn=ttag->ntns:=ntn::!ntns;scs:=[!last_sc]|_::ntns'whenList.memntnntns'->()|ntn'::ntns'->ntns:=ntn'::ntn::ntns'end;last:=""|_->last:=sinpp_with(Format.make_formatterget(fun_->()))generator;letntn=match!ntnswith|[]->err(hov0(qtag"in"++str"does not occur in any notation"))|ntn::ntns'whenntn=ttag->ifntns'<>[]thenbeginletpr_ntns'=pr_and_listpr_ntnntns'inFeedback.msg_warning(hov4(qtag"In"++str"also occurs in "++pr_ntns'))end;ntn|[ntn]->Feedback.msg_notice(hov4(qtag"In"++str"is part of notation "++pr_ntnntn));ntn|ntns'->lete=str"occurs in"++spc()++pr_and_listpr_ntnntns'inerr(hov4(str"ambiguous: "++qtag"in"++e))inlet(nvars,body),((_,pat),osc)=match!scswith|[sc]->Notation.interp_notation?locntn(None,[sc])|scs'->tryNotation.interp_notation?locntn(None,[])with_->lete=pr_ntnntn++spc()++str"is defined "++pr_scsscs'inerr(hov4(str"ambiguous: "++pr_tag_sc"in"++e))inletsc=Option.default""oscinlet_=letm_sc=ifosc<>Nonethenstr"In "++strsc++pr_comma()elsemt()inletntn_pat=trim_ntn(mk_pntnpatfalse)inletrbody=glob_constr_of_notation_constr?locbodyinletm_body=hov0(Constrextern.without_symbolsprl_glob_constrrbody)inletm=m_sc++pr_ntnntn_pat++spc()++str"denotes "++m_bodyinFeedback.msg_notice(hov0m)inifList.length!scs>1thenletscs'=List.remove(=)sc!scsinletw=pr_ntnntn++str" is also defined "++pr_scsscs'inFeedback.msg_warning(hov4w)elseifString.string_contains~where:(sndntn)~what:" .. "thenerr(pr_ntnntn++str" is an n-ary notation");letnvars=List.filter(fun(_,(_,typ))->typ=NtnTypeConstr)nvarsinletrecsub()=function|NVarxwhenList.mem_assocxnvars->DAst.make?loc@@GPatVar(FirstOrderPatVarx)|c->glob_constr_of_notation_constr_with_binders?loc(fun_xt->(),None,x,Explicit,t)sub()cinlet_,npat=Patternops.pattern_of_glob_constr(sub()body)inSearch.GlobSearchSubPattern(Vernacexpr.Anywhere,false,npat)let(wit_ssr_search_item,ssr_search_item)=Tacentries.argument_extend~name:"ssr_search_item"{Tacentries.arg_parsing=Vernacextend.Arg_rules([(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.ntermconstr_pattern)))(funploc-># 154 "plugins/ssrsearch/g_search.mlg"RGlobSearchSubPatternp));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.ntermstring)))((Pcoq.Symbol.token(CLexer.terminal"%"))))((Pcoq.Symbol.ntermpreident)))(funkey_sloc-># 153 "plugins/ssrsearch/g_search.mlg"RGlobSearchString(loc,s,Somekey)));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.ntermstring)))(funsloc-># 152 "plugins/ssrsearch/g_search.mlg"RGlobSearchString(loc,s,None)))]);Tacentries.arg_tag=Some(Geninterp.val_tag(Genarg.topwitwit_ssr_searchitem));Tacentries.arg_intern=Tacentries.ArgInternWit(wit_ssr_searchitem);Tacentries.arg_subst=Tacentries.ArgSubstWit(wit_ssr_searchitem);Tacentries.arg_interp=Tacentries.ArgInterpWit(wit_ssr_searchitem);Tacentries.arg_printer=((funenvsigma-># 151 "plugins/ssrsearch/g_search.mlg"pr_ssr_search_itemenvsigma),(funenvsigma-># 151 "plugins/ssrsearch/g_search.mlg"pr_ssr_search_itemenvsigma),(funenvsigma-># 151 "plugins/ssrsearch/g_search.mlg"pr_ssr_search_itemenvsigma));}let_=(wit_ssr_search_item,ssr_search_item)# 157 "plugins/ssrsearch/g_search.mlg"letpr_ssr_search_argenvsigma___=letpr_item(b,p)=str(ifbthen"-"else"")++pr_search_itemenvsigmapinpr_listspcpr_itemlet(wit_ssr_search_arg,ssr_search_arg)=Tacentries.argument_extend~name:"ssr_search_arg"{Tacentries.arg_parsing=Vernacextend.Arg_rules([(Pcoq.Production.make(Pcoq.Rule.stop)(funloc-># 169 "plugins/ssrsearch/g_search.mlg"[]));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.ntermssr_search_item)))(Pcoq.Symbol.self))(funaploc-># 168 "plugins/ssrsearch/g_search.mlg"(true,p)::a));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(CLexer.terminal"-"))))((Pcoq.Symbol.ntermssr_search_item)))(Pcoq.Symbol.self))(funap_loc-># 167 "plugins/ssrsearch/g_search.mlg"(false,p)::a))]);Tacentries.arg_tag=Some(Geninterp.Val.List(Geninterp.Val.Pair((Geninterp.val_tag(Genarg.topwitwit_bool)),(Geninterp.val_tag(Genarg.topwitwit_ssr_searchitem)))));Tacentries.arg_intern=Tacentries.ArgInternWit(Genarg.ListArg(Genarg.PairArg((wit_bool),(wit_ssr_searchitem))));Tacentries.arg_subst=Tacentries.ArgSubstWit(Genarg.ListArg(Genarg.PairArg((wit_bool),(wit_ssr_searchitem))));Tacentries.arg_interp=Tacentries.ArgInterpWit(Genarg.ListArg(Genarg.PairArg((wit_bool),(wit_ssr_searchitem))));Tacentries.arg_printer=((funenvsigma-># 166 "plugins/ssrsearch/g_search.mlg"pr_ssr_search_argenvsigma),(funenvsigma-># 166 "plugins/ssrsearch/g_search.mlg"pr_ssr_search_argenvsigma),(funenvsigma-># 166 "plugins/ssrsearch/g_search.mlg"pr_ssr_search_argenvsigma));}let_=(wit_ssr_search_arg,ssr_search_arg)# 172 "plugins/ssrsearch/g_search.mlg"(* Main type conclusion pattern filter *)letrecsplay_search_patternna=function|Pattern.PApp(fp,args)->splay_search_pattern(na+Array.lengthargs)fp|Pattern.PLetIn(_,_,_,bp)->splay_search_patternnabp|Pattern.PRefhr->hr,na|_->CErrors.user_err(Pp.str"no head constant in head search pattern")letpush_rels_assumle=letl=List.map(fun(n,t)->n,EConstr.Unsafe.to_constrt)linpush_rels_assumleletcoerce_search_pattern_to_sorthpat=letenv=Global.env()inletsigma=Evd.(from_envenv)inletmkPAppfpn_impsargs=letargs'=Array.append(Array.maken_imps(Pattern.PMetaNone))argsinPattern.PApp(fp,args')inlethr,na=splay_search_pattern0hpatinletdc,ht=lethr,_=Typeops.type_of_global_in_contextenvhr(* FIXME *)inReductionops.splay_prodenvsigma(EConstr.of_constrhr)inletnp=List.lengthdcinifnp<nathenCErrors.user_err(Pp.str"too many arguments in head search pattern")elselethpat'=ifnp=nathenhpatelsemkPApphpat(np-na)[||]inletwarn()=Feedback.msg_warning(str"Listing only lemmas with conclusion matching "++pr_constr_pattern_envenvsigmahpat')inifEConstr.isSortsigmahtthenbeginwarn();true,hpat'endelseletfilter_head,coe_path=trylet_,cp=Coercionops.lookup_path_to_sort_from(push_rels_assumdcenv)sigmahtinwarn();true,cpwith_->false,[]inletcoercehpcoe_index=letcoe_ref=coe_index.Coercionops.coe_valueintryletn_imps=Option.get(Coercionops.hide_coercioncoe_ref)inmkPApp(Pattern.PRefcoe_ref)n_imps[|hp|]withNot_found|Option.IsNone->errorstrm(str"need explicit coercion "++pr_globalcoe_ref++spc()++str"to interpret head search pattern as type")infilter_head,List.fold_leftcoercehpat'coe_pathletinterp_head_pathpat=letfilter_head,p=coerce_search_pattern_to_sorthpatinletrecloopc=matchCoqConstr.kindcwith|Cast(c',_,_)->loopc'|Prod(_,_,c')->loopc'|LetIn(_,_,_,c')->loopc'|_->letenv=Global.env()inletsigma=Evd.from_envenvinConstr_matching.is_matchingenvsigmap(EConstr.of_constrc)infilter_head,loopletall_true_=trueletrecinterp_search_aboutargsaccu=matchargswith|[]->accu|(flag,arg)::rem->fungrkindenvtyp->letans=Search.search_filterarggrkindenv(Evd.from_envenv)typin(ifflagthenanselsenotans)&&interp_search_aboutremaccugrkindenvtypletinterp_search_argarg=letarg=List.map(fun(x,arg)->x,matchargwith|RGlobSearchString(loc,s,key)->ifis_ident_partsthenSearch.GlobSearchStringselseinterp_search_notation~locskey|RGlobSearchSubPatternp->letenv=Global.env()inlet_,p=Constrintern.intern_constr_patternenv(Evd.from_envenv)pinSearch.GlobSearchSubPattern(Vernacexpr.Anywhere,false,p))arginlethpat,a1=matchargwith|(_,Search.GlobSearchSubPattern(Vernacexpr.Anywhere,false,Pattern.PMeta_))::a'->all_true,a'|(true,Search.GlobSearchSubPattern(Vernacexpr.Anywhere,false,p))::a'->letfilter_head,p=interp_head_patpiniffilter_headthenp,a'elseall_true,arg|(_,(Search.GlobSearchSubPattern(Vernacexpr.(InHyp|InConcl),_,_)|Search.GlobSearchSubPattern(Vernacexpr.Anywhere,true,_)))::a'->CErrors.user_err(str"Unsupported.")|_->all_true,arginletis_string=function(_,Search.GlobSearchString_)->true|_->falseinleta2,a3=List.partitionis_stringa1ininterp_search_about(a2@a3)(fungrkindenvtyp->hpattyp)(* Module path postfilter *)letpr_modloc(b,m)=ifbthenstr"-"++pr_qualidmelsepr_qualidmletwit_ssrmodloc=add_genarg"ssrmodloc"(funenvsigma->pr_modloc)letpr_ssr_modlocs___ml=ifml=[]thenstr""elsespc()++str"in "++pr_listspcpr_modlocmllet(wit_ssr_modlocs,ssr_modlocs)=Tacentries.argument_extend~name:"ssr_modlocs"{Tacentries.arg_parsing=Vernacextend.Arg_rules([(Pcoq.Production.make(Pcoq.Rule.stop)(funloc-># 276 "plugins/ssrsearch/g_search.mlg"[]))]);Tacentries.arg_tag=Some(Geninterp.Val.List(Geninterp.val_tag(Genarg.topwitwit_ssrmodloc)));Tacentries.arg_intern=Tacentries.ArgInternWit(Genarg.ListArg(wit_ssrmodloc));Tacentries.arg_subst=Tacentries.ArgSubstWit(Genarg.ListArg(wit_ssrmodloc));Tacentries.arg_interp=Tacentries.ArgInterpWit(Genarg.ListArg(wit_ssrmodloc));Tacentries.arg_printer=((funenvsigma-># 275 "plugins/ssrsearch/g_search.mlg"pr_ssr_modlocs),(funenvsigma-># 275 "plugins/ssrsearch/g_search.mlg"pr_ssr_modlocs),(funenvsigma-># 275 "plugins/ssrsearch/g_search.mlg"pr_ssr_modlocs));}let_=(wit_ssr_modlocs,ssr_modlocs)let_=letmodloc=Pcoq.Entry.make"modloc"inlet()=assert(Pcoq.Entry.is_emptymodloc)inlet()=Pcoq.grammar_extendmodloc(Pcoq.Fresh(Gramlib.Gramext.First,[(None,None,[Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.ntermglobal)))(funmloc-># 281 "plugins/ssrsearch/g_search.mlg"false,m);Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(Tok.PKEYWORD("-")))))((Pcoq.Symbol.ntermglobal)))(funm_loc-># 281 "plugins/ssrsearch/g_search.mlg"true,m)])]))inlet()=Pcoq.grammar_extendssr_modlocs(Pcoq.Reuse(None,[Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(Tok.PKEYWORD("in")))))((Pcoq.Symbol.list1((Pcoq.Symbol.ntermmodloc)))))(funml_loc-># 282 "plugins/ssrsearch/g_search.mlg"ml)]))in()# 285 "plugins/ssrsearch/g_search.mlg"letinterp_modlocmr=letinterp_mod(_,qid)=tryNametab.full_name_moduleqidwithNot_found->CErrors.user_err?loc:qid.CAst.loc(str"No Module "++pr_qualidqid)inletmr_out,mr_in=List.partitionfstmrinletinterp_bmodb=function|[]->fun_____->true|rmods->Search.module_filter(List.mapinterp_modrmods,b)inletis_in=interp_bmodfalsemr_inandis_out=interp_bmodtruemr_outinfungrkindenvtyp->is_ingrkindenv(Evd.from_envenv)typ&&is_outgrkindenv(Evd.from_envenv)typ(* The unified, extended vernacular "Search" command *)letssrdisplaysearchgrenvt=letpr_res=pr_globalgr++str":"++spc()++pr_lconstr_envenvEvd.emptytinFeedback.msg_notice(hov2pr_res++fnl())letdeprecated_search=CWarnings.create~name:"deprecated-ssr-search"~category:"deprecated"(fun()->Pp.(str"SSReflect's Search command is deprecated."))let()=Vernacextend.vernac_extend~command:"SsrSearchPattern"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Search",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ssr_search_arg),Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ssr_modlocs),Vernacextend.TyNil))),(letcoqpp_bodyamr()=Vernacextend.VtDefault(fun()-># 314 "plugins/ssrsearch/g_search.mlg"deprecated_search();lethpat=interp_search_argainletin_mod=interp_modlocmrinletpost_filtergrkindenvtyp=in_modgrkindenvtyp&&hpatgrkindenvtypinletdisplaygrkindenvtyp=ifpost_filtergrkindenvtypthenssrdisplaysearchgrenvtypinletenv=Global.env()inSearch.generic_searchenvdisplay)infunamr?loc~atts()->coqpp_bodyamr(Attributes.unsupported_attributesatts)),None))]