Python z3在满足条件时激活表达式

Python z3在满足条件时激活表达式,python,z3,Python,Z3,假设我有约束:[x>2,y>1,xx,y=Ints('xy') >>>x=If(y==1,x%4==0,x) >>>F=[x>2,y==1,x>>求解(F) 无解 这个怎么样 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())

假设我有约束:
[x>2,y>1,x<10]
,我想在
y==1
时添加条件
x%4==0
,并得到所有结果,我将如何在Z3中这样做

我已经为求解的结果添加了阻塞约束,并对其进行迭代以获得所有可能的SAT结果,但我发现它只会忽略值
y==1

下面是我用来测试的代码,它没有产生任何解决方案

>x,y=Ints('xy')
>>>x=If(y==1,x%4==0,x)
>>>F=[x>2,y==1,x<10]
>>>求解(F)
无解
这个怎么样

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())
从z3导入*
x、 y=整数('x y')
s=解算器()
s、 加(x>2,y==1,x<10)
s、 加(如果(y==1,(x%4)==0,则为真))
打印(s.check())
打印(s.model())
对于
y==1
,如果
(x%4)==0,则满足约束。

否则,约束无论如何都会得到满足。

您可以使用逻辑蕴涵:

Implies(y == 1, (x % 4) == 0)
这在语义上等同于@Axel Kemper的答案,但我认为逻辑上更直接,不需要
else
子句。(它还将
then
分支限制为布尔分支,提供了更多的类型安全性。这在Python这样的语言中非常重要,因为所有内容都是动态类型的。)