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这样的语言中非常重要,因为所有内容都是动态类型的。)