使用以下代码:
n = Int('n')
s = Solver()
s.add(n >= 5)
s.add(Not( n**5 <= 5**n))
print s
print s.check()
我们获得以下输出:
[n ≥ 5, ¬(n^5 ≤ 5^n)]
unknown
这就是说Z3Py无法产生直接证明。
现在使用代码
n = Int('n')
prove(Implies(n >= 5, n**5 <= 5**n))
Z3Py也失败了。
可靠的间接证据如下:
n = Int('n')
e, f = Ints('e f')
t = simplify(-(5 + f + 1)**5 + ((5 + f)**5 + e)*5, som=True)
prove(Implies(And(e >=0, f >= 0), t >= 0))
,输出为:
proved
使用Isabelle + Maple的证明在:定理和算法:Isabelle和Maple之间的接口。克莱门斯巴拉林。卡斯滕霍曼雅克·卡尔梅特。
使用Z3Py的其他可能的间接证据如下:
n = Int('n')
e, f = Ints('e f')
t = simplify(-(5 + f + 1)**5 + ((5 + f)**5 + e)*5, som=True)
s = Solver()
s.add(e >= 0, f >= 0)
s.add(Not(t >= 0))
print s
print s.check()
,输出为:
[e ≥ 0,
f ≥ 0,
¬(7849 +
9145·f +
4090·f·f +
890·f·f·f +
95·f·f·f·f +
4·f·f·f·f·f +
5·e ≥
0)]
unsat
如果可以使用Z3Py进行更直接的证明,请告诉我。非常感谢。
答案 0 :(得分:1)
Z3对非线性整数算法的支持非常有限。有关详细信息,请参阅以下相关帖子:
Z3有一个完整的求解器(nlsat)用于非线性实数(多项式)算术。您可以通过编写
来简化脚本n = Real('n')
e, f = Reals('e f')
prove(Implies(And(e >=0, f >= 0), -(5 + f + 1)**5 + ((5 + f)**5 + e)*5 >= 0))
Z3在上面的问题中使用了nlsat,因为它只包含实变量。 即使问题包含整数变量,我们也可以强制Z3使用nlsat。
n = Int('n')
e, f = Ints('e f')
s = Tactic('qfnra-nlsat').solver()
s.add(e >= 0, f >= 0)
s.add(Not(-(5 + f + 1)**5 + ((5 + f)**5 + e)*5 >= 0))
print s
print s.check()