public bool BindLambdaFunction(Function lambdaFunction) { if (lambdaDefinition.ContainsKey(lambdaFunction)) { return(true); } var lambdaDefinitionExpr = lambdaFunction.DefinitionAxiom.Expr as QuantifierExpr; if (lambdaDefinitionExpr.TypeParameters.Count > 0) { return(false); } var translatedExpr = exprTranslator.Translate(lambdaDefinitionExpr) as VCExprQuantifier; var boundVariableToLabels = translatedExpr.Info.instantiationLabels; var numParametersInLambdaDefinition = lambdaDefinitionExpr.Dummies.Count - lambdaFunction.InParams.Count; if (boundVariableToLabels.Count < numParametersInLambdaDefinition || Enumerable.Range(lambdaFunction.InParams.Count, numParametersInLambdaDefinition) .Any(i => boundVariableToLabels[translatedExpr.BoundVars[i]].Count == 0)) { return(false); } lambdaDefinition[lambdaFunction] = translatedExpr; quantifierInstantiationInfo[translatedExpr] = new QuantifierInstantiationInfo(boundVariableToLabels); return(true); }
public VCExpr BindQuantifier(VCExprQuantifier node) { if (node.TypeParameters.Count > 0) { return(node); } var boundVariableToLabels = node.Info.instantiationLabels; if (boundVariableToLabels.Count < node.BoundVars.Count || boundVariableToLabels.Any(kv => kv.Value.Count == 0)) { return(node); } var v = new VCExprVar($"{quantifierBindingNamePrefix}{quantifierBinding.Count}", Type.Bool); quantifierBinding[v] = node; quantifierInstantiationInfo[node] = new QuantifierInstantiationInfo(boundVariableToLabels); return(v); }