简单的 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 的工作原理。