我定义了一个三角形的3个随机项。 Microsoft Z3应该输出:
为了约束我需要 assert
三角形平等的项目 - 我想从毕达哥拉斯定理((h_c² + p² = b²) ^ (h_c² + q² = a²)
)开始。
我知道Microsoft Z3在解决非线性算法问题方面的能力有限。但即使是一些手动计算器也能够解决这样的简化版:
(set-option :print-success true)
(set-option :produce-proofs true)
(declare-const a Real)
(declare-const b Real)
(assert (= a 1.0))
(assert (= b 1.0))
(assert
(exists
((c Real))
(=
(+
(* a a)
(* b b)
)
(* c c)
)
)
)
(check-sat)
(get-model)
感谢您的帮助 - 如果有任何不清楚的地方,请发表评论。
答案 0 :(得分:4)
Z3有一个新的求解器(nlsat)用于非线性算术。它比其他解算器(see this article)更有效。新的求解器完全适用于无量词的问题。 但是,新求解器不支持证明生成。如果我们禁用证明生成,那么Z3将使用nlsat并轻松解决问题。基于您的问题,您似乎真的在寻找解决方案,因此禁用证明生成似乎不是问题。
此外,Z3不会产生近似解(如手动计算器)。
它使用精确表示真实的代数数字。
我们也可以要求Z3以十进制表示法显示结果(选项:pp-decimal
)。
Here is your example online
在此示例中,使用精确表示时,Z3将显示c
的以下结果。
(root-obj (+ (^ x 2) (- 2)) 1)
据说c
是多项式x^2 - 2
的第一个根。
当我们使用(set-option :pp-decimal true)
时,它会显示
(- 1.4142135623?)
问号用于表示结果被截断。 请注意,结果是否定的。但是,它确实是您发布的问题的解决方案。 因为,你正在寻找三角形,你应该断言常量都是> 0.
顺便说一下,你不需要存在量词。我们可以简单地使用常量c
。
这是一个示例(也可用online at rise4fun):
(set-option :pp-decimal true)
(declare-const a Real)
(declare-const b Real)
(declare-const c Real)
(assert (= a 1.0))
(assert (= b 1.0))
(assert (> c 0))
(assert (= (+ (* a a) (* b b)) (* c c)))
(check-sat)
(get-model)
这是另一个没有解决方案的示例(也可用online at rise4fun):
(set-option :pp-decimal true)
(declare-const a Real)
(declare-const b Real)
(declare-const c Real)
(assert (> c 0))
(assert (> a c))
(assert (= (+ (* a a) (* b b)) (* c c)))
(check-sat)
顺便说一句,你应该考虑Python interface for Z3。它更加用户友好。我链接的教程在运动学中有示例。他们还使用非线性算法来编码简单的高中物理问题。