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

How to create an interface for solver object and use it (Z3 solver)

我是 C# 新手。我有一个 class 里面有一些方法,它们使用求解器对象。但是,对于每个方法,我都需要再次创建一个求解器对象的实例来使用它。有人可以告诉我如何通过使用接口来避免这样做吗? 做一个界面不成问题,但是做了之后怎么用呢??

例如: 这是我的界面,其中包含一个求解器

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

    }

这是实现 ISolver 接口的方法

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

        }

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

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();。任何帮助,将不胜感激。谢谢。

我看不出您想如何通过使用界面来摆脱行 Solver s = ctx.MkSolver()。相反,我会将 Solver 实例存储在 class 的成员变量中。也许添加一个 属性 以便于使用:

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

    // ...

你在问题中显示的代码表明 ctx 在你的 class 范围内可用,所以我也在这个 属性 中使用了它。

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

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