证明的代码是
x, d = Reals('x d')
t = (simplify(simplify(((x + d)**2 - x**2)/d, som = True), mul_to_power=True))
print t
prove(Implies(d != 0, t == 2*x + d))
prove(Implies(d == 0, 2 * x + d == 2*x))
,输出
(2·d·x + d2)/d
proved
proved
如果您使用Z3Py知道更紧凑的证据,请告诉我。非常感谢。
答案 0 :(得分:5)
您不需要拨打simplify
。你可以写
x, d = Reals('x d')
t = ((x + d)**2 - x**2)/d
print t
prove(Implies(d != 0, t == 2*x + d))
prove(Implies(d == 0, 2 * x + d == 2*x))
它也可以在线试用here。
顺便说一句,我们不应该将这个脚本与x^2
的衍生物2x
的正式证据相混淆。这种证明可以在Coq等证明助理中执行。在那里,你定义了一个衍生物是什么。
您的脚本是一个非正式的证据(参数),由自动化工具(Z3)辅助。 助手(Z3)用于自动计算并证明/解除非正式证明的一些步骤。这没有任何问题,但我们不应该声称这是一个正式的证据,就像使用Coq执行的那样,其中每个步骤都在系统中形式化。
答案 1 :(得分:3)
有趣的方法。我想知道是否可以使用限制的epsilon-delta定义并在Z3中进行更直接的证明。我在这里使用Haskell绑定到Z3编写了它:http://gist.github.com/LeventErkok/5516651
不幸的是,Z3为生成的查询返回“Unknown”,由于需要量词,这并不奇怪。如果z3能够证明这一点,那真是太好了。
我已经在这里发布了Haskell生成的查询的SMT-Lib翻译:http://rise4fun.com/Z3/igAt如果有人想看一眼。 (机械翻译不是人类可读的,但如果你足够眯眼,你可以遵循它的逻辑;特别是如果你将它与Haskell源进行比较。)