z3 满足条件时激活表达式
z3 activate expression when conditions are met
假设我有约束条件:[x > 2, y > 1, x < 10]
,我想在 y==1
时添加条件 x%4 == 0
并获得所有结果,我在 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
分支限制为布尔值,提供更多 type-safety。这在像 Python 这样所有内容都是动态类型的语言中很重要。)
假设我有约束条件:[x > 2, y > 1, x < 10]
,我想在 y==1
时添加条件 x%4 == 0
并获得所有结果,我在 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
分支限制为布尔值,提供更多 type-safety。这在像 Python 这样所有内容都是动态类型的语言中很重要。)