/* * 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>(); }