问题描述
假设我有约束条件:[x > 2,y > 1,x < 10]
,并且我想在x%4 == 0
时添加条件y==1
,并获得所有结果,我该如何在Z3中做到这一点?
我为求解结果添加了阻塞约束,并对其进行迭代以获得所有可能的SAT结果,但是我发现它只会忽略值y == 1
。
>>> x,y = Ints('x y')
>>> x = If(y == 1,x%4==0,x)
>>> F = [x > 2,y == 1,x < 10]
>>> solve(F)
no solution
解决方法
那呢?
from z3 import *
x,y = Ints('x y')
s = Solver()
s.add(x > 2,y == 1,x < 10)
s.add(If(y == 1,(x % 4) == 0,True))
print(s.check())
print(s.model())
对于y == 1
,如果(x % 4) == 0
,则满足约束。
否则,无论如何都会满足约束条件。
您可以使用逻辑含义:
Implies(y == 1,(x % 4) == 0)
从语义上讲,它等效于@Axel Kemper的答案,但我认为从逻辑上讲是更直接的,不需要else
子句。 (这也将then
分支限制为布尔值,从而提供了更多的类型安全性。这对于像Python这样可以动态键入所有内容的语言非常重要。)