public Tuple <string, IEnumerable <LemmaDecl> > GenerateTactic(Expr e) { var varCollector = new VariableCollector(); varCollector.Visit(e); var lookupTyThms = new List <string>(); var funMemThms = new List <string>(); foreach (var v in varCollector.usedVars) { try { lookupTyThms.Add(programAccessor.LookupVarTyLemma(v)); } catch { //variable not found, possible if, for example, v is bound } } var usedFuncs = functionCollector.UsedFunctions(e); foreach (var f in usedFuncs) { funMemThms.Add(programAccessor.MembershipLemma(f)); } var hintLemmas = equalityHintGenerator.GetHints(e); var hintsML = MLUtil.IsaToMLThms(hintLemmas.Select(lemma => lemma.Name)); var lookupTyML = MLUtil.IsaToMLThms(lookupTyThms); var funMemML = MLUtil.IsaToMLThms(funMemThms); var args = new List <string> { MLUtil.ContextAntiquotation(), hintsML, lookupTyML, funMemML }; var tactic = ProofUtil.Apply(ProofUtil.MLTactic("typing_tac " + string.Join(" ", args), 1)); return(Tuple.Create(tactic, hintLemmas)); }
public LemmaDecl AxiomVcLemma(string lemmaName, Axiom axiom, VCExpr vcAxiom, out IList <OuterDecl> requiredDecls) { var vc = vcAxiomInst.GetVCObjInstantiation(vcAxiom, declToVCMapping); var axiomTerm = basicCmdIsaVisitor.Translate(axiom.Expr); requiredDecls = new List <OuterDecl>(); vcRewriteLemmaGen.RequiredVcRewrite(axiom.Expr, true, out var vcRewriteLemmas); VCExprHint exprHint; if (vcRewriteLemmas != null && vcRewriteLemmas.Any()) { exprHint = new VCExprHint(vcRewriteLemmas); requiredDecls.AddRange(vcRewriteLemmas); } else { exprHint = VCExprHint.EmptyExprHint(); } var assumption = IsaBoogieTerm.RedExpr(boogieContext, axiomTerm, normalInitState, IsaBoogieTerm.BoolVal(true)); var statement = vc; return (new LemmaDecl(lemmaName, ContextElem.CreateWithAssumptions(assumption), statement, new Proof(new List <string> { "unfolding " + vcAxiomInst.GetVCObjNameRef(vcAxiom) + "_def", ProofUtil.By( ProofUtil.MLTactic( "prove_axiom_vc_tac @{context} (" + exprHint.GetMLString() + ") " + MLUtil.IsaToMLThm("assms(1)") + " " + MLUtil.IsaToMLThms(globalAssmsName) + " (@{thm forall_poly_thm}, @{thm exists_poly_thm}) []", 1) ) }) )); }
//assume that block identities in the two CFGs are the same (only edges may be different) private static IDictionary <Block, IList <OuterDecl> > GenerateVCLemmas( CFGRepr afterPassificationCfg, CFGRepr finalCfg, IDictionary <Block, Block> afterPassiveToFinalBlock, IDictionary <Block, Block> afterPassiveToOrigBlock, HashSet <Block> reachableBlocks, VcPhaseLemmaManager vcPhaseLemmaManager, VCHintManager vcHintManager, IsaUniqueNamer lemmaNamer) { var blockToLemmaDecls = new Dictionary <Block, IList <OuterDecl> >(); foreach (var bAfterPassive in afterPassificationCfg.GetBlocksBackwards()) { var result = new List <OuterDecl>(); if (afterPassiveToFinalBlock.TryGetValue(bAfterPassive, out var bFinal)) { string vcHintsName = null; if (vcHintManager.TryGetHints(afterPassiveToOrigBlock[bAfterPassive], out var hints, out var requiredDecls)) { //FIXME potential val name clash vcHintsName = GetLemmaName(bAfterPassive, lemmaNamer) + "_hints"; var code = MLUtil.DefineVal(vcHintsName, MLUtil.MLList(hints)); //required declarations must be added first result.AddRange(requiredDecls); result.Add(new MLDecl(code)); } result.Add(vcPhaseLemmaManager.GenerateBlockLemma( bAfterPassive, bFinal, finalCfg.GetSuccessorBlocks(bFinal), GetLemmaName(bFinal, lemmaNamer), vcHintsName)); //do not use identity of final CFG block to be consistent with other branches blockToLemmaDecls.Add(bAfterPassive, result); } else if (reachableBlocks.Contains(bAfterPassive)) { //block was removed after peephole but is reachable before peephole if (bAfterPassive.Cmds.Count == 0) { //find the successors of b in the final cfg (i.e., the first non-empty reachable blocks) var nonEmptyReachableSuccessors = GetNonEmptyReachableSuccessors(bAfterPassive, afterPassificationCfg, finalCfg, afterPassiveToFinalBlock); //add lemma var decls = new List <OuterDecl> { vcPhaseLemmaManager.GenerateEmptyBlockLemma( bAfterPassive, nonEmptyReachableSuccessors.Select(b => afterPassiveToFinalBlock[b]), GetLemmaName(bAfterPassive, lemmaNamer)) }; blockToLemmaDecls.Add(bAfterPassive, decls); } else { throw new ProofGenUnexpectedStateException( "Non-empty reachable block removed during peep-hole"); } } } return(blockToLemmaDecls); }