Z3最大化和冲突

时间:2014-08-05 02:22:29

标签: optimization z3 maximization

我有以下Z3问题。当执行此处的代码时,我们如何期望或如何定义冲突的优化目标将执行?

(declare-const x Bool)
(declare-const y Bool)
(declare-const z Bool)
(maximize(
  +   
    (ite (= y false) 1 0) 
    (ite (= z false) 1 0)
  )
)
(maximize(
  +  
    (ite (= x true) 1 0) 
    (ite (= y true) 1 0) 
    (ite (= z true) 1 0)
  )
)
(check-sat)
(get-model)

目前,结果如下:

(+ (ite (= y false) 1 0) (ite (= z false) 1 0)) |-> 2
(+ (ite (= x true) 1 0) (ite (= y true) 1 0) (ite (= z true) 1 0)) |-> 1
sat
(model 
  (define-fun y () Bool
    false)
  (define-fun z () Bool
    false)
  (define-fun x () Bool
    true)
)

1 个答案:

答案 0 :(得分:1)

默认情况下,Z3一次解决一个优化目标。它提交了一个解决方案,并在解决下一个目标时使用提交的解决方案。我将此称为“弱词典”排序,因为承诺的解决方案可能会过度约束问题。 您还可以配置Z3以独立解决目标或使用pareto前端。 命令行是:

(set-option :opt.priority pareto) ; find pareto fronts
(set-option :opt.priority lex)  ; weak lexicographic
(set-option :opt.priority box)  ; independent