123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505let_=Mltop.add_known_module"coq-waterproof.plugin"# 21 "src/g_waterproof.mlg"openExceptionsopenWaterproveletwaterproof_version:string="3.1.0+9.0"(* The code below is a hack to patch in (open_)lconstr into Ltac2 *)(* It should be removed when merged to coq-master (open_)lconstr should be in release 9.1 *)letadd_scopesf=Ltac2_plugin.Tac2entries.register_scope(Names.Id.of_strings)fletrecpr_scope=letopenLtac2_plugin.Tac2exprinletopenCAstinfunction|SexprStr{v=s;_}->Pp.qstrings|SexprInt{v=n;_}->Pp.intn|SexprRec(_,{v=na;_},args)->letna=matchnawith|None->Pp.str"_"|Someid->Names.Id.printidinPp.(na++str"("++prlist_with_sep(fun()->str", ")pr_scopeargs++str")")letscope_failsargs=letopenPpinletargs=str"("++prlist_with_sep(fun()->str", ")pr_scopeargs++str")"inCErrors.user_err(str"Invalid arguments "++args++str" in scope "++strs)let()=add_scope"lconstr"(funarg->letdelimiters=List.map(function|Ltac2_plugin.Tac2expr.SexprRec(_,{v=Somes;_},[])->s|_->scope_fail"lconstr"arg)arginletacte=Ltac2_plugin.Tac2quote.of_constr~delimiterseinLtac2_plugin.Tac2entries.ScopeRule(Procq.Symbol.ntermProcq.Constr.lconstr,act))let()=add_scope"open_lconstr"(funarg->letdelimiters=List.map(function|Ltac2_plugin.Tac2expr.SexprRec(_,{v=Somes;_},[])->s|_->scope_fail"open_.constr"arg)arginletacte=Ltac2_plugin.Tac2quote.of_open_constr~delimiterseinLtac2_plugin.Tac2entries.ScopeRule(Procq.Symbol.ntermProcq.Constr.lconstr,act))(* End of hack *)# 74 "src/g_waterproof.mlg"let()=Mltop.add_init_function"coq-waterproof.plugin"@@fun()->Procq.set_keyword_state(List.fold_leftCLexer.add_keyword(Procq.get_keyword_state())["and";"as";"hold";"holds";"it";"or";"we";"that"])let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"AutomationShieldEnableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Automation",Vernacextend.TyTerminal("Shield",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 82 "src/g_waterproof.mlg"automation_shield:=true)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"AutomationShieldDisableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Disable",Vernacextend.TyTerminal("Automation",Vernacextend.TyTerminal("Shield",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 89 "src/g_waterproof.mlg"automation_shield:=false)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"FilterErrorsEnableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Filter",Vernacextend.TyTerminal("Errors",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 96 "src/g_waterproof.mlg"filter_errors:=true)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"FilterErrorsDisableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Disable",Vernacextend.TyTerminal("Filter",Vernacextend.TyTerminal("Errors",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 103 "src/g_waterproof.mlg"filter_errors:=false)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"AutomationDebugEnableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Debug",Vernacextend.TyTerminal("Automation",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 110 "src/g_waterproof.mlg"automation_debug:=true)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"AutomationDebugDisableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Disable",Vernacextend.TyTerminal("Debug",Vernacextend.TyTerminal("Automation",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 117 "src/g_waterproof.mlg"automation_debug:=false)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"AutomationPrintRewriteHintsEnableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Printing",Vernacextend.TyTerminal("Rewrite",Vernacextend.TyTerminal("Hints",Vernacextend.TyNil))))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 124 "src/g_waterproof.mlg"print_rewrite_hints:=true)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"AutomationPrintRewriteHintsDisableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Disable",Vernacextend.TyTerminal("Printing",Vernacextend.TyTerminal("Rewrite",Vernacextend.TyTerminal("Hints",Vernacextend.TyNil))))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 131 "src/g_waterproof.mlg"print_rewrite_hints:=false)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"PrintHypothesisHelpEnableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Hypothesis",Vernacextend.TyTerminal("Help",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 138 "src/g_waterproof.mlg"print_hypothesis_help:=true)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"PrintHypothesisHelpDisableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Disable",Vernacextend.TyTerminal("Hypothesis",Vernacextend.TyTerminal("Help",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 145 "src/g_waterproof.mlg"print_hypothesis_help:=false)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"PrintVersionSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Print",Vernacextend.TyTerminal("Version",Vernacextend.TyNil))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 152 "src/g_waterproof.mlg"Feedback.msg_notice(Pp.strwaterproof_version))infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"RedirectWarningsEnableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Redirect",Vernacextend.TyTerminal("Feedback",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 159 "src/g_waterproof.mlg"redirect_feedback:=true)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"RedirectWarningsDisableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Disable",Vernacextend.TyTerminal("Redirect",Vernacextend.TyTerminal("Feedback",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 166 "src/g_waterproof.mlg"redirect_feedback:=false)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"RedirectErrorsEnableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Redirect",Vernacextend.TyTerminal("Errors",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 174 "src/g_waterproof.mlg"redirect_errors:=true)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"RedirectErrorsDisableSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Disable",Vernacextend.TyTerminal("Redirect",Vernacextend.TyTerminal("Errors",Vernacextend.TyNil)))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 181 "src/g_waterproof.mlg"redirect_errors:=false)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"AddWpLoggerSideEff"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Enable",Vernacextend.TyTerminal("Logging",Vernacextend.TyNil))),(letcoqpp_body()=Vernactypes.vtdefault(fun()-># 188 "src/g_waterproof.mlg"add_wp_feedback_logger())infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]# 193 "src/g_waterproof.mlg"openLtac2_plugin.Tac2entriesopenUnfold_frameworkopenStdargopenProcq.Constrtypepre_unfold_entry=|PreUnfold|PreApplyofConstrexpr.constr_expr|PreRewriteofConstrexpr.constr_exprletpr_pre_unfold_entryenvsigmaent=letopenPpinmatchentwith|PreUnfold->str"unfold"|PreApplye->str"apply"++str" with term "++Ppconstr.pr_constr_exprenvsigmae|PreRewritee->str"rewrite"++str" with term "++Ppconstr.pr_constr_exprenvsigmaelet(wit_unfold_action_entry,unfold_action_entry)=Vernacextend.vernac_argument_extend~plugin:"coq-waterproof.plugin"~name:"unfold_action_entry"{Vernacextend.arg_parsing=Vernacextend.Arg_rules([(Procq.Production.make(Procq.Rule.next(Procq.Rule.next(Procq.Rule.next(Procq.Rule.next(Procq.Rule.stop)((Procq.Symbol.token(Procq.terminal";"))))((Procq.Symbol.token(Procq.terminal"by"))))((Procq.Symbol.token(Procq.terminal"rewrite"))))((Procq.Symbol.ntermconstr)))(fune___loc-># 216 "src/g_waterproof.mlg"PreRewritee));(Procq.Production.make(Procq.Rule.next(Procq.Rule.next(Procq.Rule.next(Procq.Rule.next(Procq.Rule.stop)((Procq.Symbol.token(Procq.terminal";"))))((Procq.Symbol.token(Procq.terminal"by"))))((Procq.Symbol.token(Procq.terminal"apply"))))((Procq.Symbol.ntermconstr)))(fune___loc-># 215 "src/g_waterproof.mlg"PreApplye));(Procq.Production.make(Procq.Rule.next(Procq.Rule.next(Procq.Rule.next(Procq.Rule.stop)((Procq.Symbol.token(Procq.terminal";"))))((Procq.Symbol.token(Procq.terminal"by"))))((Procq.Symbol.token(Procq.terminal"unfold"))))(fun___loc-># 214 "src/g_waterproof.mlg"PreUnfold))]);Vernacextend.arg_printer=funenvsigma-># 213 "src/g_waterproof.mlg"pr_pre_unfold_entryenvsigma;}let_=(wit_unfold_action_entry,unfold_action_entry)let()=Vernacextend.static_vernac_extend~plugin:(Some"coq-waterproof.plugin")~command:"RegisterUnfold"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Waterproof",Vernacextend.TyTerminal("Register",Vernacextend.TyTerminal("Expand",Vernacextend.TyNonTerminal(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_string)),Vernacextend.TyTerminal(";",Vernacextend.TyTerminal("for",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ref),Vernacextend.TyTerminal(";",Vernacextend.TyTerminal("as",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_string),Vernacextend.TyNonTerminal(Extend.TUopt(Extend.TUentry(Genarg.get_arg_tagwit_unfold_action_entry)),Vernacextend.TyNil))))))))))),(letcoqpp_bodysidnameopt_unfold_action()=(letnotation_data_pair=# 225 "src/g_waterproof.mlg"register_unfoldsidinVernactypes.vtdefault(fun()-># 228 "src/g_waterproof.mlg"let(notation_data,old_notation_data)=notation_data_pairinletlocated_id=Nametab.locateidinadd_to_unfold_mapslocated_id;register_notation_interpretationnotation_data;register_notation_interpretationold_notation_data;letua=beginmatchopt_unfold_actionwith|None->Unfold_entryname|SomePreUnfold->Unfold_entryname|Some(PreApplye)->Apply_entry(name,e)|Some(PreRewritee)->Rewrite_entry(name,e)endinregister_unfold_entrylocated_idua))infunsidnameopt_unfold_action?loc~atts()->coqpp_bodysidnameopt_unfold_action(Attributes.unsupported_attributesatts)),Some(funsidnameopt_unfold_action-># 223 "src/g_waterproof.mlg"Vernacextend.(VtSideff([],VtNow)))))]