/*
         * The method Skolemize performs best-effort skolemization of the input expression expr.
         * If polarity == Polarity.Negative, a quantifier F embedded in expr is skolemized
         * provided it can be proved that F is a forall quantifier in the NNF version of expr.
         * If polarity == Polarity.Positive, a quantifier F embedded in expr is skolemized
         * provided it can be proved that F is an exists quantifier in the NNF version of expr.
         *
         * Factorization is performed on the resulting expression.
         */
        public static VCExpr Skolemize(QuantifierInstantiationEngine qiEngine, Polarity polarity, VCExpr vcExpr)
        {
            var skolemizer     = new Skolemizer(qiEngine, polarity, vcExpr);
            var skolemizedExpr = skolemizer.Mutate(vcExpr, true);

            return(Factorizer.Factorize(qiEngine, QuantifierCollector.Flip(polarity), skolemizedExpr));
        }
        public static HashSet <VCExprVar> CollectBindings(QuantifierInstantiationEngine qiEngine, VCExpr vcExpr)
        {
            var bindingCollector = new BindingCollector(qiEngine);

            bindingCollector.Traverse(vcExpr, true);
            return(bindingCollector.bindings);
        }
 private LambdaInstanceCollector(QuantifierInstantiationEngine qiEngine)
 {
     this.qiEngine         = qiEngine;
     this.lambdaFunctions  = new HashSet <Function>();
     this.instances        = new HashSet <VCExprNAry>();
     this.instancesOnStack = new Stack <VCExprNAry>();
 }
        public static VCExpr Instantiate(Implementation impl, VCExpressionGenerator vcExprGen, Boogie2VCExprTranslator exprTranslator, VCExpr vcExpr)
        {
            if (!InstantiationSourceChecker.HasInstantiationSources(impl))
            {
                return(vcExpr);
            }
            var qiEngine = new QuantifierInstantiationEngine(vcExprGen, exprTranslator);

            return(qiEngine.Execute(impl, vcExpr));
        }
        public static Dictionary <Function, HashSet <List <VCExpr> > > CollectInstances(QuantifierInstantiationEngine qiEngine, VCExpr vcExpr)
        {
            var lambdaInstanceCollector = new LambdaInstanceCollector(qiEngine);

            lambdaInstanceCollector.Traverse(vcExpr, true);
            var lambdaFunctionToInstances = new Dictionary <Function, HashSet <List <VCExpr> > >();

            foreach (var instance in lambdaInstanceCollector.instances)
            {
                var function = (instance.Op as VCExprBoogieFunctionOp).Func;
                if (!lambdaFunctionToInstances.ContainsKey(function))
                {
                    lambdaFunctionToInstances[function] = new HashSet <List <VCExpr> >(new ListComparer <VCExpr>());
                }
                lambdaFunctionToInstances[function].Add(instance.UniformArguments.ToList());
            }
            return(lambdaFunctionToInstances);
        }
 private BindingCollector(QuantifierInstantiationEngine qiEngine)
 {
     this.qiEngine = qiEngine;
     this.bindings = new HashSet <VCExprVar>();
 }
 private Factorizer(QuantifierInstantiationEngine qiEngine, Polarity polarity, VCExpr vcExpr) : base(qiEngine.vcExprGen)
 {
     this.qiEngine    = qiEngine;
     this.quantifiers = QuantifierCollector.CollectQuantifiers(vcExpr, polarity);
 }
        public static VCExpr Factorize(QuantifierInstantiationEngine qiEngine, Polarity polarity, VCExpr vcExpr)
        {
            var factorizer = new Factorizer(qiEngine, polarity, vcExpr);

            return(factorizer.Mutate(vcExpr, true));
        }
 private Skolemizer(QuantifierInstantiationEngine qiEngine, Polarity polarity, VCExpr vcExpr) : base(qiEngine.vcExprGen)
 {
     this.qiEngine    = qiEngine;
     this.quantifiers = QuantifierCollector.CollectQuantifiers(vcExpr, polarity);
     this.bound       = new Dictionary <VCExprVar, VCExpr>();
 }