我有一个问题需要解决一组非线性多项式约束。在处理非线性实数算术时,z3能否始终给出结果(饱和或不饱和)。 结果还有声音吗?
答案 0 :(得分:1)
是的,它是完整的假设(1)资源的可用性,以及(2)您只使用实际约束以便使用nlsat
策略,因为我检查的最后一个,它没有完全集成其他求解器,请参阅以下问题/答案以获取更多详细信息。这是一个简单的例子,说明了这一点(至少在默认情况下,是关于rose4fun的链接:http://rise4fun.com/Z3/SRZ8):
(declare-fun x () Real)
(declare-fun y () Real)
(declare-fun z () Real)
(assert (>= (* 2 (^ x 2)) (* y z)))
(assert (> x 100))
(assert (< y 0))
(assert (< z 0))
(assert (> (^ y 2) 1234))
(assert (< (^ z 3) -25))
(check-sat) ; sat
(get-model)
(declare-fun b () Int)
(assert (> b x))
(check-sat) ; unknown
对于增量问题,可以将nlsat与增量求解一起使用,但在这个简单的示例中应用标准方法(rise4fun link:http://rise4fun.com/Z3/Ce1F并查看:Soft/Hard constraints in Z3)有一个未知数虽然进行了模型分配,但它可能对您的目的有用。如果没有,您可以尝试push / pop:Incremental solving in Z3 using push command
(set-option :produce-unsat-cores true)
(set-option :produce-models true)
(declare-const p1 Bool)
(declare-const p2 Bool)
(declare-const p3 Bool)
(declare-const p4 Bool)
(declare-const p5 Bool)
(declare-const p6 Bool)
(declare-const p7 Bool)
(declare-fun x () Real)
(declare-fun y () Real)
(declare-fun z () Real)
(assert (=> p1 (>= (* 2 (^ x 2)) (* y z))))
(assert (=> p2 (> x 100)))
(assert (=> p3 (< y 0)))
(assert (=> p4 (< z 0)))
(assert (=> p5 (> (^ y 2) 1234)))
(assert (=> p6 (< (^ z 3) -25)))
(assert (=> p7 (< x 50)))
(check-sat p1 p2 p3 p4 p5 p6 p7) ; unsat
(get-unsat-core) ; (p2 p7)
(check-sat p1 p2 p3 p4 p5 p6) ; unknown, removed one of the unsat core clauses
(get-model)
(declare-fun b () Int)
(assert (> b x))
(check-sat) ; unknown