有理分式的Z3优化

有理分式的Z3优化,z3,Z3,我试图解决一个具有以下特征的约束问题: 4表示实数的变量 几个有理分式不等式,涉及小次数(4)的多项式,带有恼人的OR 我复制上述约束条件(注意或) 我期望“UNSAT”(对于N=4,这实际上是一个定理,但我希望超过4!) 不幸的是,z3无法解决第一个问题。任何关于战术或其他工具的想法或建议都将不胜感激 [S_0 >= S_1, S_1 >= S_2, S_2 >= S_3, S_3 >= 0, Or((S_0/(S_0 + S_1))*(S_0/(S_0 +

我试图解决一个具有以下特征的约束问题:

  • 4表示实数的变量
  • 几个有理分式不等式,涉及小次数(4)的多项式,带有恼人的OR
我复制上述约束条件(注意或)

我期望“UNSAT”(对于N=4,这实际上是一个定理,但我希望超过4!)

不幸的是,z3无法解决第一个问题。任何关于战术或其他工具的想法或建议都将不胜感激

[S_0 >= S_1,
 S_1 >= S_2,
 S_2 >= S_3,
 S_3 >= 0,
 Or((S_0/(S_0 + S_1))*(S_0/(S_0 + S_3))*(S_1/(S_1 + S_2)) +
    (S_0/(S_0 + S_2))*(S_0/(S_0 + S_3))*(S_2/(S_2 + S_1)) <
    (S_0/(S_0 + S_3))*(S_1/(S_1 + S_0))*(S_1/(S_1 + S_2)) +
    (S_1/(S_1 + S_2))*(S_1/(S_1 + S_3))*(S_3/(S_3 + S_0)),
    (S_0/(S_0 + S_3))*(S_1/(S_1 + S_0))*(S_1/(S_1 + S_2)) +
    (S_1/(S_1 + S_2))*(S_1/(S_1 + S_3))*(S_3/(S_3 + S_0)) <
    (S_0/(S_0 + S_3))*(S_2/(S_2 + S_0))*(S_2/(S_2 + S_1)) +
    (S_2/(S_2 + S_1))*(S_2/(S_2 + S_3))*(S_3/(S_3 + S_0)),
    (S_0/(S_0 + S_3))*(S_2/(S_2 + S_0))*(S_2/(S_2 + S_1)) +
    (S_2/(S_2 + S_1))*(S_2/(S_2 + S_3))*(S_3/(S_3 + S_0)) <
    (S_1/(S_1 + S_2))*(S_3/(S_3 + S_0))*(S_3/(S_3 + S_1)) +
    (S_2/(S_2 + S_1))*(S_3/(S_3 + S_0))*(S_3/(S_3 + S_2)))]
[S_0>=S_1,
S_1>=S_2,
S_2>=S_3,
S_3>=0,
或(S_0/(S_0+S_1))*(S_0/(S_0+S_3))*(S_1/(S_1+S_2))+
(S_0/(S_0+S_2))*(S_0/(S_0+S_3))*(S_2/(S_2+S_1))<
(S_0/(S_0+S_3))*(S_1/(S_1+S_0))*(S_1/(S_1+S_2))+
(S_1/(S_1+S_2))*(S_1/(S_1+S_3))*(S_3/(S_3+S_0)),
(S_0/(S_0+S_3))*(S_1/(S_1+S_0))*(S_1/(S_1+S_2))+
(S_1/(S_1+S_2))*(S_1/(S_1+S_3))*(S_3/(S_3+S_0))<
(S_0/(S_0+S_3))*(S_2/(S_2+S_0))*(S_2/(S_2+S_1))+
(S_2/(S_2+S_1))*(S_2/(S_2+S_3))*(S_3/(S_3+S_0)),
(S_0/(S_0+S_3))*(S_2/(S_2+S_0))*(S_2/(S_2+S_1))+
(S_2/(S_2+S_1))*(S_2/(S_2+S_3))*(S_3/(S_3+S_0))<
(S_1/(S_1+S_2))*(S_3/(S_3+S_0))*(S_3/(S_3+S_1))+
(S_2/(S_2+S_1))*(S_3/(S_3+S_0))*(S_3/(S_3+S_2))]

看起来z3被这个问题卡住了,但mathsat和cvc4都做得很好。以下是SMTLib中编码的问题:

$ cat a.smt2
(set-logic QF_NRA)
(set-option :produce-models true)
(declare-fun S_1 () Real)
(declare-fun S_0 () Real)
(declare-fun S_2 () Real)
(declare-fun S_3 () Real)
(assert (>= S_0 S_1))
(assert (>= S_1 S_2))
(assert (>= S_2 S_3))
(assert (>= S_3 0.0))
(assert (let ((a!1 (+ (* (/ S_0 (+ S_0 S_1)) (/ S_0 (+ S_0 S_3)) (/ S_1 (+ S_1 S_2)))
              (* (/ S_0 (+ S_0 S_2)) (/ S_0 (+ S_0 S_3)) (/ S_2 (+ S_2 S_1)))))
      (a!2 (+ (* (/ S_0 (+ S_0 S_3)) (/ S_1 (+ S_1 S_0)) (/ S_1 (+ S_1 S_2)))
              (* (/ S_1 (+ S_1 S_2)) (/ S_1 (+ S_1 S_3)) (/ S_3 (+ S_3 S_0)))))
      (a!3 (+ (* (/ S_0 (+ S_0 S_3)) (/ S_2 (+ S_2 S_0)) (/ S_2 (+ S_2 S_1)))
              (* (/ S_2 (+ S_2 S_1)) (/ S_2 (+ S_2 S_3)) (/ S_3 (+ S_3 S_0)))))
      (a!4 (+ (* (/ S_1 (+ S_1 S_2)) (/ S_3 (+ S_3 S_0)) (/ S_3 (+ S_3 S_1)))
              (* (/ S_2 (+ S_2 S_1)) (/ S_3 (+ S_3 S_0)) (/ S_3 (+ S_3 S_2))))))
  (or (< a!1 a!2) (< a!2 a!3) (< a!3 a!4))))
(check-sat)
(get-model)
CVC4:

这两个结果都是瞬时的。z3似乎永远都在循环

我没有检查模型是否正确,所以最好确保它们是正确的,我也正确地完成了SMTLib翻译。你说你期待着
unsat
,但显然
mathsat
cvc4
都不同意,假设我得到的翻译是正确的


如果您发现cvc4和mathsat确实是正确的,您可能希望将其作为z3问题进行归档,因为这是他们应该能够处理的问题。

看起来z3被这个问题卡住了,但mathsat和cvc4都做得很好。以下是SMTLib中编码的问题:

$ cat a.smt2
(set-logic QF_NRA)
(set-option :produce-models true)
(declare-fun S_1 () Real)
(declare-fun S_0 () Real)
(declare-fun S_2 () Real)
(declare-fun S_3 () Real)
(assert (>= S_0 S_1))
(assert (>= S_1 S_2))
(assert (>= S_2 S_3))
(assert (>= S_3 0.0))
(assert (let ((a!1 (+ (* (/ S_0 (+ S_0 S_1)) (/ S_0 (+ S_0 S_3)) (/ S_1 (+ S_1 S_2)))
              (* (/ S_0 (+ S_0 S_2)) (/ S_0 (+ S_0 S_3)) (/ S_2 (+ S_2 S_1)))))
      (a!2 (+ (* (/ S_0 (+ S_0 S_3)) (/ S_1 (+ S_1 S_0)) (/ S_1 (+ S_1 S_2)))
              (* (/ S_1 (+ S_1 S_2)) (/ S_1 (+ S_1 S_3)) (/ S_3 (+ S_3 S_0)))))
      (a!3 (+ (* (/ S_0 (+ S_0 S_3)) (/ S_2 (+ S_2 S_0)) (/ S_2 (+ S_2 S_1)))
              (* (/ S_2 (+ S_2 S_1)) (/ S_2 (+ S_2 S_3)) (/ S_3 (+ S_3 S_0)))))
      (a!4 (+ (* (/ S_1 (+ S_1 S_2)) (/ S_3 (+ S_3 S_0)) (/ S_3 (+ S_3 S_1)))
              (* (/ S_2 (+ S_2 S_1)) (/ S_3 (+ S_3 S_0)) (/ S_3 (+ S_3 S_2))))))
  (or (< a!1 a!2) (< a!2 a!3) (< a!3 a!4))))
(check-sat)
(get-model)
CVC4:

这两个结果都是瞬时的。z3似乎永远都在循环

我没有检查模型是否正确,所以最好确保它们是正确的,我也正确地完成了SMTLib翻译。你说你期待着
unsat
,但显然
mathsat
cvc4
都不同意,假设我得到的翻译是正确的


如果您发现cvc4和mathsat确实正确,您可能希望将其作为z3问题提交,因为这是他们应该能够处理的问题。

谢谢!令人尴尬的是,问题在于我的约束中有一个输入错误:变量应该是正的(而不是零)。在Mathsat和CVC4发现的两个解中,有零,这实际上导致有理分数变为香蕉(无限),因为分母消失。将约束“S_3>=0”更改为“S_3>0”会使z3更快乐,并且它会回答unsat(大约20秒后)。请注意,SMTLib是一个总函数逻辑。也就是说,除以0的定义是完美的。解算器可以将任何值指定给除以0的结果。起初这听起来可能令人惊讶,但这是正确的做法:从本质上说,这确保了如果你得到一个
unsat
,那么它就是
unsat
,而不管用0除法的解释是什么;这是在自动定理证明程序(如SMTLib)中实现部分函数的常用策略,它试图形式化。谢谢!令人尴尬的是,问题在于我的约束中有一个输入错误:变量应该是正的(而不是零)。在Mathsat和CVC4发现的两个解中,有零,这实际上导致有理分数变为香蕉(无限),因为分母消失。将约束“S_3>=0”更改为“S_3>0”会使z3更快乐,并且它会回答unsat(大约20秒后)。请注意,SMTLib是一个总函数逻辑。也就是说,除以0的定义是完美的。解算器可以将任何值指定给除以0的结果。起初这听起来可能令人惊讶,但这是正确的做法:从本质上说,这确保了如果你得到一个
unsat
,那么它就是
unsat
,而不管用0除法的解释是什么;在自动定理证明程序(如SMTLib)中实现部分函数是一种常见的策略,SMTLib试图将其形式化。
$ cvc4 a.smt2
sat
(model
(define-fun S_1 () Real 0.0)
(define-fun S_0 () Real 1.0)
(define-fun S_2 () Real 0.0)
(define-fun S_3 () Real 0.0)
)