如何为求解器对象创建一个接口并使用它(Z3求解器)

时间:2016-06-29 14:23:15

标签: c# interface z3 smt

我是C#的新手。我有一个类,其中包含一些使用求解器对象的方法。但是,对于每个方法,我需要再次创建一个求解器对象的实例来使用它。有人可以通过使用接口告诉我如何避免这样做吗? 创建一个接口不是问题,但是一旦创建它就会如何使用它?

例如: 这是我的界面,包含解算器

 public interface ISolver
    {
        public void Solve(Solver s);

    }

这是一个实现ISolver接口的方法

 public void Solve(Solver s)
        {
            Context ctx = new Context();
            ctx.MkSolver();

        }

我想在一些方法中使用它(注意:我只有一个包含不同方法的单个类) 其中一种方法如下:

public void MyCheck(Expression expr)
{
    BoolExpr boolVal = dispatch(expr);
    Solver s = ctx.MkSolver();
    Console.WriteLine(boolVal);
    s.Assert(boolVal);
    Console.WriteLine("\n ");
    Console.WriteLine(s.Check());
    Console.WriteLine(ReturnTrueFalse(s));
    Console.WriteLine("\n ");
}

另一个是:

public bool isContradiction(Expression expr)
{
    BoolExpr boolVal = dispatch(expr);
    Solver s = ctx.MkSolver();
    s.Assert(boolVal);
    Status result = s.Check();
    return result == Status.UNSATISFIABLE;
}

如何使用此界面停止在每个方法中使用 Solver s = ctx.MkSolver(); 。任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我无法通过使用界面看到你想要删除行Solver s = ctx.MkSolver()。相反,我会将Solver实例存储在类的成员变量中。并且可能添加一个易于使用的属性:

public class YourClass
{
    private Solver _solver;
    private Solver MySolver
    {
        get {
            if (_solver == null) _solver = ctx.MkSolver();
            return _solver;
        }
    }

    // ...

您在问题中显示的代码表明ctx可用于您的类的范围,因此我也在此属性中使用它。

您现在可以在方法中使用此属性:

public void MyCheck(Expression expr)
{
    BoolExpr boolVal = dispatch(expr);
    Console.WriteLine(boolVal);
    MySolver.Assert(boolVal); // use property
    Console.WriteLine("\n ");
    Console.WriteLine(MySolver.Check());
    Console.WriteLine(ReturnTrueFalse(s));
    Console.WriteLine("\n ");
}

public bool isContradiction(Expression expr)
{
    BoolExpr boolVal = dispatch(expr);
    MySolver.Assert(boolVal);
    Status result = MySolver.Check();
    return result == Status.UNSATISFIABLE;
}