如果有有限数量的解决方案,您可以使用不等于其分配的模型值的常量(您的 x_i)的析取来枚举所有这些。如果有无限的解决方案(如果你想证明所有自然数 n 的情况就是这种情况),你可以使用相同的技术,但当然不能枚举它们,但可以使用它来生成许多解决方案一些绑定你选择。如果要对所有 n > 1 证明这一点,则需要使用量词。我在下面添加了对此的讨论。
虽然您没有完全提出这个问题,但您也应该看到这个问题/答案:Z3:找到所有令人满意的模型
这是您执行此操作的示例(此处的 z3py 链接:http ://rise4fun.com/Z3Py/643M ):
# Add the equations { x_1^2 == 1, x_2 == 1, ... x_n == 1 } to s and return it.
def add_constraints(s, n, model):
assert n > 1
X = IntVector('x', n)
s.add(X[0]*X[0] == 1)
for i in xrange(1, n):
s.add(X[i] == 1)
notAgain = []
i = 0
for val in model:
notAgain.append(X[i] != model[val])
i = i + 1
if len(notAgain) > 0:
s.add(Or(notAgain))
print Or(notAgain)
return s
for n in range(2,5):
s = Solver()
i = 0
add_constraints(s, n, [])
while s.check() == sat:
print s.model()
i = i + 1
add_constraints(s, n, s.model())
print i # solutions
如果你想证明对于 n 的任何选择都没有其他解决方案,你需要使用量词,因为前面的方法只适用于有限的 n(并且它很快变得非常昂贵)。这是显示此证明的编码。您可以对此进行概括,以结合上一部分中的模型生成功能,以提出更通用的公式的 +/- 1 解决方案。如果方程有多个独立于 n 的解(如您的示例中),这将允许您证明方程具有一些有限数量的解。如果解决方案的数量是 n 的函数,则您必须弄清楚该函数。z3py 链接:http ://rise4fun.com/Z3Py/W9En
x = Function('x', IntSort(), IntSort())
s = Solver()
n = Int('n')
# theorem says that x(1)^2 == 1 and that x(1) != +/- 1, and forall n >= 2, x(n) == 1
# try removing the x(1) != +/- constraints
theorem = ForAll([n], And(Implies(n == 1, And(x(n) * x(n) == 1, x(n) != 1, x(n) != -1) ), Implies(n > 1, x(n) == 1)))
#s.add(Not(theorem))
s.add(theorem)
print s.check()
#print s.model() # unsat, no model available, no other solutions