Microsoft.Fast.Const.GenerateZ3Expr C# (CSharp) Method

GenerateZ3Expr() private method

private GenerateZ3Expr ( AppExp expr, FastTransducerInstance fti ) : Expr
expr Microsoft.Fast.AST.AppExp
fti FastTransducerInstance
return Microsoft.Z3.Expr
        private Expr GenerateZ3Expr(AppExp expr, FastTransducerInstance fti)
        {
            List<Expr> termList = new List<Expr>();
            switch (expr.func.name.text)
            {
                case ("="):
                    {
                        return z3p.MkEq(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("and"):
                    {
                        foreach (var arg in expr.args)
                            termList.Add(GenerateZ3ExprFromExpr(arg, fti));
                        return z3p.MkAnd(termList.ToArray());
                    }
                case ("xor"):
                    {
                        if (expr.args.Count > 2)
                            throw new Exception("Too many arguments");
                        return z3p.Z3.MkXor((BoolExpr)GenerateZ3ExprFromExpr(expr.args[0], fti), (BoolExpr)GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("not"):
                    {
                        return z3p.MkNot(GenerateZ3ExprFromExpr(expr.args[0], fti));
                    }
                case ("or"):
                    {
                        foreach (var arg in expr.args)
                            termList.Add(GenerateZ3ExprFromExpr(arg, fti));
                        return z3p.MkOr(termList.ToArray());
                    }
                case ("=>"):
                    {
                        return z3p.MkOr(z3p.MkNot(GenerateZ3ExprFromExpr(expr.args[0], fti)), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("+"):
                    {
                        foreach (var arg in expr.args)
                            termList.Add(GenerateZ3ExprFromExpr(arg, fti));
                        if (z3p.GetSort(termList[0]).SortKind == Z3_sort_kind.Z3_BV_SORT)
                            return z3p.MkBvAddMany(termList.ToArray());
                        return z3p.MkAdd(termList.ToArray());
                    }
                case ("/"):
                    {
                        return z3p.MkDiv(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("-"):
                    {
                        return z3p.MkSub(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("*"):
                    {
                        return z3p.MkMul(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("<"):
                    {
                        return z3p.MkLt(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("<="):
                    {
                        return z3p.MkLe(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case (">"):
                    {
                        return z3p.MkGt(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }

                case (">="):
                    {
                        return z3p.MkGe(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti));
                    }
                case ("if"):
                    {
                        return z3p.MkIte(GenerateZ3ExprFromExpr(expr.args[0], fti), GenerateZ3ExprFromExpr(expr.args[1], fti), GenerateZ3ExprFromExpr(expr.args[2], fti));
                    }
                default:
                    {
                        foreach (var f in fti.functions)
                        {
                            if (expr.func.name.text == f.name)
                            {
                                List<Expr> argsExprs = new List<Expr>();
                                foreach (var a in expr.args)
                                {
                                    argsExprs.Add(GenerateZ3ExprFromExpr(a, fti));
                                }
                                return z3p.ApplySubstitution(f.functionDef, f.variableExprs.Values.ToArray(), argsExprs.ToArray<Expr>());
                                //return z3p.MkApp(f.funcDecl, argsExprs.ToArray<Expr>());
                            }
                        }
                        throw new Exception("Function not defined");
                    }
            }
        }

Same methods

Const::GenerateZ3Expr ( Value expr, FastTransducerInstance fti ) : Expr
Const::GenerateZ3Expr ( Variable expr, FastTransducerInstance fti ) : Expr