123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314let_=Mltop.add_known_module"coq-plugin-tutorial.tuto1"# 3 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"(* If we forget this line and include our own tactic definition using
TACTIC EXTEND, as below, then we get the strange error message
no implementation available for Tacentries, only when compiling
theories/Loader.v
*)openLtac_pluginopenPp(* This module defines the types of arguments to be used in the
EXTEND directives below, for example the string one. *)openStdarglet()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"WhatIsThis"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("What's",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)),(letcoqpp_bodye()=Vernacextend.vtdefault(fun()-># 39 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()in(* we'll explain later *)letsigma=Evd.from_envenvin(* we'll explain later *)Inspector.print_inpute(Ppconstr.pr_constr_exprenvsigma)"term")infune?loc~atts()->coqpp_bodye(Attributes.unsupported_attributesatts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("What",Vernacextend.TyTerminal("kind",Vernacextend.TyTerminal("of",Vernacextend.TyTerminal("term",Vernacextend.TyTerminal("is",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_string),Vernacextend.TyNil)))))),(letcoqpp_bodys()=Vernacextend.vtdefault(fun()-># 45 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"Inspector.print_inputsstrbrk"string")infuns?loc~atts()->coqpp_bodys(Attributes.unsupported_attributesatts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("What",Vernacextend.TyTerminal("kind",Vernacextend.TyTerminal("of",Vernacextend.TyTerminal("term",Vernacextend.TyTerminal("is",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_int),Vernacextend.TyNil)))))),(letcoqpp_bodyi()=Vernacextend.vtdefault(fun()-># 47 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"Inspector.print_inputiPp.int"int")infuni?loc~atts()->coqpp_bodyi(Attributes.unsupported_attributesatts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("What",Vernacextend.TyTerminal("kind",Vernacextend.TyTerminal("of",Vernacextend.TyTerminal("term",Vernacextend.TyTerminal("is",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyNil)))))),(letcoqpp_bodyid()=Vernacextend.vtdefault(fun()-># 49 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"Inspector.print_inputidPpconstr.pr_id"identifier")infunid?loc~atts()->coqpp_bodyid(Attributes.unsupported_attributesatts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("What",Vernacextend.TyTerminal("kind",Vernacextend.TyTerminal("of",Vernacextend.TyTerminal("identifier",Vernacextend.TyTerminal("is",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_reference),Vernacextend.TyNil)))))),(letcoqpp_bodyr()=Vernacextend.vtdefault(fun()-># 51 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"Inspector.print_inputrPpconstr.pr_qualid"reference")infunr?loc~atts()->coqpp_bodyr(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"WhatAreThese"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("What",Vernacextend.TyTerminal("is",Vernacextend.TyNonTerminal(Extend.TUlist0(Extend.TUentry(Genarg.get_arg_tagwit_int)),Vernacextend.TyTerminal("a",Vernacextend.TyTerminal("list",Vernacextend.TyTerminal("of",Vernacextend.TyNil)))))),(letcoqpp_bodyl()=Vernacextend.vtdefault(fun()-># 60 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letprintl=str"["++Pp.prlist_with_sep(fun()->str";")Pp.intl++str"]"inInspector.print_inputlprint"int list")infunl?loc~atts()->coqpp_bodyl(Attributes.unsupported_attributesatts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("Is",Vernacextend.TyNonTerminal(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_int)),Vernacextend.TyTerminal("nonempty",Vernacextend.TyNil))),(letcoqpp_bodyl()=Vernacextend.vtdefault(fun()-># 65 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letprintl=str"["++Pp.prlist_with_sep(fun()->str";")Pp.intl++str"]"inInspector.print_inputlprint"nonempty int list")infunl?loc~atts()->coqpp_bodyl(Attributes.unsupported_attributesatts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("And",Vernacextend.TyTerminal("is",Vernacextend.TyNonTerminal(Extend.TUopt(Extend.TUentry(Genarg.get_arg_tagwit_int)),Vernacextend.TyTerminal("provided",Vernacextend.TyNil)))),(letcoqpp_bodyo()=Vernacextend.vtdefault(fun()-># 70 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letprinto=strbrk(ifOption.has_someothen"Yes"else"No")inFeedback.msg_notice(printo))infuno?loc~atts()->coqpp_bodyo(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"Intern"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Intern",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)),(letcoqpp_bodye()=Vernacextend.vtdefault(fun()-># 116 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()in(* use this; never use empty *)letsigma=Evd.from_envenvin(* use this; never use empty *)letdebugsigma=Termops.pr_evar_map~with_univs:trueNoneenvsigmainFeedback.msg_notice(strbrk"State before intern: "++debugsigma);let(sigma,t)=Constrintern.interp_constr_evarsenvsigmaeinFeedback.msg_notice(strbrk"State after intern: "++debugsigma);letprintt=Printer.pr_econstr_envenvsigmatinFeedback.msg_notice(strbrk"Interned: "++printt))infune?loc~atts()->coqpp_bodye(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"MyDefine"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("MyDefine",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal(":=",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)))),(letcoqpp_bodyiepoly=Vernacextend.vtdefault(fun()-># 151 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()inletsigma=Evd.from_envenvinlet(sigma,t)=Constrintern.interp_constr_evarsenvsigmaeinletr=Simple_declare.declare_definition~polyisigmatinletprintr=strbrk"Defined "++Printer.pr_globalr++strbrk"."inFeedback.msg_notice(printr))infunie?loc~atts()->coqpp_bodyie(Attributes.parseAttributes.polymorphicatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"ExamplePrint"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("MyPrint",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_reference),Vernacextend.TyNil)),(letcoqpp_bodyr()=Vernacextend.vtdefault(fun()-># 173 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()inletsigma=Evd.from_envenvintrylett=Simple_print.simple_body_access(Nametab.globalr)inFeedback.msg_notice(Printer.pr_econstr_envenvsigmat)withFailures->CErrors.user_err(strs))infunr?loc~atts()->coqpp_bodyr(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"DefineLookup"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("DefineLookup",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal(":=",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)))),(letcoqpp_bodyiepoly=Vernacextend.vtdefault(fun()-># 199 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()inletsigma=Evd.from_envenvinlet(sigma,t)=Constrintern.interp_constr_evarsenvsigmaeinletr=Simple_declare.declare_definition~polyisigmatinletprintr=strbrk"Defined "++Printer.pr_globalr++strbrk"."inFeedback.msg_notice(printr);letenv=Global.env()inletsigma=Evd.from_envenvinlett=Simple_print.simple_body_accessrinletprintt=strbrk"Found "++Printer.pr_econstr_envenvsigmatinFeedback.msg_notice(printt))infunie?loc~atts()->coqpp_bodyie(Attributes.parseAttributes.polymorphicatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"Check1"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Check1",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)),(letcoqpp_bodye()=Vernacextend.vtdefault(fun()-># 223 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()inletsigma=Evd.from_envenvinlet(sigma,t)=Constrintern.interp_constr_evarsenvsigmaeinlet(sigma,typ)=Simple_check.simple_check1envsigmatinFeedback.msg_notice(Printer.pr_econstr_envenvsigmatyp))infune?loc~atts()->coqpp_bodye(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"Check2"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Check2",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)),(letcoqpp_bodye()=Vernacextend.vtdefault(fun()-># 234 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()inletsigma=Evd.from_envenvinlet(sigma,t)=Constrintern.interp_constr_evarsenvsigmaeinlettyp=Simple_check.simple_check2envsigmatinFeedback.msg_notice(Printer.pr_econstr_envenvsigmatyp))infune?loc~atts()->coqpp_bodye(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"Convertible"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Convertible",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil))),(letcoqpp_bodye1e2()=Vernacextend.vtdefault(fun()-># 252 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"letenv=Global.env()inletsigma=Evd.from_envenvinlet(sigma,t1)=Constrintern.interp_constr_evarsenvsigmae1inlet(sigma,t2)=Constrintern.interp_constr_evarsenvsigmae2inmatchReductionops.infer_convenvsigmat1t2with|Some_->Feedback.msg_notice(strbrk"Yes :)")|None->Feedback.msg_notice(strbrk"No :("))infune1e2?loc~atts()->coqpp_bodye1e2(Attributes.unsupported_attributesatts)),None))]let()=Tacentries.tactic_extend"coq-plugin-tutorial.tuto1""my_intro"~level:0[(Tacentries.TyML(Tacentries.TyIdent("my_intro",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_ident),Tacentries.TyNil)),(funiist-># 273 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"Tactics.introductioni)))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-plugin-tutorial.tuto1")~command:"ExploreProof"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("ExploreProof",Vernacextend.TyNil),(letcoqpp_body()=Vernacextend.vtreadproof(fun~pstate->(# 288 "doc/plugin_tutorial/tuto1/src/g_tuto1.mlg"fun~pstate->letsigma,env=Declare.Proof.get_current_contextpstateinletpprf=Proof.partial_proof(Declare.Proof.getpstate)inFeedback.msg_notice(Pp.prlist_with_sepPp.fnl(Printer.pr_econstr_envenvsigma)pprf))~pstate)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]