Z3中的多元减法
我用Z3来解决一个需要减法运算的问题,我发现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中的
(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中,加法和减法都被定义为左联想,但只有+联想。不过我想这可能有用。