1
我有3个变量a
,b
和c
。我需要计算c = absolute(b-a)
。计算Z3中的绝对值
我在编码Z3这个语句
(assert (>= c 0))
(assert (or (= c (- a b) (= c (- b a))))
我在想,有没有在Z3写它的一个更有效的方法?
Z3是否具有计算绝对值的内部支持?
另外,我希望这样写代码不会有任何性能损失,而不是使用其他方式。
我有3个变量a
,b
和c
。我需要计算c = absolute(b-a)
。计算Z3中的绝对值
我在编码Z3这个语句
(assert (>= c 0))
(assert (or (= c (- a b) (= c (- b a))))
我在想,有没有在Z3写它的一个更有效的方法?
Z3是否具有计算绝对值的内部支持?
另外,我希望这样写代码不会有任何性能损失,而不是使用其他方式。
您的编码是正确的。然而,用户通常编码使用
(define-fun absolute ((x Int)) Int
(ite (>= x 0) x (- x)))
然后绝对值函数,它们可以编写约束,诸如:
(assert (= c (absolute (- a b))))
下面是完整的例子(也可用online at rise4fun):
(define-fun absolute ((x Int)) Int
(ite (>= x 0) x (- x)))
(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(assert (= a 3))
(assert (= b 4))
(assert (= c (absolute (- a b))))
(check-sat)
(get-model)
太好了!非常感谢这样提及。 – Raj 2013-02-27 14:47:14
你可以评论任何关于表演的内容吗? – Raj 2013-02-27 15:08:39
很难说什么是最好的编码。这通常取决于使用绝对值的问题。您的原始编码有一个优点。它明确地断言'c> = 0'。这在'ite'编码中不是“显式”。 Z3必须“学习”,如果这与表明问题不明显有关。 – 2013-02-27 15:22:45