Question

How do I get the maximum of a formula using smt-lib2?

I want something like this:

(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)

Of course, 'max' is unknown to smtlibv2. So, how can this be done?

Was it helpful?

Solution

In Z3, you can easily define a macro max and use it for getting maximum of two values:

(define-fun max ((x Int) (y Int)) Int
  (ite (< x y) y x))

There is another trick to model max using uninterpreted functions, which will be helpful to use with Z3 API:

(declare-fun max (Int Int) Int)
(assert (forall ((x Int) (y Int))
    (= (max x y) (ite (< x y) y x))))

Note that you have to set (set-option :macro-finder true), so Z3 is able to replace universal quantifiers with body of the function when checking satisfiability.

OTHER TIPS

You've got abs, and per basic math max(a,b) = (a+b+abs(a-b))/2

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top