【问题标题】:Z3 Theorem Prover: Pythagorean Theorem (Non-Linear Artithmetic)Z3 定理证明器:勾股定理(非线性算术)
【发布时间】:2013-02-13 04:15:37
【问题描述】:

为什么?

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

我定义了一个三角形的 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)

问题

  • 如果给定两个值,有没有办法让 Microsoft Z3 解决勾股定理?
  • 或者:是否有另一个定理证明器能够处理这些非线性算术情况?

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

【问题讨论】:

  • duplicate 的创建是因为版主将该问题迁移到 StackOverflow,即使我已经在 StackOverflow 上重新创建了它 - 我从不希望这种情况发生。

标签: logic z3 smt constraint-programming theorem-proving


【解决方案1】:

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。它对用户更加友好。我链接的教程在运动学中有示例。他们还使用非线性算术来编码简单的高中物理问题。

【讨论】:

  • 我从不想表达手算机比 Z3 能做的事情更多。我只是想表明它是一个非常简单的用例,并且必须有一种方法来做到这一点。
  • 我明白了。没问题。在我的帖子中,我试图指出您的示例并不像您想象的那么简单。大多数 SMT 求解器无法处理此问题,因为它们甚至无法精确地表示解决方案。没有nlsat的Z3解决不了。手动计算器也不能真正解决问题,它只是计算一个近似的“解决方案”。假设我们也断言(assert (= c 1.4142135623)),这个问题还可以解决吗?不它不是。但是,如果我们使用近似值,我们可能会错误地说它是。 rise4fun.com/Z3/JWYC
  • 当我的脚本准备好后,它应该支持更多的asserts 而不仅仅是勾股定理。我可以不用真正的证据,但我真的需要知道使用了哪些公式。例如:Right triangleab 已给出,c 有需求 - 脚本应输出公式 (= (+ (* a a) (* b b)) (* c c)) 用于计算 c。使用nlsat 可以实现类似的操作吗?
  • 假设我们有N 断言。当 nlsat 返回 sat 时,这意味着它设法找到了一个解决方案,使 all 这些断言为真。解决方案包含c 和问题中所有其他常量的值。因此,原则上,它使用 all 约束来为c 和问题中的任何其他常量找到解决方案。如果我们有(or C1 C2)这样的断言,我们可以询问它是否为真,因为nlsat使C1C2为真。
  • 感谢您对这个问题的帮助。 - 我会在这里接受你的回答,我希望我的formula problem(我迁移到一个新线程)也有一个很好的解决方案。
猜你喜欢
  • 2012-09-12
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2012-12-03
  • 2016-03-24
相关资源
最近更新 更多