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);
        }