多年来,我一直在跟踪解决技术问题——并且我维护了一篇关于将它们应用于特定难题的博客文章——“交叉梯子”。
言归正传,我无意中发现了 z3,并尝试将其用于具体问题。我使用了 Python 绑定,并写了这个:
$ cat laddersZ3.py
#!/usr/bin/env python
from z3 import *
a = Int('a')
b = Int('b')
c = Int('c')
d = Int('d')
e = Int('e')
f = Int('f')
solve(
a>0, a<200,
b>0, b<200,
c>0, c<200,
d>0, d<200,
e>0, e<200,
f>0, f<200,
(e+f)**2 + d**2 == 119**2,
(e+f)**2 + c**2 == 70**2,
e**2 + 30**2 == a**2,
f**2 + 30**2 == b**2,
a*d == 119*30,
b*c == 70*30,
a*f - 119*e + a*e == 0,
b*e - 70*f + b*f == 0,
d*e == c*f)
不幸的是,z3 报告...
$ python laddersZ3.py
failed to solve
这个问题至少有这个整数解:a=34, b=50, c=42, d=105, e=16, f=40。
我做错了什么,还是这种方程组/范围约束超出了 z3 可以解决的范围?
提前感谢您的帮助。
更新,5 年后:Z3 现在开箱即用地解决了这个问题。