1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038# 11 "plugins/ltac/extratactics.mlg"openPpopenConstropenContextopenGenargopenStdargopenTacargopenExtraargsopenPltacopenMod_substopenNamesopenTacexpropenGlob_opsopenCErrorsopenUtilopenTermopsopenEqualityopenNamegenopenTactypesopenTacticsopenProofview.NotationsopenAttributesopenVernacextendlet__coq_plugin_name="ltac_plugin"let_=Mltop.add_known_module__coq_plugin_name# 40 "plugins/ltac/extratactics.mlg"(**********************************************************************)(* replace, discriminate, injection, simplify_eq *)(* cutrewrite, dependent rewrite *)letwith_delayed_uconstristctac=letflags={Pretyping.use_typeclasses=Pretyping.NoUseTC;solve_unification_constraints=true;fail_evar=false;expand_evars=true;program_mode=false;polymorphic=false;}inletc=Tacinterp.type_uconstr~flagsistcinTacticals.New.tclDELAYEDWITHHOLESfalsectacletreplace_in_clause_maybe_byistc1c2cltac=with_delayed_uconstristc1(func1->replace_in_clause_maybe_byc1c2cl(Option.map(Tacinterp.tactic_of_valueist)tac))letreplace_termistdir_optccl=with_delayed_uconstristc(func->replace_termdir_optccl)let()=Tacentries.tactic_extend__coq_plugin_name"replace"~level:0[(Tacentries.TyML(Tacentries.TyIdent("replace",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyIdent("with",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_by_arg_tac),Tacentries.TyNil)))))),(func1c2cltacist-># 69 "plugins/ltac/extratactics.mlg"replace_in_clause_maybe_byistc1c2cltac)))]let()=Tacentries.tactic_extend__coq_plugin_name"replace_term_left"~level:0[(Tacentries.TyML(Tacentries.TyIdent("replace",Tacentries.TyIdent("->",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyNil)))),(funcclist-># 74 "plugins/ltac/extratactics.mlg"replace_termist(Sometrue)ccl)))]let()=Tacentries.tactic_extend__coq_plugin_name"replace_term_right"~level:0[(Tacentries.TyML(Tacentries.TyIdent("replace",Tacentries.TyIdent("<-",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyNil)))),(funcclist-># 79 "plugins/ltac/extratactics.mlg"replace_termist(Somefalse)ccl)))]let()=Tacentries.tactic_extend__coq_plugin_name"replace_term"~level:0[(Tacentries.TyML(Tacentries.TyIdent("replace",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyNil))),(funcclist-># 84 "plugins/ltac/extratactics.mlg"replace_termistNoneccl)))]# 87 "plugins/ltac/extratactics.mlg"letinduction_arg_of_quantified_hyp=function|AnonHypn->None,ElimOnAnonHypn|NamedHypid->None,ElimOnIdent(CAst.makeid)(* Versions *_main must come first!! so that "1" is interpreted as a
ElimOnAnonHyp and not as a "constr", and "id" is interpreted as a
ElimOnIdent and not as "constr" *)letmytclWithHolestacwith_evarsc=Proofview.Goal.enterbeginfungl->letenv=Tacmach.New.pf_envglinletsigma=Tacmach.New.projectglinletsigma',c=Tactics.force_destruction_argwith_evarsenvsigmacinTacticals.New.tclWITHHOLESwith_evars(tacwith_evars(Somec))sigma'endletelimOnConstrWithHolestacwith_evarsc=Tacticals.New.tclDELAYEDWITHHOLESwith_evarsc(func->tacwith_evars(Some(None,ElimOnConstrc)))let()=Tacentries.tactic_extend__coq_plugin_name"simplify_eq"~level:0[(Tacentries.TyML(Tacentries.TyIdent("simplify_eq",Tacentries.TyNil),(funist-># 112 "plugins/ltac/extratactics.mlg"dEq~keep_proofs:NonefalseNone)));(Tacentries.TyML(Tacentries.TyIdent("simplify_eq",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyNil)),(funcist-># 113 "plugins/ltac/extratactics.mlg"mytclWithHoles(dEq~keep_proofs:None)falsec)))]let()=Tacentries.tactic_extend__coq_plugin_name"esimplify_eq"~level:0[(Tacentries.TyML(Tacentries.TyIdent("esimplify_eq",Tacentries.TyNil),(funist-># 116 "plugins/ltac/extratactics.mlg"dEq~keep_proofs:NonetrueNone)));(Tacentries.TyML(Tacentries.TyIdent("esimplify_eq",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyNil)),(funcist-># 117 "plugins/ltac/extratactics.mlg"mytclWithHoles(dEq~keep_proofs:None)truec)))]# 120 "plugins/ltac/extratactics.mlg"letdiscr_mainc=elimOnConstrWithHolesdiscr_tacfalseclet()=Tacentries.tactic_extend__coq_plugin_name"discriminate"~level:0[(Tacentries.TyML(Tacentries.TyIdent("discriminate",Tacentries.TyNil),(funist-># 127 "plugins/ltac/extratactics.mlg"discr_tacfalseNone)));(Tacentries.TyML(Tacentries.TyIdent("discriminate",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyNil)),(funcist-># 129 "plugins/ltac/extratactics.mlg"mytclWithHolesdiscr_tacfalsec)))]let()=Tacentries.tactic_extend__coq_plugin_name"ediscriminate"~level:0[(Tacentries.TyML(Tacentries.TyIdent("ediscriminate",Tacentries.TyNil),(funist-># 132 "plugins/ltac/extratactics.mlg"discr_tactrueNone)));(Tacentries.TyML(Tacentries.TyIdent("ediscriminate",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyNil)),(funcist-># 134 "plugins/ltac/extratactics.mlg"mytclWithHolesdiscr_tactruec)))]# 137 "plugins/ltac/extratactics.mlg"letdiscrHypid=Proofview.tclEVARMAP>>=funsigma->discr_main(funenvsigma->(sigma,(EConstr.mkVarid,NoBindings)))letinjection_mainwith_evarsc=elimOnConstrWithHoles(injClauseNoneNone)with_evarscletisInjPatpat=matchpat.CAst.vwithIntroAction(IntroInjection_)->Somepat.CAst.loc|_->Noneletdecode_inj_ipat?loc=function(* For the "as [= pat1 ... patn ]" syntax *)|[{CAst.v=IntroAction(IntroInjectionipat)}]->ipat(* For the "as pat1 ... patn" syntax *)|([]|[_])asipat->ipat|pat1::pat2::_asipat->(* To be sure that there is no confusion of syntax, we check that no [= ...] occurs
in the non-singleton list of patterns *)matchisInjPatpat1with|Some_->user_err?loc:pat2.CAst.loc(str"Unexpected pattern.")|None->matchList.map_filterisInjPatipatwith|loc::_->user_err?loc(str"Unexpected injection pattern.")|[]->ipatlet()=Tacentries.tactic_extend__coq_plugin_name"injection"~level:0[(Tacentries.TyML(Tacentries.TyIdent("injection",Tacentries.TyNil),(funist-># 166 "plugins/ltac/extratactics.mlg"injClauseNoneNonefalseNone)));(Tacentries.TyML(Tacentries.TyIdent("injection",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyNil)),(funcist-># 167 "plugins/ltac/extratactics.mlg"mytclWithHoles(injClauseNoneNone)falsec)))]let()=Tacentries.tactic_extend__coq_plugin_name"einjection"~level:0[(Tacentries.TyML(Tacentries.TyIdent("einjection",Tacentries.TyNil),(funist-># 170 "plugins/ltac/extratactics.mlg"injClauseNoneNonetrueNone)));(Tacentries.TyML(Tacentries.TyIdent("einjection",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyNil)),(funcist-># 171 "plugins/ltac/extratactics.mlg"mytclWithHoles(injClauseNoneNone)truec)))]let()=Tacentries.tactic_extend__coq_plugin_name"injection_as"~level:0[(Tacentries.TyML(Tacentries.TyIdent("injection",Tacentries.TyIdent("as",Tacentries.TyArg(Extend.TUlist0(Extend.TUentry(Genarg.get_arg_tagwit_simple_intropattern)),Tacentries.TyNil))),(funipatist-># 175 "plugins/ltac/extratactics.mlg"injClauseNone(Some(decode_inj_ipatipat))falseNone)));(Tacentries.TyML(Tacentries.TyIdent("injection",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyIdent("as",Tacentries.TyArg(Extend.TUlist0(Extend.TUentry(Genarg.get_arg_tagwit_simple_intropattern)),Tacentries.TyNil)))),(funcipatist-># 177 "plugins/ltac/extratactics.mlg"mytclWithHoles(injClauseNone(Some(decode_inj_ipatipat)))falsec)))]let()=Tacentries.tactic_extend__coq_plugin_name"einjection_as"~level:0[(Tacentries.TyML(Tacentries.TyIdent("einjection",Tacentries.TyIdent("as",Tacentries.TyArg(Extend.TUlist0(Extend.TUentry(Genarg.get_arg_tagwit_simple_intropattern)),Tacentries.TyNil))),(funipatist-># 181 "plugins/ltac/extratactics.mlg"injClauseNone(Some(decode_inj_ipatipat))trueNone)));(Tacentries.TyML(Tacentries.TyIdent("einjection",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyIdent("as",Tacentries.TyArg(Extend.TUlist0(Extend.TUentry(Genarg.get_arg_tagwit_simple_intropattern)),Tacentries.TyNil)))),(funcipatist-># 183 "plugins/ltac/extratactics.mlg"mytclWithHoles(injClauseNone(Some(decode_inj_ipatipat)))truec)))]let()=Tacentries.tactic_extend__coq_plugin_name"simple_injection"~level:0[(Tacentries.TyML(Tacentries.TyIdent("simple",Tacentries.TyIdent("injection",Tacentries.TyNil)),(funist-># 186 "plugins/ltac/extratactics.mlg"simpleInjClauseNonefalseNone)));(Tacentries.TyML(Tacentries.TyIdent("simple",Tacentries.TyIdent("injection",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_destruction_arg),Tacentries.TyNil))),(funcist-># 187 "plugins/ltac/extratactics.mlg"mytclWithHoles(simpleInjClauseNone)falsec)))]# 190 "plugins/ltac/extratactics.mlg"letinjHypid=Proofview.tclEVARMAP>>=funsigma->injection_mainfalse(funenvsigma->(sigma,(EConstr.mkVarid,NoBindings)))let()=Tacentries.tactic_extend__coq_plugin_name"dependent_rewrite"~level:0[(Tacentries.TyML(Tacentries.TyIdent("dependent",Tacentries.TyIdent("rewrite",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)))),(funbcist-># 199 "plugins/ltac/extratactics.mlg"rewriteInConclbc)));(Tacentries.TyML(Tacentries.TyIdent("dependent",Tacentries.TyIdent("rewrite",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil)))))),(funbcidist-># 201 "plugins/ltac/extratactics.mlg"rewriteInHypbcid)))]let()=Tacentries.tactic_extend__coq_plugin_name"cut_rewrite"~level:0[(Tacentries.TyML(Tacentries.TyIdent("cutrewrite",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil))),(funbeqnist-># 205 "plugins/ltac/extratactics.mlg"cutRewriteInConclbeqn)));(Tacentries.TyML(Tacentries.TyIdent("cutrewrite",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil))))),(funbeqnidist-># 207 "plugins/ltac/extratactics.mlg"cutRewriteInHypbeqnid)))]let()=Tacentries.tactic_extend__coq_plugin_name"decompose_sum"~level:0[(Tacentries.TyML(Tacentries.TyIdent("decompose",Tacentries.TyIdent("sum",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil))),(funcist-># 214 "plugins/ltac/extratactics.mlg"Elim.h_decompose_orc)))]let()=Tacentries.tactic_extend__coq_plugin_name"decompose_record"~level:0[(Tacentries.TyML(Tacentries.TyIdent("decompose",Tacentries.TyIdent("record",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil))),(funcist-># 218 "plugins/ltac/extratactics.mlg"Elim.h_decompose_andc)))]# 224 "plugins/ltac/extratactics.mlg"openContradictionlet()=Tacentries.tactic_extend__coq_plugin_name"absurd"~level:0[(Tacentries.TyML(Tacentries.TyIdent("absurd",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funcist-># 231 "plugins/ltac/extratactics.mlg"absurdc)))]# 234 "plugins/ltac/extratactics.mlg"letonSomeWithHolestac=function|None->tacNone|Somec->Tacticals.New.tclDELAYEDWITHHOLESfalsec(func->tac(Somec))let()=Tacentries.tactic_extend__coq_plugin_name"contradiction"~level:0[(Tacentries.TyML(Tacentries.TyIdent("contradiction",Tacentries.TyArg(Extend.TUopt(Extend.TUentry(Genarg.get_arg_tagwit_constr_with_bindings)),Tacentries.TyNil)),(funcist-># 244 "plugins/ltac/extratactics.mlg"onSomeWithHolescontradictionc)))]# 250 "plugins/ltac/extratactics.mlg"openAutorewritelet()=Tacentries.tactic_extend__coq_plugin_name"autorewrite"~level:0[(Tacentries.TyML(Tacentries.TyIdent("autorewrite",Tacentries.TyIdent("with",Tacentries.TyArg(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_preident)),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyNil)))),(funlclist-># 258 "plugins/ltac/extratactics.mlg"auto_multi_rewritel(cl))));(Tacentries.TyML(Tacentries.TyIdent("autorewrite",Tacentries.TyIdent("with",Tacentries.TyArg(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_preident)),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyIdent("using",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_tactic),Tacentries.TyNil)))))),(funlcltist-># 260 "plugins/ltac/extratactics.mlg"auto_multi_rewrite_with(Tacinterp.tactic_of_valueistt)lcl)))]let()=Tacentries.tactic_extend__coq_plugin_name"autorewrite_star"~level:0[(Tacentries.TyML(Tacentries.TyIdent("autorewrite",Tacentries.TyIdent("*",Tacentries.TyIdent("with",Tacentries.TyArg(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_preident)),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyNil))))),(funlclist-># 267 "plugins/ltac/extratactics.mlg"auto_multi_rewrite~conds:AllMatcheslcl)));(Tacentries.TyML(Tacentries.TyIdent("autorewrite",Tacentries.TyIdent("*",Tacentries.TyIdent("with",Tacentries.TyArg(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_preident)),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_clause),Tacentries.TyIdent("using",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_tactic),Tacentries.TyNil))))))),(funlcltist-># 269 "plugins/ltac/extratactics.mlg"auto_multi_rewrite_with~conds:AllMatches(Tacinterp.tactic_of_valueistt)lcl)))]# 275 "plugins/ltac/extratactics.mlg"letrewrite_staristclauseorientoccsc(tac:Geninterp.Val.toption)=lettac'=Option.map(funt->Tacinterp.tactic_of_valueistt,FirstSolved)tacinwith_delayed_uconstristc(func->general_rewrite~where:clause~l2r:orientoccs?tac:tac'~freeze:true~dep:true~with_evars:true(c,NoBindings))let()=Tacentries.tactic_extend__coq_plugin_name"rewrite_star"~level:0[(Tacentries.TyML(Tacentries.TyIdent("rewrite",Tacentries.TyIdent("*",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyIdent("at",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_occurrences),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_by_arg_tac),Tacentries.TyNil))))))))),(funocidocctacist-># 286 "plugins/ltac/extratactics.mlg"rewrite_starist(Someid)o(occurrences_ofocc)ctac)));(Tacentries.TyML(Tacentries.TyIdent("rewrite",Tacentries.TyIdent("*",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyIdent("at",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_occurrences),Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_by_arg_tac),Tacentries.TyNil))))))))),(funococcidtacist-># 288 "plugins/ltac/extratactics.mlg"rewrite_starist(Someid)o(occurrences_ofocc)ctac)));(Tacentries.TyML(Tacentries.TyIdent("rewrite",Tacentries.TyIdent("*",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_by_arg_tac),Tacentries.TyNil))))))),(funocidtacist-># 290 "plugins/ltac/extratactics.mlg"rewrite_starist(Someid)oLocus.AllOccurrencesctac)));(Tacentries.TyML(Tacentries.TyIdent("rewrite",Tacentries.TyIdent("*",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyIdent("at",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_occurrences),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_by_arg_tac),Tacentries.TyNil))))))),(funococctacist-># 292 "plugins/ltac/extratactics.mlg"rewrite_staristNoneo(occurrences_ofocc)ctac)));(Tacentries.TyML(Tacentries.TyIdent("rewrite",Tacentries.TyIdent("*",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_orient),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_by_arg_tac),Tacentries.TyNil))))),(funoctacist-># 294 "plugins/ltac/extratactics.mlg"rewrite_staristNoneoLocus.AllOccurrencesctac)))]# 300 "plugins/ltac/extratactics.mlg"letadd_rewrite_hint~locality~polybasesorttlcsr=letenv=Global.env()inletsigma=Evd.from_envenvinletfce=letc,ctx=Constrintern.interp_constrenvsigmaceinletc=EConstr.to_constrsigmacinletctx=letctx=UState.context_setctxinifpolythenctxelse(* This is a global universe context that shouldn't be
refreshed at every use of the hint, declare it globally. *)(DeclareUctx.declare_universe_context~poly:falsectx;Univ.ContextSet.empty)inCAst.make?loc:(Constrexpr_ops.constr_locce)((c,ctx),ort,Option.map(in_gen(rawwitwit_ltac))t)inleteqs=List.mapflcsrinletadd_hintsbase=add_rew_rules~localitybaseeqsinList.iteradd_hintsbasesletclassify_hint_=VtSideff([],VtLater)let()=Vernacextend.vernac_extend~command:"HintRewrite"~classifier:(classify_hint)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Hint",Vernacextend.TyTerminal("Rewrite",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_orient),Vernacextend.TyNonTerminal(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_constr)),Vernacextend.TyTerminal(":",Vernacextend.TyNonTerminal(Extend.TUlist0(Extend.TUentry(Genarg.get_arg_tagwit_preident)),Vernacextend.TyNil)))))),(letcoqpp_bodyolbl(polymorphic,locality)=Vernacextend.VtDefault(fun()-># 327 "plugins/ltac/extratactics.mlg"add_rewrite_hint~locality~poly:polymorphicbloNonel)infunolbl?loc~atts()->coqpp_bodyolbl(Attributes.parseAttributes.Notations.(polymorphic++option_locality)atts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("Hint",Vernacextend.TyTerminal("Rewrite",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_orient),Vernacextend.TyNonTerminal(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_constr)),Vernacextend.TyTerminal("using",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_tactic),Vernacextend.TyTerminal(":",Vernacextend.TyNonTerminal(Extend.TUlist0(Extend.TUentry(Genarg.get_arg_tagwit_preident)),Vernacextend.TyNil)))))))),(letcoqpp_bodyoltbl(polymorphic,locality)=Vernacextend.VtDefault(fun()-># 330 "plugins/ltac/extratactics.mlg"add_rewrite_hint~locality~poly:polymorphicblo(Somet)l)infunoltbl?loc~atts()->coqpp_bodyoltbl(Attributes.parseAttributes.Notations.(polymorphic++option_locality)atts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("Hint",Vernacextend.TyTerminal("Rewrite",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_orient),Vernacextend.TyNonTerminal(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_constr)),Vernacextend.TyNil)))),(letcoqpp_bodyol(polymorphic,locality)=Vernacextend.VtDefault(fun()-># 332 "plugins/ltac/extratactics.mlg"add_rewrite_hint~locality~poly:polymorphic["core"]oNonel)infunol?loc~atts()->coqpp_bodyol(Attributes.parseAttributes.Notations.(polymorphic++option_locality)atts)),None));(Vernacextend.TyML(false,Vernacextend.TyTerminal("Hint",Vernacextend.TyTerminal("Rewrite",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_orient),Vernacextend.TyNonTerminal(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_constr)),Vernacextend.TyTerminal("using",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_tactic),Vernacextend.TyNil)))))),(letcoqpp_bodyolt(polymorphic,locality)=Vernacextend.VtDefault(fun()-># 334 "plugins/ltac/extratactics.mlg"add_rewrite_hint~locality~poly:polymorphic["core"]o(Somet)l)infunolt?loc~atts()->coqpp_bodyolt(Attributes.parseAttributes.Notations.(polymorphic++option_locality)atts)),None))]# 340 "plugins/ltac/extratactics.mlg"openEConstropenVarsletconstr_flags()={Pretyping.use_typeclasses=Pretyping.UseTC;Pretyping.solve_unification_constraints=Proof.use_unification_heuristics();Pretyping.fail_evar=false;Pretyping.expand_evars=true;Pretyping.program_mode=false;Pretyping.polymorphic=false;}letrefine_tacistsimplewith_classesc=Proofview.Goal.enterbeginfungl->letconcl=Proofview.Goal.conclglinletenv=Proofview.Goal.envglinletflags={(constr_flags())withPretyping.use_typeclasses=with_classes}inletexpected_type=Pretyping.OfTypeconclinletc=Tacinterp.type_uconstr~flags~expected_typeistcinletupdate=beginfunsigma->cenvsigmaendinletrefine=Refine.refine~typecheck:falseupdateinifsimplethenrefineelserefine<*>Tactics.New.reduce_after_refine<*>Proofview.shelve_unifiableendlet()=Tacentries.tactic_extend__coq_plugin_name"refine"~level:0[(Tacentries.TyML(Tacentries.TyIdent("refine",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyNil)),(funcist-># 376 "plugins/ltac/extratactics.mlg"refine_tacistfalsePretyping.UseTCc)))]let()=Tacentries.tactic_extend__coq_plugin_name"simple_refine"~level:0[(Tacentries.TyML(Tacentries.TyIdent("simple",Tacentries.TyIdent("refine",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyNil))),(funcist-># 381 "plugins/ltac/extratactics.mlg"refine_tacisttruePretyping.UseTCc)))]let()=Tacentries.tactic_extend__coq_plugin_name"notcs_refine"~level:0[(Tacentries.TyML(Tacentries.TyIdent("notypeclasses",Tacentries.TyIdent("refine",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyNil))),(funcist-># 386 "plugins/ltac/extratactics.mlg"refine_tacistfalsePretyping.NoUseTCc)))]let()=Tacentries.tactic_extend__coq_plugin_name"notcs_simple_refine"~level:0[(Tacentries.TyML(Tacentries.TyIdent("simple",Tacentries.TyIdent("notypeclasses",Tacentries.TyIdent("refine",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_uconstr),Tacentries.TyNil)))),(funcist-># 391 "plugins/ltac/extratactics.mlg"refine_tacisttruePretyping.NoUseTCc)))]let()=Tacentries.tactic_extend__coq_plugin_name"solve_constraints"~level:0[(Tacentries.TyML(Tacentries.TyIdent("solve_constraints",Tacentries.TyNil),(funist-># 396 "plugins/ltac/extratactics.mlg"Refine.solve_constraints)))]# 402 "plugins/ltac/extratactics.mlg"openInvopenLeminvletseffid=VtSideff([id],VtLater)let()=Vernacextend.vernac_extend~command:"DeriveInversionClear"?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Derive",Vernacextend.TyTerminal("Inversion_clear",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal("with",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyTerminal("Sort",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_sort_family),Vernacextend.TyNil))))))),(letcoqpp_bodynacspolymorphic=Vernacextend.VtDefault(fun()-># 420 "plugins/ltac/extratactics.mlg"add_inversion_lemma_exn~poly:polymorphicnacsfalseinv_clear_tac)infunnacs?loc~atts()->coqpp_bodynacs(Attributes.parsepolymorphicatts)),Some(funnacs-># 419 "plugins/ltac/extratactics.mlg"seffna)));(Vernacextend.TyML(false,Vernacextend.TyTerminal("Derive",Vernacextend.TyTerminal("Inversion_clear",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal("with",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil))))),(letcoqpp_bodynacpolymorphic=Vernacextend.VtDefault(fun()-># 424 "plugins/ltac/extratactics.mlg"add_inversion_lemma_exn~poly:polymorphicnacSorts.InPropfalseinv_clear_tac)infunnac?loc~atts()->coqpp_bodynac(Attributes.parsepolymorphicatts)),Some(funnac-># 423 "plugins/ltac/extratactics.mlg"seffna)))]let()=Vernacextend.vernac_extend~command:"DeriveInversion"?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Derive",Vernacextend.TyTerminal("Inversion",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal("with",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyTerminal("Sort",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_sort_family),Vernacextend.TyNil))))))),(letcoqpp_bodynacspolymorphic=Vernacextend.VtDefault(fun()-># 431 "plugins/ltac/extratactics.mlg"add_inversion_lemma_exn~poly:polymorphicnacsfalseinv_tac)infunnacs?loc~atts()->coqpp_bodynacs(Attributes.parsepolymorphicatts)),Some(funnacs-># 430 "plugins/ltac/extratactics.mlg"seffna)));(Vernacextend.TyML(false,Vernacextend.TyTerminal("Derive",Vernacextend.TyTerminal("Inversion",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal("with",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil))))),(letcoqpp_bodynacpolymorphic=Vernacextend.VtDefault(fun()-># 435 "plugins/ltac/extratactics.mlg"add_inversion_lemma_exn~poly:polymorphicnacSorts.InPropfalseinv_tac)infunnac?loc~atts()->coqpp_bodynac(Attributes.parsepolymorphicatts)),Some(funnac-># 434 "plugins/ltac/extratactics.mlg"seffna)))]let()=Vernacextend.vernac_extend~command:"DeriveDependentInversion"?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Derive",Vernacextend.TyTerminal("Dependent",Vernacextend.TyTerminal("Inversion",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal("with",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyTerminal("Sort",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_sort_family),Vernacextend.TyNil)))))))),(letcoqpp_bodynacspolymorphic=Vernacextend.VtDefault(fun()-># 442 "plugins/ltac/extratactics.mlg"add_inversion_lemma_exn~poly:polymorphicnacstruedinv_tac)infunnacs?loc~atts()->coqpp_bodynacs(Attributes.parsepolymorphicatts)),Some(funnacs-># 441 "plugins/ltac/extratactics.mlg"seffna)))]let()=Vernacextend.vernac_extend~command:"DeriveDependentInversionClear"?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Derive",Vernacextend.TyTerminal("Dependent",Vernacextend.TyTerminal("Inversion_clear",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_ident),Vernacextend.TyTerminal("with",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyTerminal("Sort",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_sort_family),Vernacextend.TyNil)))))))),(letcoqpp_bodynacspolymorphic=Vernacextend.VtDefault(fun()-># 449 "plugins/ltac/extratactics.mlg"add_inversion_lemma_exn~poly:polymorphicnacstruedinv_clear_tac)infunnacs?loc~atts()->coqpp_bodynacs(Attributes.parsepolymorphicatts)),Some(funnacs-># 448 "plugins/ltac/extratactics.mlg"seffna)))]let()=Tacentries.tactic_extend__coq_plugin_name"subst"~level:0[(Tacentries.TyML(Tacentries.TyIdent("subst",Tacentries.TyArg(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_hyp)),Tacentries.TyNil)),(funlist-># 457 "plugins/ltac/extratactics.mlg"substl)));(Tacentries.TyML(Tacentries.TyIdent("subst",Tacentries.TyNil),(funist-># 458 "plugins/ltac/extratactics.mlg"subst_all())))]# 461 "plugins/ltac/extratactics.mlg"letsimple_subst_tactic_flags={only_leibniz=true;rewrite_dependent_proof=false}let()=Tacentries.tactic_extend__coq_plugin_name"simple_subst"~level:0[(Tacentries.TyML(Tacentries.TyIdent("simple",Tacentries.TyIdent("subst",Tacentries.TyNil)),(funist-># 469 "plugins/ltac/extratactics.mlg"subst_all~flags:simple_subst_tactic_flags())))]# 472 "plugins/ltac/extratactics.mlg"openEvar_tacticslet()=Tacentries.tactic_extend__coq_plugin_name"evar"~level:0[(Tacentries.TyML(Tacentries.TyIdent("evar",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_test_lpar_id_colon),Tacentries.TyIdent("(",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_ident),Tacentries.TyIdent(":",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_lconstr),Tacentries.TyIdent(")",Tacentries.TyNil))))))),(fun_idtypist-># 484 "plugins/ltac/extratactics.mlg"let_evar(Name.Nameid)typ)));(Tacentries.TyML(Tacentries.TyIdent("evar",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funtypist-># 485 "plugins/ltac/extratactics.mlg"let_evarName.Anonymoustyp)))]let()=Tacentries.tactic_extend__coq_plugin_name"instantiate"~level:0[(Tacentries.TyML(Tacentries.TyIdent("instantiate",Tacentries.TyIdent("(",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_ident),Tacentries.TyIdent(":=",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_lglob),Tacentries.TyIdent(")",Tacentries.TyNil)))))),(funidcist-># 490 "plugins/ltac/extratactics.mlg"Tacticals.New.tclTHEN(instantiate_tac_by_nameidc)Proofview.V82.nf_evar_goals)));(Tacentries.TyML(Tacentries.TyIdent("instantiate",Tacentries.TyIdent("(",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_integer),Tacentries.TyIdent(":=",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_lglob),Tacentries.TyIdent(")",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hloc),Tacentries.TyNil))))))),(funichlist-># 492 "plugins/ltac/extratactics.mlg"Tacticals.New.tclTHEN(instantiate_tacichl)Proofview.V82.nf_evar_goals)));(Tacentries.TyML(Tacentries.TyIdent("instantiate",Tacentries.TyNil),(funist-># 493 "plugins/ltac/extratactics.mlg"Proofview.V82.nf_evar_goals)))]# 499 "plugins/ltac/extratactics.mlg"openTacticsopenGlob_termopenLibobjectopenLib(* Registered lemmas are expected to be of the form
x R y -> y == z -> x R z (in the right table)
x R y -> x == z -> z R y (in the left table)
*)lettransitivity_right_table=Summary.ref[]~name:"transitivity-steps-r"lettransitivity_left_table=Summary.ref[]~name:"transitivity-steps-l"(* [step] tries to apply a rewriting lemma; then apply [tac] intended to
complete to proof of the last hypothesis (assumed to state an equality) *)letstepleftxtac=letl=List.map(funlem->letlem=EConstr.of_constrleminTacticals.New.tclTHENLAST(apply_with_bindings(lem,ImplicitBindings[x]))tac)!(ifleftthentransitivity_left_tableelsetransitivity_right_table)inTacticals.New.tclFIRSTl(* Main function to push lemmas in persistent environment *)letcache_transitivity_lemma(_,(left,lem))=ifleftthentransitivity_left_table:=lem::!transitivity_left_tableelsetransitivity_right_table:=lem::!transitivity_right_tableletsubst_transitivity_lemma(subst,(b,ref))=(b,subst_mpssubstref)letinTransitivity:bool*Constr.t->obj=declare_object@@global_object_nodischarge"TRANSITIVITY-STEPS"~cache:cache_transitivity_lemma~subst:(Somesubst_transitivity_lemma)(* Main entry points *)letadd_transitivity_lemmaleftlem=letenv=Global.env()inletsigma=Evd.from_envenvinletlem',ctx(*FIXME*)=Constrintern.interp_constrenvsigmaleminletlem'=EConstr.to_constrsigmalem'inadd_anonymous_leaf(inTransitivity(left,lem'))let()=Tacentries.tactic_extend__coq_plugin_name"stepl"~level:0[(Tacentries.TyML(Tacentries.TyIdent("stepl",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyIdent("by",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_tactic),Tacentries.TyNil)))),(functacist-># 557 "plugins/ltac/extratactics.mlg"steptruec(Tacinterp.tactic_of_valueisttac))));(Tacentries.TyML(Tacentries.TyIdent("stepl",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funcist-># 558 "plugins/ltac/extratactics.mlg"steptruec(Proofview.tclUNIT()))))]let()=Tacentries.tactic_extend__coq_plugin_name"stepr"~level:0[(Tacentries.TyML(Tacentries.TyIdent("stepr",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyIdent("by",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_tactic),Tacentries.TyNil)))),(functacist-># 562 "plugins/ltac/extratactics.mlg"stepfalsec(Tacinterp.tactic_of_valueisttac))));(Tacentries.TyML(Tacentries.TyIdent("stepr",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funcist-># 563 "plugins/ltac/extratactics.mlg"stepfalsec(Proofview.tclUNIT()))))]let()=Vernacextend.vernac_extend~command:"AddStepl"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Declare",Vernacextend.TyTerminal("Left",Vernacextend.TyTerminal("Step",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)))),(letcoqpp_bodyt()=Vernacextend.VtDefault(fun()-># 568 "plugins/ltac/extratactics.mlg"add_transitivity_lemmatruet)infunt?loc~atts()->coqpp_bodyt(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.vernac_extend~command:"AddStepr"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Declare",Vernacextend.TyTerminal("Right",Vernacextend.TyTerminal("Step",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil)))),(letcoqpp_bodyt()=Vernacextend.VtDefault(fun()-># 573 "plugins/ltac/extratactics.mlg"add_transitivity_lemmafalset)infunt?loc~atts()->coqpp_bodyt(Attributes.unsupported_attributesatts)),None))]let()=Tacentries.tactic_extend__coq_plugin_name"generalize_eqs"~level:0[(Tacentries.TyML(Tacentries.TyIdent("generalize_eqs",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil)),(funidist-># 580 "plugins/ltac/extratactics.mlg"abstract_generalize~generalize_vars:falseid)))]let()=Tacentries.tactic_extend__coq_plugin_name"dep_generalize_eqs"~level:0[(Tacentries.TyML(Tacentries.TyIdent("dependent",Tacentries.TyIdent("generalize_eqs",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil))),(funidist-># 583 "plugins/ltac/extratactics.mlg"abstract_generalize~generalize_vars:false~force_dep:trueid)))]let()=Tacentries.tactic_extend__coq_plugin_name"generalize_eqs_vars"~level:0[(Tacentries.TyML(Tacentries.TyIdent("generalize_eqs_vars",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil)),(funidist-># 586 "plugins/ltac/extratactics.mlg"abstract_generalize~generalize_vars:trueid)))]let()=Tacentries.tactic_extend__coq_plugin_name"dep_generalize_eqs_vars"~level:0[(Tacentries.TyML(Tacentries.TyIdent("dependent",Tacentries.TyIdent("generalize_eqs_vars",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil))),(funidist-># 589 "plugins/ltac/extratactics.mlg"abstract_generalize~force_dep:true~generalize_vars:trueid)))]let()=Tacentries.tactic_extend__coq_plugin_name"specialize_eqs"~level:0[(Tacentries.TyML(Tacentries.TyIdent("specialize_eqs",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil)),(funidist-># 597 "plugins/ltac/extratactics.mlg"specialize_eqsid)))]# 608 "plugins/ltac/extratactics.mlg"letsubst_var_with_holeocctidt=letoccref=ifocc>0thenrefoccelseLocusops.error_invalid_occurrence[occ]inletlocref=ref0inletrecsubstrecx=matchDAst.getxwith|GVarid->ifId.equalidtidthen(decroccref;ifInt.equal!occref0thenxelse(incrlocref;DAst.make~loc:(Loc.make_loc(!locref,0))@@GHole(Evar_kinds.QuestionMark{Evar_kinds.qm_obligation=Evar_kinds.Definetrue;Evar_kinds.qm_name=Anonymous;Evar_kinds.qm_record_field=None;},IntroAnonymous,None)))elsex|_->map_glob_constr_left_to_rightsubstrecxinlett'=substrectinif!occref>0thenLocusops.error_invalid_occurrence[occ]elset'letsubst_hole_with_termocctct=letlocref=ref0inletoccref=refoccinletrecsubstrecc=matchDAst.getcwith|GHole(Evar_kinds.QuestionMark{Evar_kinds.qm_obligation=Evar_kinds.Definetrue;Evar_kinds.qm_name=Anonymous;Evar_kinds.qm_record_field=None;},IntroAnonymous,s)->decroccref;ifInt.equal!occref0thentcelse(incrlocref;DAst.make~loc:(Loc.make_loc(!locref,0))@@GHole(Evar_kinds.QuestionMark{Evar_kinds.qm_obligation=Evar_kinds.Definetrue;Evar_kinds.qm_name=Anonymous;Evar_kinds.qm_record_field=None;},IntroAnonymous,s))|_->map_glob_constr_left_to_rightsubstreccinsubstrectopenTacmachlethResolveidcocct=Proofview.Goal.enterbeginfungl->letsigma=Proofview.Goal.sigmaglinletenv=Termops.clear_named_bodyid(Proofview.Goal.envgl)inletconcl=Proofview.Goal.conclglinletenv_ids=Termops.vars_of_envenvinletc_raw=Detyping.detypeDetyping.Nowtrueenv_idsenvsigmacinlett_raw=Detyping.detypeDetyping.Nowtrueenv_idsenvsigmatinletrecresolve_holet_hole=tryPretyping.understandenvsigmat_holewith|Pretype_errors.PretypeError(_,_,Pretype_errors.UnsolvableImplicit_)ase->let(e,info)=Exninfo.captureeinletloc_begin=Option.cata(funl->fst(Loc.unlocl))0(Loc.get_locinfo)inresolve_hole(subst_hole_with_termloc_beginc_rawt_hole)inlett_constr,ctx=resolve_hole(subst_var_with_holeoccidt_raw)inletsigma=Evd.merge_universe_contextsigmactxinlett_constr_type=Retyping.get_type_ofenvsigmat_constrinProofview.tclTHEN(Proofview.Unsafe.tclEVARSsigma)(change_concl(mkLetIn(make_annotName.AnonymousSorts.Relevant,t_constr,t_constr_type,concl)))endlethResolve_autoidct=letrecresolve_auton=tryhResolveidcntwith|UserError_ase->raisee|ewhenCErrors.noncriticale->resolve_auto(n+1)inresolve_auto1let()=Tacentries.tactic_extend__coq_plugin_name"hresolve_core"~level:0[(Tacentries.TyML(Tacentries.TyIdent("hresolve_core",Tacentries.TyIdent("(",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_ident),Tacentries.TyIdent(":=",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyIdent(")",Tacentries.TyIdent("at",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_nat_or_var),Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)))))))))),(funidcocctist-># 695 "plugins/ltac/extratactics.mlg"hResolveidcocct)));(Tacentries.TyML(Tacentries.TyIdent("hresolve_core",Tacentries.TyIdent("(",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_ident),Tacentries.TyIdent(":=",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyIdent(")",Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)))))))),(funidctist-># 696 "plugins/ltac/extratactics.mlg"hResolve_autoidct)))]let()=Tacentries.tactic_extend__coq_plugin_name"hget_evar"~level:0[(Tacentries.TyML(Tacentries.TyIdent("hget_evar",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_nat_or_var),Tacentries.TyNil)),(funnist-># 704 "plugins/ltac/extratactics.mlg"Evar_tactics.hget_evarn)))]# 717 "plugins/ltac/extratactics.mlg"exceptionFoundofunitProofview.tacticletrewrite_excepth=Proofview.Goal.enterbeginfungl->lethyps=Tacmach.New.pf_ids_of_hypsglinTacticals.New.tclMAP(funid->ifId.equalidhthenProofview.tclUNIT()elseTacticals.New.tclTRY(Equality.general_rewrite~where:(Someid)~l2r:trueLocus.AllOccurrences~freeze:true~dep:true~with_evars:false(mkVarh,NoBindings)))hypsendletrefl_equal()=Coqlib.lib_ref"core.eq.type"(* This is simply an implementation of the case_eq tactic. this code
should be replaced by a call to the tactic but I don't know how to
call it before it is defined. *)letmkCaseEqa:unitProofview.tactic=Proofview.Goal.enterbeginfungl->lettype_of_a=Tacmach.New.pf_get_type_ofglainTacticals.New.pf_constr_of_global(delayed_forcerefl_equal)>>=funreq->Tacticals.New.tclTHENLIST[Tactics.generalize[(mkApp(req,[|type_of_a;a|]))];Proofview.Goal.enterbeginfungl->letconcl=Proofview.Goal.conclglinletenv=Proofview.Goal.envglin(* FIXME: this looks really wrong. Does anybody really use
this tactic? *)let(_,c)=Tacred.pattern_occs[Locus.OnlyOccurrences[1],a]env(Evd.from_envenv)conclinchange_conclcend;simplest_casea]endletcase_eq_intros_rewritex=Proofview.Goal.enterbeginfungl->letn=nb_prod(Tacmach.New.projectgl)(Proofview.Goal.conclgl)in(* Pp.msgnl (Printer.pr_lconstr x); *)Tacticals.New.tclTHENLIST[mkCaseEqx;Proofview.Goal.enterbeginfungl->letconcl=Proofview.Goal.conclglinlethyps=Tacmach.New.pf_ids_set_of_hypsglinletn'=nb_prod(Tacmach.New.projectgl)conclinleth=fresh_id_in_envhyps(Id.of_string"heq")(Proofview.Goal.envgl)inTacticals.New.tclTHENLIST[Tacticals.New.tclDO(n'-n-1)intro;introductionh;rewrite_excepth]end]endletrecfind_a_destructable_matchsigmat=letcl=induction_arg_of_quantified_hyp(NamedHyp(Id.of_string"x"))inletcl=[cl,(None,None),None],Noneinletdest=CAst.make@@TacAtom(TacInductionDestruct(false,false,cl))inmatchEConstr.kindsigmatwith|Case(_,_,_,_,_,x,_)whenclosed0sigmax->ifisVarsigmaxthen(* TODO check there is no rel n. *)raise(Found(Tacinterp.eval_tacticdest))else(* let _ = Pp.msgnl (Printer.pr_lconstr x) in *)raise(Found(case_eq_intros_rewritex))|_->EConstr.itersigma(func->find_a_destructable_matchsigmac)tletdestautot=Proofview.tclEVARMAP>>=funsigma->tryfind_a_destructable_matchsigmat;Tacticals.New.tclZEROMSG(str"No destructable match found")withFoundtac->tacletdestauto_inid=Proofview.Goal.enterbeginfungl->letctype=Tacmach.New.pf_get_type_ofgl(mkVarid)in(* Pp.msgnl (Printer.pr_lconstr (mkVar id)); *)(* Pp.msgnl (Printer.pr_lconstr (ctype)); *)destautoctypeendlet()=Tacentries.tactic_extend__coq_plugin_name"destauto"~level:0[(Tacentries.TyML(Tacentries.TyIdent("destauto",Tacentries.TyNil),(funist-># 804 "plugins/ltac/extratactics.mlg"Proofview.Goal.enterbeginfungl->destauto(Proofview.Goal.conclgl)end)));(Tacentries.TyML(Tacentries.TyIdent("destauto",Tacentries.TyIdent("in",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_hyp),Tacentries.TyNil))),(funidist-># 805 "plugins/ltac/extratactics.mlg"destauto_inid)))]let()=Tacentries.tactic_extend__coq_plugin_name"transparent_abstract"~level:0[(Tacentries.TyML(Tacentries.TyIdent("transparent_abstract",Tacentries.TyArg(Extend.TUentryl(Genarg.get_arg_tagwit_tactic,3),Tacentries.TyNil)),(funtist-># 816 "plugins/ltac/extratactics.mlg"Proofview.Goal.enterbeginfungl->Abstract.tclABSTRACT~opaque:falseNone(Tacinterp.tactic_of_valueistt)end;)));(Tacentries.TyML(Tacentries.TyIdent("transparent_abstract",Tacentries.TyArg(Extend.TUentryl(Genarg.get_arg_tagwit_tactic,3),Tacentries.TyIdent("using",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_ident),Tacentries.TyNil)))),(funtidist-># 818 "plugins/ltac/extratactics.mlg"Proofview.Goal.enterbeginfungl->Abstract.tclABSTRACT~opaque:false(Someid)(Tacinterp.tactic_of_valueistt)end;)))]let()=Tacentries.tactic_extend__coq_plugin_name"constr_eq"~level:0[(Tacentries.TyML(Tacentries.TyIdent("constr_eq",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil))),(funxyist-># 825 "plugins/ltac/extratactics.mlg"Tactics.constr_eq~strict:falsexy)))]let()=Tacentries.tactic_extend__coq_plugin_name"constr_eq_strict"~level:0[(Tacentries.TyML(Tacentries.TyIdent("constr_eq_strict",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil))),(funxyist-># 829 "plugins/ltac/extratactics.mlg"Tactics.constr_eq~strict:truexy)))]let()=Tacentries.tactic_extend__coq_plugin_name"constr_eq_nounivs"~level:0[(Tacentries.TyML(Tacentries.TyIdent("constr_eq_nounivs",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil))),(funxyist-># 833 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->ifeq_constr_nounivssigmaxythenProofview.tclUNIT()elseTacticals.New.tclFAIL0(str"Not equal"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_evar"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_evar",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 839 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|Evar_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(str"Not an evar"))))]let()=Tacentries.tactic_extend__coq_plugin_name"has_evar"~level:0[(Tacentries.TyML(Tacentries.TyIdent("has_evar",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 848 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->ifEvarutil.has_undefined_evarssigmaxthenProofview.tclUNIT()elseTacticals.New.tclFAIL0(str"No evars"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_hyp"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_var",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 857 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|Var_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(str"Not a variable or hypothesis"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_fix"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_fix",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 865 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|Fix_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(Pp.str"not a fix definition"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_cofix"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_cofix",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 873 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|CoFix_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(Pp.str"not a cofix definition"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_ind"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_ind",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 881 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|Ind_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(Pp.str"not an (co)inductive datatype"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_constructor"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_constructor",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 889 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|Construct_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(Pp.str"not a constructor"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_proj"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_proj",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 897 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|Proj_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(Pp.str"not a primitive projection"))))]let()=Tacentries.tactic_extend__coq_plugin_name"is_const"~level:0[(Tacentries.TyML(Tacentries.TyIdent("is_const",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil)),(funxist-># 905 "plugins/ltac/extratactics.mlg"Proofview.tclEVARMAP>>=funsigma->matchEConstr.kindsigmaxwith|Const_->Proofview.tclUNIT()|_->Tacticals.New.tclFAIL0(Pp.str"not a constant"))))]let()=Vernacextend.vernac_extend~command:"GrabEvars"?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Grab",Vernacextend.TyTerminal("Existential",Vernacextend.TyTerminal("Variables",Vernacextend.TyNil))),(letcoqpp_body()=Vernacextend.VtModifyProof(# 919 "plugins/ltac/extratactics.mlg"fun~pstate->Declare.Proof.map~f:(funp->Proof.V82.grab_evarsp)pstate)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),Some# 918 "plugins/ltac/extratactics.mlg"classify_as_proofstep))]let()=Tacentries.tactic_extend__coq_plugin_name"shelve"~level:0[(Tacentries.TyML(Tacentries.TyIdent("shelve",Tacentries.TyNil),(funist-># 925 "plugins/ltac/extratactics.mlg"Proofview.shelve)))]let()=Tacentries.tactic_extend__coq_plugin_name"shelve_unifiable"~level:0[(Tacentries.TyML(Tacentries.TyIdent("shelve_unifiable",Tacentries.TyNil),(funist-># 933 "plugins/ltac/extratactics.mlg"Proofview.shelve_unifiable)))]let()=Tacentries.tactic_extend__coq_plugin_name"unshelve"~level:0[(Tacentries.TyML(Tacentries.TyIdent("unshelve",Tacentries.TyArg(Extend.TUentryl(Genarg.get_arg_tagwit_tactic,1),Tacentries.TyNil)),(funtist-># 939 "plugins/ltac/extratactics.mlg"Proofview.with_shelf(Tacinterp.tactic_of_valueistt)>>=fun(gls,())->letgls=List.mapProofview.with_empty_stateglsinProofview.Unsafe.tclGETGOALS>>=funogls->Proofview.Unsafe.tclSETGOALS(gls@ogls))))]let()=Vernacextend.vernac_extend~command:"Unshelve"?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Unshelve",Vernacextend.TyNil),(letcoqpp_body()=Vernacextend.VtModifyProof(# 951 "plugins/ltac/extratactics.mlg"fun~pstate->Declare.Proof.map~f:(funp->Proof.unshelvep)pstate)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),Some# 950 "plugins/ltac/extratactics.mlg"classify_as_proofstep))]let()=Tacentries.tactic_extend__coq_plugin_name"give_up"~level:0[(Tacentries.TyML(Tacentries.TyIdent("give_up",Tacentries.TyNil),(funist-># 959 "plugins/ltac/extratactics.mlg"Proofview.give_up)))]let()=Tacentries.tactic_extend__coq_plugin_name"cycle"~level:0[(Tacentries.TyML(Tacentries.TyIdent("cycle",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_int_or_var),Tacentries.TyNil)),(funnist-># 964 "plugins/ltac/extratactics.mlg"Proofview.cyclen)))]let()=Tacentries.tactic_extend__coq_plugin_name"swap"~level:0[(Tacentries.TyML(Tacentries.TyIdent("swap",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_int_or_var),Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_int_or_var),Tacentries.TyNil))),(funijist-># 969 "plugins/ltac/extratactics.mlg"Proofview.swapij)))]let()=Tacentries.tactic_extend__coq_plugin_name"revgoals"~level:0[(Tacentries.TyML(Tacentries.TyIdent("revgoals",Tacentries.TyNil),(funist-># 974 "plugins/ltac/extratactics.mlg"Proofview.revgoals)))]# 977 "plugins/ltac/extratactics.mlg"typecmp=|Eq|Lt|Le|Gt|Getype'itest=|Testofcmp*'i*'iletpr_cmp=function|Eq->Pp.str"="|Lt->Pp.str"<"|Le->Pp.str"<="|Gt->Pp.str">"|Ge->Pp.str">="letpr_cmp'_prc_prlc_prt=pr_cmpletpr_test_genf(Test(c,x,y))=Pp.(fx++pr_cmpc++fy)letpr_test=pr_test_gen(Pputils.pr_or_varPp.int)letpr_test'_prc_prlc_prt=pr_testletpr_itest=pr_test_genPp.intletpr_itest'_prc_prlc_prt=pr_itestlet(wit_comparison,comparison)=Tacentries.argument_extend~name:"comparison"{Tacentries.arg_parsing=Vernacextend.Arg_rules([(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(CLexer.terminal">="))))(fun_loc-># 1014 "plugins/ltac/extratactics.mlg"Ge));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(CLexer.terminal">"))))(fun_loc-># 1013 "plugins/ltac/extratactics.mlg"Gt));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(CLexer.terminal"<="))))(fun_loc-># 1012 "plugins/ltac/extratactics.mlg"Le));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(CLexer.terminal"<"))))(fun_loc-># 1011 "plugins/ltac/extratactics.mlg"Lt));(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.token(CLexer.terminal"="))))(fun_loc-># 1010 "plugins/ltac/extratactics.mlg"Eq))]);Tacentries.arg_tag=None;Tacentries.arg_intern=Tacentries.ArgInternFun(funistv->(ist,v));Tacentries.arg_subst=Tacentries.ArgSubstFun(funsv->v);Tacentries.arg_interp=Tacentries.ArgInterpRet;Tacentries.arg_printer=((funenvsigma-># 1009 "plugins/ltac/extratactics.mlg"pr_cmp'),(funenvsigma-># 1009 "plugins/ltac/extratactics.mlg"pr_cmp'),(funenvsigma-># 1009 "plugins/ltac/extratactics.mlg"pr_cmp'));}let_=(wit_comparison,comparison)# 1017 "plugins/ltac/extratactics.mlg"letinterp_testistgls=function|Test(c,x,y)->projectgls,Test(c,Tacinterp.interp_int_or_varistx,Tacinterp.interp_int_or_varisty)let(wit_test,test)=Tacentries.argument_extend~name:"test"{Tacentries.arg_parsing=Vernacextend.Arg_rules([(Pcoq.Production.make(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.next(Pcoq.Rule.stop)((Pcoq.Symbol.ntermint_or_var)))((Pcoq.Symbol.ntermcomparison)))((Pcoq.Symbol.ntermint_or_var)))(funycxloc-># 1031 "plugins/ltac/extratactics.mlg"Test(c,x,y)))]);Tacentries.arg_tag=None;Tacentries.arg_intern=Tacentries.ArgInternFun(funistv->(ist,v));Tacentries.arg_subst=Tacentries.ArgSubstFun(funsv->v);Tacentries.arg_interp=Tacentries.ArgInterpLegacy(# 1028 "plugins/ltac/extratactics.mlg"interp_test);Tacentries.arg_printer=((funenvsigma-># 1029 "plugins/ltac/extratactics.mlg"pr_test'),(funenvsigma-># 1030 "plugins/ltac/extratactics.mlg"pr_test'),(funenvsigma-># 1027 "plugins/ltac/extratactics.mlg"pr_itest'));}let_=(wit_test,test)# 1034 "plugins/ltac/extratactics.mlg"letinterp_cmp=function|Eq->Int.equal|Lt->((<):int->int->bool)|Le->((<=):int->int->bool)|Gt->((>):int->int->bool)|Ge->((>=):int->int->bool)letrun_test=function|Test(c,x,y)->interp_cmpcxyletguardtst=ifrun_testtstthenProofview.tclUNIT()elseletmsg=Pp.(str"Condition not satisfied:"++ws1++(pr_itesttst))inTacticals.New.tclZEROMSGmsglet()=Tacentries.tactic_extend__coq_plugin_name"guard"~level:0[(Tacentries.TyML(Tacentries.TyIdent("guard",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_test),Tacentries.TyNil)),(funtstist-># 1056 "plugins/ltac/extratactics.mlg"guardtst)))]# 1059 "plugins/ltac/extratactics.mlg"letdecomposelc=Proofview.Goal.enterbeginfungl->letsigma=Tacmach.New.projectglinletto_indc=ifisIndsigmacthenfst(destIndsigmac)elseuser_errPp.(str"not an inductive type")inletl=List.mapto_indlinElim.h_decomposelcendlet()=Tacentries.tactic_extend__coq_plugin_name"decompose"~level:0[(Tacentries.TyML(Tacentries.TyIdent("decompose",Tacentries.TyIdent("[",Tacentries.TyArg(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_constr)),Tacentries.TyIdent("]",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_constr),Tacentries.TyNil))))),(funlcist-># 1075 "plugins/ltac/extratactics.mlg"decomposelc)))]let()=Vernacextend.vernac_extend~command:"Declare_keys"~classifier:(fun_->Vernacextend.classify_as_sideeff)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Declare",Vernacextend.TyTerminal("Equivalent",Vernacextend.TyTerminal("Keys",Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNonTerminal(Extend.TUentry(Genarg.get_arg_tagwit_constr),Vernacextend.TyNil))))),(letcoqpp_bodycc'()=Vernacextend.VtDefault(fun()-># 1081 "plugins/ltac/extratactics.mlg"letget_keyc=letenv=Global.env()inletevd=Evd.from_envenvinlet(evd,c)=Constrintern.interp_open_constrenvevdcinletkindc=EConstr.kindevdcinKeys.constr_keykindcinletk1=get_keycinletk2=get_keyc'inmatchk1,k2with|Somek1,Somek2->Keys.declare_equiv_keysk1k2|_->())infuncc'?loc~atts()->coqpp_bodycc'(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.vernac_extend~command:"Print_keys"~classifier:(fun_->Vernacextend.classify_as_query)?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Print",Vernacextend.TyTerminal("Equivalent",Vernacextend.TyTerminal("Keys",Vernacextend.TyNil))),(letcoqpp_body()=Vernacextend.VtDefault(fun()-># 1097 "plugins/ltac/extratactics.mlg"Feedback.msg_notice(Keys.pr_keysPrinter.pr_global))infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),None))]let()=Vernacextend.vernac_extend~command:"OptimizeProof"?entry:None[(Vernacextend.TyML(false,Vernacextend.TyTerminal("Optimize",Vernacextend.TyTerminal("Proof",Vernacextend.TyNil)),(letcoqpp_body()=Vernacextend.VtModifyProof(# 1103 "plugins/ltac/extratactics.mlg"fun~pstate->Declare.Proof.compactpstate)infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),Some# 1102 "plugins/ltac/extratactics.mlg"classify_as_proofstep));(Vernacextend.TyML(false,Vernacextend.TyTerminal("Optimize",Vernacextend.TyTerminal("Heap",Vernacextend.TyNil)),(letcoqpp_body()=Vernacextend.VtDefault(fun()-># 1105 "plugins/ltac/extratactics.mlg"Gc.compact())infun?loc~atts()->coqpp_body(Attributes.unsupported_attributesatts)),Some# 1104 "plugins/ltac/extratactics.mlg"classify_as_proofstep))]# 1110 "plugins/ltac/extratactics.mlg"lettclOPTIMIZE_HEAP=Proofview.tclLIFT(Proofview.NonLogical.make(fun()->Gc.compact()))let()=Tacentries.tactic_extend__coq_plugin_name"optimize_heap"~level:0[(Tacentries.TyML(Tacentries.TyIdent("optimize_heap",Tacentries.TyNil),(funist-># 1118 "plugins/ltac/extratactics.mlg"tclOPTIMIZE_HEAP)))]let()=Tacentries.tactic_extend__coq_plugin_name"with_strategy"~level:0[(Tacentries.TyML(Tacentries.TyIdent("with_strategy",Tacentries.TyArg(Extend.TUentry(Genarg.get_arg_tagwit_strategy_level_or_var),Tacentries.TyIdent("[",Tacentries.TyArg(Extend.TUlist1(Extend.TUentry(Genarg.get_arg_tagwit_smart_global)),Tacentries.TyIdent("]",Tacentries.TyArg(Extend.TUentryl(Genarg.get_arg_tagwit_tactic,3),Tacentries.TyNil)))))),(funvqtacist-># 1124 "plugins/ltac/extratactics.mlg"with_set_strategy[(v,q)](Tacinterp.tactic_of_valueisttac))))]