123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * Copyright INRIA, CNRS and contributors *)(* <O___,, * (see version control and CREDITS file for authors & dates) *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)openNamesmoduleTDyn=Dyn.Make()moduleMap(A:sigtype(_,_)tend)=structmoduleV=structtype_t=V:('raw,'glb)A.t->('raw*'glb)tendmoduleSelf=TDyn.Map(V)typet=Self.tletempty=Self.emptyletaddtagxm=Self.addtag(Vx)mletmemtagm=Self.memtagmletfindtagm=letVx=Self.findtagminxendtype('raw,'glb)tag=('raw*'glb)TDyn.tagtyperaw_generic_tactic=Raw:('raw,_)tag*'raw->raw_generic_tactictypeglob_generic_tactic=Glb:(_,'glb)tag*'glb->glob_generic_tacticletrepr=TDyn.reprtypeany_tag=Any:_tag->any_tagletequal=TDyn.eqletnames=(* magic: all tags are at tuple types *)TDyn.names|>Option.map@@fun(TDyn.Anyt)->Any(Obj.magict)letmakename:_tag=TDyn.createnameletempty=make"empty"letof_raw(typea)(tag:(a,_)tag)(x:a):raw_generic_tactic=Raw(tag,x)modulePrint=structtype('raw,'glb)t=Printof{raw_print:'rawGenprint.printer;glb_print:'glbGenprint.printer;}endmodulePrintMap=Map(Print)letprinters=refPrintMap.emptyletregister_printtagraw_printglb_print=assert(not@@PrintMap.memtag!printers);printers:=PrintMap.addtag(Print{raw_print;glb_print})!printersletapply_printerenvsigmalevel=function|Genprint.PrinterBasicpp->ppenvsigma|Genprint.PrinterNeedsLevel{default_already_surrounded;printer}->letlevel=Option.defaultdefault_already_surroundedlevelinprinterenvsigmalevelletprint_rawenvsigma?level(Raw(tag,v))=letPrint{raw_print}=PrintMap.findtag!printersinapply_printerenvsigmalevel(raw_printv)letprint_globenvsigma?level(Glb(tag,v))=letPrint{glb_print}=PrintMap.findtag!printersinapply_printerenvsigmalevel(glb_printv)moduleSubst=structtype_t=Subst:'glbGensubst.subst_fun->(_*'glb)tendmoduleSubstMap=TDyn.Map(Subst)letsubsts=refSubstMap.emptyletregister_substtagsubst=assert(not@@SubstMap.memtag!substs);substs:=SubstMap.addtag(Substsubst)!substsletsubstsubst(Glb(tag,v))=letSubstf=SubstMap.findtag!substsinGlb(tag,fsubstv)moduleIntern=struct(* XXX change type to match how it's called instead of reusing Genintern.intern_fun *)type_t=Intern:('raw,'glb)Genintern.intern_fun->('raw*'glb)tendmoduleInternMap=TDyn.Map(Intern)letinterns=refInternMap.emptyletregister_interntagintern=assert(not@@InternMap.memtag!interns);interns:=InternMap.addtag(Internintern)!internsletintern?(strict=true)env?(ltacvars=Id.Set.empty)(Raw(tag,v))=letInternintern=InternMap.findtag!internsinletist=Genintern.empty_glob_sign~strictenvUnivNames.empty_bindersinletist={istwithltacvars}inlet_,v=internistvinGlb(tag,v)type'glbinterp_fun=Geninterp.Val.tId.Map.t->'glb->unitProofview.tacticmoduleInterp=structtype_t=Interp:'glbinterp_fun->(_*'glb)tendmoduleInterpMap=TDyn.Map(Interp)letinterps=refInterpMap.emptyletregister_interptaginterp=assert(not@@InterpMap.memtag!interps);interps:=InterpMap.addtag(Interpinterp)!interpsletinterp?(lfun=Id.Map.empty)(Glb(tag,v))=letInterpinterp=InterpMap.findtag!interpsininterplfunvletwit_generic_tactic=Genarg.make0"generic_tactic"let()=letmkprintfv=Genprint.PrinterBasic(funenvsigma->fenvsigmav)inGenprint.register_vernac_print0wit_generic_tactic(mkprint(print_raw?level:None));