Z3中的多元减法

Z3中的多元减法,z3,smt,associativity,Z3,Smt,Associativity,我用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=-4和b=2 这意味着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=-4
b=2

这意味着Z3中的减法是通过从左到右应用二进制运算来定义的?

这实际上是SMT库的一个特性,Z3只是实现了这一点。请看这里:

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

 (- 1 2 3 4)
与以下内容完全相同:

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

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

这实际上是SMT库的一个特性,z3只是简单地实现了这一点。请看这里:

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

 (- 1 2 3 4)
与以下内容完全相同:

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

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

这是有道理的!这让我很困惑,因为在SMTLib中,加法和减法都被定义为左联想,但只有+联想。我想这可能有用。这是有道理的!这让我很困惑,因为在SMTLib中,加法和减法都被定义为左联想,但只有+联想。不过我想这可能有用。