Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 public override void OnModel(IList <string> labels, Model model, ProverInterface.Outcome proverOutcome)
 {
     Debug.Assert(model != null);
     //model.Write(Console.Out);
     this.model = model;
 }