private bool ProcessImpl(Implementation impl) { var ret = false; var gen = prover.VCExprGen; // construct summaries var env = VCExpressionGenerator.True; foreach (var tup in impl2CalleeSummaries[impl.Name]) { if (tup.Item1 == impl.Name) { continue; } var calleeSummary = impl2Summary[tup.Item1].GetSummaryExpr( GetVarMapping(name2Impl[tup.Item1], tup.Item2), prover.VCExprGen); env = gen.AndSimp(env, gen.Eq(tup.Item2, calleeSummary)); } while (true) { // construct self summaries var summaryExpr = VCExpressionGenerator.True; foreach (var tup in impl2CalleeSummaries[impl.Name]) { if (tup.Item1 != impl.Name) { continue; } var ts = impl2Summary[tup.Item1].GetSummaryExpr( GetVarMapping(name2Impl[tup.Item1], tup.Item2), prover.VCExprGen); summaryExpr = gen.AndSimp(summaryExpr, gen.Eq(tup.Item2, ts)); } Console.WriteLine("Trying summary for {0}: {1}", impl.Name, summaryExpr); reporter.model = null; var vc = gen.AndSimp(env, summaryExpr); vc = gen.Implies(vc, impl2VC[impl.Name]); //Console.WriteLine("Checking: {0}", vc); prover.BeginCheck(impl.Name, vc, reporter); ProverInterface.Outcome proverOutcome = prover.CheckOutcome(reporter); if (reporter.model == null) { break; } var state = CollectState(impl); impl2Summary[impl.Name].Join(state); ret = true; } return(ret); }
public override void OnModel(IList <string> labels, Model model, ProverInterface.Outcome proverOutcome) { Debug.Assert(model != null); //model.Write(Console.Out); this.model = model; }