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