如何在线使用Z3 SMT-LIB解决最大/最小问题

时间:2013-11-15 00:40:25

标签: optimization z3

我正在尝试使用Z3 SMT-LIB在线解决一些最大/最小问题。

一个例子是:

找出两个总和为9的非负数,这样一个数的乘积和另一个数的平方就是最大值。

经过多次尝试后,构建了以下代码

(define-fun f ((x Real) (y Real)) Real
  (if (not (= y 0.0))
  (* y (^ x (- y 1)))
  0.0))
(declare-const x Real) 
(declare-const y Real)
(declare-const z Real)
(declare-const v Real)
(simplify (* x (^ (- 9 x) 2)) :som true)
(assert (= y  (* 81.0 (f x 1))))
(assert (= z (* 18.0 (f x 2))))
(assert (= v (f x 3)))
(assert (= z (+ y  v )))
(assert (not (= x 0)))
(assert (not (= x 9)))
(set-option :pp-decimal true)
(apply (then simplify solve-eqs))
(check-sat)
(get-model)

输出结果为:

(+ (* 81.0 x) (* (- 18.0) x x) (* x x x)) 
(goals 
(goal (= (* 36.0 x) (+ (* 81.0 (^ x 0.0)) (* 3.0 (^ x 2.0)))) 
(not (= x 0.0)) 
(not (= x 9.0)) 
:precision precise :depth 2) ) 

sat 
(model 
  (define-fun x () Real 3.0) 
  (define-fun v () Real 27.0) 
  (define-fun z () Real 108.0) 
  (define-fun y () Real 81.0) )

在线here

运行此示例

如果您有更有效的此问题代码,请告诉我。非常感谢。

0 个答案:

没有答案