smt.arith.nl.gb 对(句法)相等推理的意外影响 - 错误?

Unexpected effect of smt.arith.nl.gb on reasoning with (syntactic) equality - bug?

考虑以下 SMTLIB 程序(在 rise4fun here 上):

(set-option :auto_config false)
(set-option :smt.mbqi false)
(set-option :smt.arith.nl.gb false)

(declare-const n Int)
(declare-const i Int)
(declare-const r Int)

(assert (= i n))
(assert (= r (* i n)))

(push)
(assert (not (= r (* n n))))
(check-sat) ; unknown
(pop)

虽然看起来只需要句法相等的推理,但是Z3(4.3.2正式版,还有4.4.0 b6c40c6c0eaf)却未能证明最终的断言是unsat.

出乎意料(至少对我而言),将 smt.arith.nl.gb 设置为 true 使示例得到验证(即 check-sat 产生 unsat)。

关于它的价值,这里有一些进一步的观察:

这是错误还是需要 smt.arith.nl.gb 才能显示此示例 unsat

这不一定是错误。 Groebner-basis 计算解决了这个问题,所以很快就找到了不满意的结果(很好,所以默认启用)。此外,禁用 auto_config 还意味着不会根据问题设置许多其他选项(但在这种特殊情况下没有区别)。

请注意,一些策略、求解器或简化器在看到乘法表达式时会简单地放弃,而不管这个问题对于人类或其他求解器来说是否容易解决。在这种特殊情况下,非线性求解器在 smt.arith.nl.rounds 耗尽后放弃(默认为 1024),因此它 returns 未知。

快速解决此问题的策略之一是 solve-eqs,但这不是默认策略的一部分(在本例中它运行 qfnia 策略)。如果它解决了您的问题,您可以通过将 check-sat 命令替换为

来轻松添加它
(check-sat-using (then solve-eqs qfnia))

这是否应该是默认值是有争议的,并且取决于基准测试,但这并不是真正的错误。

另一个快速解决这个问题的策略是 NLSAT 求解器,例如

(check-sat-using nlsat)