Z3中的多元素减法

Multi-element subtraction in Z3

我正在使用 Z3 来解决需要减法的问题,并且我已经 运行 了解 Z3 中的减法允许多个参数这一事实。 这对我来说似乎很奇怪,因为减法不是关联运算。 从下面的脚本可以看出这一点。

(declare-fun a () Int)
(declare-fun b () Int)
(declare-fun c () Int)
(assert (= a (- 1 2 3)))
(assert (= b (- 1 (- 2 3))))
(assert (= c (- (- 1 2) 3)))

满足a=c=-4b=2 所以这意味着 Z3 中的减法是通过从左到右应用二元运算来定义的?

这实际上是 SMT-Lib 的一个特性,z3 只是简单地实现了它。看这里:http://smtlib.cs.uiowa.edu/theories-Ints.shtml

是的,如果您有多个元素,它只会关联到左侧。即:

 (- 1 2 3 4)

与以下内容完全相同:

 (- (- (- 1 2) 3) 4)

这确实令人困惑,因为我们只想对括号无关紧要的关联运算符(如 +*)执行此操作,但 SMTLib 在这个意义上是自由的。这确实 而不是 意味着减法在 SMT-Lib 中是关联的,它只是意味着如果您有多个参数,它会按上述方式进行解析。希望对您有所帮助!