繁体   English   中英

Z3定理证明:毕达哥拉斯定理(非线性算术)

[英]Z3 Theorem Prover: Pythagorean Theorem (Non-Linear Artithmetic)

因此?

我的问题发生的用例上下文

我定义了一个三角形的3个随机项。 Microsoft Z3应该输出:

  • 约束是否满足或是否存在无效的输入值?
  • 所有其他三角形项目的模型,其中所有变量都分配给具体值。

为了约束我需要assert三角形等式的项目 - 我想从Pythagorean定理开始( (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)

问题

  • 如果给出两个值,有没有办法让Microsoft Z3解决毕达哥拉斯定理?
  • 或者:是否有另一个能够处理这些非线性算术的定理证明器?

感谢您的帮助 - 如果有任何不清楚的地方,请发表评论。

Z3有一个新的求解器(nlsat)用于非线性算术。 它比其他解算器更有效( 参见本文 )。 新的求解器完全适用于无量词的问题。 但是,新求解器不支持证明生成。 如果我们禁用证明生成,那么Z3将使用nlsat并轻松解决问题。 基于您的问题,您似乎真的在寻找解决方案,因此禁用证明生成似乎不是问题。

此外,Z3不会产生近似解(如手动计算器)。 它使用精确表示真实的代数数字。 我们也可以要求Z3以十进制表示法显示结果(选项:pp-decimal )。 这是您的在线示例

在此示例中,当使用精确表示时,Z3将显示c的以下结果。

(root-obj (+ (^ x 2) (- 2)) 1)

这是说c是多项式x^2 - 2的第一个根。 当我们使用(set-option :pp-decimal true) ,它会显示

(- 1.4142135623?)

问号用于表示结果被截断。 请注意,结果是否定的。 但是,它确实是您发布的问题的解决方案。 因为,您正在寻找三角形,您应该断言常量都> 0。

顺便说一下,你不需要存在量词。 我们可以简单地使用常数c 这是一个例子(也可以在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)

这是另一个没有解决方案的例子(也可以在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)

顺便说一下,你应该考虑Z3Python接口 它更加用户友好。 我链接的教程在运动学中有示例。 他们还使用非线性算法来编码简单的高中物理问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM