如何使用smt-lib2获得公式的最大值?
我想要这样的事情:
(declare-fun x () Int)
(declare-fun y () Int)
(declare-fun z () Int)
(assert (= x 2))
(assert (= y 4))
(assert (= z (max x y))
(check-sat)
(get-model)
(exit)
当然,smtlibv2不知道'max'。 那么,怎么做呢?
答案 0 :(得分:8)
在Z3中,您可以轻松定义宏max
并使用它来获取最多两个值:
(define-fun max ((x Int) (y Int)) Int
(ite (< x y) y x))
使用未解释的函数对max
进行建模还有另一个技巧,这将有助于与Z3 API一起使用:
(declare-fun max (Int Int) Int)
(assert (forall ((x Int) (y Int))
(= (max x y) (ite (< x y) y x))))
请注意,您必须设置(set-option :macro-finder true)
,因此Z3能够在检查可满足性时用函数体替换通用量词。
答案 1 :(得分:1)
你有abs
,每个基本数学max(a,b) = (a+b+abs(a-b))/2