示例#1
0
 public static void CollectHoudiniConstants(Houdini houdini, Implementation impl,
                                            out ExistentialConstantCollector collector)
 {
     collector      = new ExistentialConstantCollector(houdini);
     collector.impl = impl;
     collector.VisitImplementation(impl);
 }
示例#2
0
        public HoudiniSession(Houdini houdini, VCGen vcgen, ProverInterface proverInterface, Program program, Implementation impl, HoudiniStatistics stats, int taskID = -1)
        {
            this.descriptiveName = impl.Name;
            this.stats           = stats;
            collector            = new ConditionGeneration.CounterexampleCollector();
            collector.OnProgress("HdnVCGen", 0, 0, 0.0);

            vcgen.ConvertCFG2DAG(impl, taskID: taskID);
            ModelViewInfo mvInfo;
            var           gotoCmdOrigins = vcgen.PassifyImpl(impl, out mvInfo);

            ExistentialConstantCollector ecollector;

            ExistentialConstantCollector.CollectHoudiniConstants(houdini, impl, out ecollector);
            this.houdiniAssertConstants   = ecollector.houdiniAssertConstants;
            this.houdiniAssumeConstants   = ecollector.houdiniAssumeConstants;
            this.explainConstantsNegative = ecollector.explainNegative;
            this.explainConstantsPositive = ecollector.explainPositive;
            this.constantToControl        = ecollector.constToControl;

            houdiniConstants = new HashSet <Variable>();
            houdiniConstants.UnionWith(houdiniAssertConstants);
            houdiniConstants.UnionWith(houdiniAssumeConstants);

            var    exprGen = proverInterface.Context.ExprGen;
            VCExpr controlFlowVariableExpr = CommandLineOptions.Clo.UseLabels ? null : exprGen.Integer(BigNum.ZERO);

            Dictionary <int, Absy> label2absy;

            conjecture = vcgen.GenerateVC(impl, controlFlowVariableExpr, out label2absy, proverInterface.Context);
            if (!CommandLineOptions.Clo.UseLabels)
            {
                VCExpr controlFlowFunctionAppl = exprGen.ControlFlowFunctionApplication(exprGen.Integer(BigNum.ZERO), exprGen.Integer(BigNum.ZERO));
                VCExpr eqExpr = exprGen.Eq(controlFlowFunctionAppl, exprGen.Integer(BigNum.FromInt(impl.Blocks[0].UniqueId)));
                conjecture = exprGen.Implies(eqExpr, conjecture);
            }

            Macro macro = new Macro(Token.NoToken, descriptiveName, new List <Variable>(), new Formal(Token.NoToken, new TypedIdent(Token.NoToken, "", Type.Bool), false));

            proverInterface.DefineMacro(macro, conjecture);
            conjecture = exprGen.Function(macro);

            if (CommandLineOptions.Clo.vcVariety == CommandLineOptions.VCVariety.Local)
            {
                handler = new VCGen.ErrorReporterLocal(gotoCmdOrigins, label2absy, impl.Blocks, vcgen.incarnationOriginMap, collector, mvInfo, proverInterface.Context, program);
            }
            else
            {
                handler = new VCGen.ErrorReporter(gotoCmdOrigins, label2absy, impl.Blocks, vcgen.incarnationOriginMap, collector, mvInfo, proverInterface.Context, program);
            }
        }
示例#3
0
 public static void CollectHoudiniConstants(Houdini houdini, Implementation impl, out ExistentialConstantCollector collector)
 {
     collector = new ExistentialConstantCollector(houdini);
       collector.impl = impl;
       collector.VisitImplementation(impl);
 }