简单的 z3 问题 - 为什么 x*x-1==0 不 return 两个根
simple z3 question - why x*x-1==0 does not return both roots
我只是想研究 z3 及其 .NET 界面。为此,我正在使用 PowerShell,以使其更具交互性。下面是我的第一个 hello world
。
$ctx = [Microsoft.Z3.Context]::new()
$x = $ctx.MkConst("x", $ctx.MkIntSort())
$zero = $ctx.MkNumeral(0, $ctx.MkIntSort())
$one = $ctx.MkNumeral(1, $ctx.MkIntSort())
$s = $ctx.MkSolver()
$expr = $x * $x - $one # x*x- 1
$assert = $s.Assert($ctx.MkEq( $expr, $zero)) # x*x - 1 = 0
$s.Check()
$m = $s.Model
$m.Decls | % { "$($_.Name) -> $($m.ConstInterp($_))" }
然而,returns
SATISFIABLE
x -> -1
这让我有点困惑,因为我希望它 return 两个根,1 和 -1
当我在 python(在 google colab)中尝试这个时,它变得越混乱
x = Int('x')
solve(x*x-1==0)
它说
这两种情况我都做错了什么?
z3(和一般的 SMT 求解器)将 return 每次调用 check
只有一个模型。如果你想找出“所有解决方案”,那么你必须列举它们。有几种不同的方法,请在 Python 上下文中查看此答案 (Z3Py) checking all solutions for equation;也可以翻译成其他 API。
所以,你没有做错任何事。您只是获得了一种可能的模型,因为这就是 z3 API 的工作原理。
我只是想研究 z3 及其 .NET 界面。为此,我正在使用 PowerShell,以使其更具交互性。下面是我的第一个 hello world
。
$ctx = [Microsoft.Z3.Context]::new()
$x = $ctx.MkConst("x", $ctx.MkIntSort())
$zero = $ctx.MkNumeral(0, $ctx.MkIntSort())
$one = $ctx.MkNumeral(1, $ctx.MkIntSort())
$s = $ctx.MkSolver()
$expr = $x * $x - $one # x*x- 1
$assert = $s.Assert($ctx.MkEq( $expr, $zero)) # x*x - 1 = 0
$s.Check()
$m = $s.Model
$m.Decls | % { "$($_.Name) -> $($m.ConstInterp($_))" }
然而,returns
SATISFIABLE
x -> -1
这让我有点困惑,因为我希望它 return 两个根,1 和 -1
当我在 python(在 google colab)中尝试这个时,它变得越混乱
x = Int('x')
solve(x*x-1==0)
它说
这两种情况我都做错了什么?
z3(和一般的 SMT 求解器)将 return 每次调用 check
只有一个模型。如果你想找出“所有解决方案”,那么你必须列举它们。有几种不同的方法,请在 Python 上下文中查看此答案 (Z3Py) checking all solutions for equation;也可以翻译成其他 API。
所以,你没有做错任何事。您只是获得了一种可能的模型,因为这就是 z3 API 的工作原理。