123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148(************************************************************************)(* * The Rocq Prover / The Rocq 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) *)(************************************************************************)openPpopenNamesopenRewritetypeunary_strategy=Subterms|Subterm|Innermost|Outermost|Bottomup|Topdown|Progress|Try|Any|Repeattypebinary_strategy=|Composetypenary_strategy=Choicetype('constr,'constr_pattern,'redexpr,'id,'tactic)strategy_ast=|StratId|StratFail|StratRefl|StratUnaryofunary_strategy*('constr,'constr_pattern,'redexpr,'id,'tactic)strategy_ast|StratBinaryofbinary_strategy*('constr,'constr_pattern,'redexpr,'id,'tactic)strategy_ast*('constr,'constr_pattern,'redexpr,'id,'tactic)strategy_ast|StratNAryofnary_strategy*('constr,'constr_pattern,'redexpr,'id,'tactic)strategy_astlist|StratConstrof'constr*bool|StratTermsof'constrlist|StratHintsofbool*string|StratEvalof'redexpr|StratFoldof'constr|StratVarof'id|StratFixof'id*('constr,'constr_pattern,'redexpr,'id,'tactic)strategy_ast|StratMatchesof'constr_pattern|StratTacticof'tacticletrecmap_strategyfghij=function|StratId|StratFail|StratReflass->s|StratUnary(s,str)->StratUnary(s,map_strategyfghijstr)|StratBinary(s,str,str')->StratBinary(s,map_strategyfghijstr,map_strategyfghijstr')|StratNAry(s,strs)->StratNAry(s,List.map(map_strategyfghij)strs)|StratConstr(c,b)->StratConstr(fc,b)|StratTermsl->StratTerms(List.mapfl)|StratHints(b,id)->StratHints(b,id)|StratEvalr->StratEval(hr)|StratFoldc->StratFold(fc)|StratVarid->StratVar(iid)|StratFix(id,s)->StratFix(iid,map_strategyfghijs)|StratMatchesc->StratMatches(gc)|StratTactict->StratTactic(jt)letpr_ustrategy=function|Subterms->str"subterms"|Subterm->str"subterm"|Innermost->str"innermost"|Outermost->str"outermost"|Bottomup->str"bottomup"|Topdown->str"topdown"|Progress->str"progress"|Try->str"try"|Any->str"any"|Repeat->str"repeat"letparenp=str"("++p++str")"letrecpr_strategy0prcprcpprrpridprtac=function|StratId->str"id"|StratFail->str"fail"|StratRefl->str"refl"|str->paren(pr_strategyprcprcpprrpridprtacstr)andpr_strategy1prcprcpprrpridprtac=function|StratUnary(s,str)->pr_ustrategys++spc()++pr_strategy1prcprcpprrpridprtacstr|StratNAry(Choice,strs)->str"choice"++brk(1,2)++prlist_with_sepspc(funstr->hov0(pr_strategy0prcprcpprrpridprtacstr))strs|StratConstr(c,true)->prcc|StratConstr(c,false)->str"<-"++spc()++prcc|StratVarid->pridid|StratTermscl->str"terms"++spc()++pr_sequenceprccl|StratHints(old,id)->letcmd=ifoldthen"old_hints"else"hints"instrcmd++spc()++strid|StratEvalr->str"eval"++spc()++prrr|StratFoldc->str"fold"++spc()++prcc|StratMatchesp->str"pattern"++spc()++prcpp|StratTactict->str"tactic"++spc()++prtact|str->pr_strategy0prcprcpprrpridprtacstrandpr_strategy2prcprcpprrpridprtac=function|StratBinary(Compose,str1,str2)->pr_strategy2prcprcpprrpridprtacstr1++str";"++spc()++hov0(pr_strategy1prcprcpprrpridprtacstr2)|str->hov0(pr_strategy1prcprcpprrpridprtacstr)andpr_strategyprcprcpprrpridprtac=function|StratFix(id,s)->str"fix"++spc()++pridid++spc()++str":="++spc()++hov0(pr_strategy1prcprcpprrpridprtacs)|str->pr_strategy2prcprcpprrpridprtacstrletstrategy_of_astbindingsstrat=letrecauxbindings=function|StratId->Strategies.id|StratFail->Strategies.fail|StratRefl->Strategies.refl|StratUnary(f,s)->lets'=auxbindingssinletf'=matchfwith|Subterms->Strategies.all_subterms|Subterm->Strategies.one_subterm|Innermost->Strategies.innermost|Outermost->Strategies.outermost|Bottomup->Strategies.bottomup|Topdown->Strategies.topdown|Progress->Strategies.progress|Try->Strategies.try_|Any->Strategies.any|Repeat->Strategies.repeatinf's'|StratBinary(f,s,t)->lets'=auxbindingssinlett'=auxbindingstinletf'=matchfwith|Compose->Strategies.seqinf's't'|StratNAry(Choice,strs)->letstrs=List.map(auxbindings)strsinbeginmatchstrswith|[]->assertfalse|s::strs->List.fold_leftStrategies.choicesstrsend|StratConstr((_,c),b)->Strategies.one_lemmacbNoneAllOccurrences|StratHints(old,id)->ifoldthenStrategies.old_hintsidelseStrategies.hintsid|StratTermsl->Strategies.lemmas(List.map(fun(_,c)->(c,true,None))l)|StratEvalr->Strategies.with_env@@funenvsigma->letsigma,r=renvsigmainsigma,Strategies.reducer|StratFoldc->Strategies.fold_glob(fstc)|StratVarid->Id.Map.getidbindings|StratFix(id,s)->Strategies.fix(funself->aux(Id.Map.addidselfbindings)s)|StratMatchesp->Strategies.matchesp|StratTactict->Strategies.ltac1_tactic_calltinauxbindingsstratletstrategy_of_asts=strategy_of_astId.Map.emptys