如何为求解器对象创建接口并使用它(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;
}
我是 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;
}