z3失败了这个方程组

tts*_*ras 2 z3 z3py

多年来,我一直在追踪解决技术的问题 - 我还有一篇关于将它们应用于特定难题的博客文章 - "穿越梯子".

为了达到目的,我偶然发现了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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,z3报告......

$ python  laddersZ3.py
failed to solve
Run Code Online (Sandbox Code Playgroud)

该问题至少具有这种整数解:a = 34,b = 50,c = 42,d = 105,e = 16,f = 40.

我做错了什么,或者这种方程/范围约束系统超出了z3可以解决的范围?

在此先感谢您的帮助.

更新,5年后:Z3现在解决了这个问题.

Tay*_*son 5

如果将整数编码为实数,则可以使用Z3解决此问题,这将迫使Z3使用非线性实数算术求解器.有关非线性整数与实数算术求解器的更多详细信息,请参阅此内容: Z3如何处理非线性整数运算?

以下是使用解决方案编码为实数的示例(z3py link:http://rise4fun.com/Z3Py/1lxH ):

a,b,c,d,e,f = Reals('a b c d e 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) # yields [a = 34, b = 50, c = 42, d = 105, e = 16, f = 40]
Run Code Online (Sandbox Code Playgroud)

虽然结果是整数,如你所说,并且正如Z3发现的那样,Z3显然需要使用真正的算术求解器来处理它.

或者,您可以将变量声明为整数,并从引用帖子的建议中执行以下操作:

t = Then('purify-arith','nlsat')
s = t.solver()
solve_using(s, P)
Run Code Online (Sandbox Code Playgroud)

P约束的结合在哪里(z3py link:http://rise4fun.com/Z3Py/7nqN ).