Logic Z3定理证明者:毕达哥拉斯定理(非线性艺术) 为什么? 出现问题的用例上下文

Logic Z3定理证明者:毕达哥拉斯定理(非线性艺术) 为什么? 出现问题的用例上下文,logic,z3,smt,constraint-programming,theorem-proving,Logic,Z3,Smt,Constraint Programming,Theorem Proving,我定义了三角形的3个随机项。Microsoft Z3应输出: 约束是否满足,或者是否存在无效的输入值 所有其他三角形项的模型,其中所有变量都指定给具体值 为了约束我需要断言三角形等式的项,我想从毕达哥拉斯定理开始((h_c²+p²=b²)^(h_c²+q²=a²)) 问题 我知道微软Z3解决非线性算术问题的能力有限。但即使是一些手动计算器也能解决这样一个非常简化的问题: (set-option :print-success true) (set-option :produce-proofs

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

  • 约束是否满足,或者是否存在无效的输入值
  • 所有其他三角形项的模型,其中所有变量都指定给具体值
为了约束我需要断言三角形等式的项,我想从毕达哥拉斯定理开始(
(h_c²+p²=b²)^(h_c²+q²=a²)

问题 我知道微软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
的第一根。 当我们使用
(设置选项:pp decimal true)
时,它将显示

(- 1.4142135623?)
问号用于表示结果被截断。 请注意,结果为负数。然而,这确实是解决您发布的问题的方法。 因为您正在寻找三角形,所以应该断言常量都大于0

顺便说一句,你不需要存在量词。我们可以简单地使用常量
c
。 以下是一个示例(也可用):

下面是另一个没有解决方案的示例(也可用):


顺便说一下,你应该考虑一下。它对用户友好得多。我链接的教程中有运动学方面的示例。他们还使用非线性算法对简单的高中物理问题进行编码

之所以创建这个问题,是因为主持人将这个问题迁移到了StackOverflow,即使我已经在StackOverflow上重新创建了这个问题——我从来没有想过会发生这种情况。我从来没有想过手动计算器能够做比Z3更多的事情。我只是想告诉大家,这是一个非常简单的用例,必须有一种方法来做到这一点。我理解。没问题。在我的帖子中,我试图指出你的例子并不像你想象的那么简单。大多数SMT解算器无法处理此问题,因为他们甚至无法精确表示解决方案。没有nlsat的Z3无法解决它。手动计算器也不能真正解决问题,它只是计算一个近似的“解”。假设我们也断言
(断言(=c1.4142135623))
,这个问题仍然可以满足吗?不,不是。然而,如果我们使用近似,我们可能会错误地说它是。当我的脚本准备好时,它应该支持比勾股定理更多的
assert
s。我可以不用真正的证明,但我真的需要知道使用了哪些公式。例如:
直角三角形
a
b
c
是需要的-脚本应该输出公式
(=(+(*aa)(*b))(*cc))
用于计算
c
。使用
nlsat
是否可以实现类似的功能?假设我们有
N
断言。当nlsat返回
sat
时,意味着它设法找到了一个解决方案,使所有这些断言都成为事实。该解决方案包含问题中的
c
和所有其他常量的值。因此,原则上,它使用了所有的约束来为
c
和问题中的任何其他常数找到解决方案。如果我们有诸如
(或C1 C2)
之类的断言,我们可以询问它是否为真,因为nlsat使
C1
C2
为真。感谢您在这个问题上的帮助。-我在这里接受你的回答,我希望我的(我迁移到了一个新线程)也会有一个很好的解决方案。
(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)
(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)