Z3:查找变量是否是其他数字的倍数
Z3: Find if variable is multiple of some other number
我想创建一个约束以确保将 Real 值量化为某个刻度值。
TICK = 0.5
x = Real('x')
solve(x % TICK == 0)
不幸的是,这不适用于实数(它适用于 Int 和 FP)。
我想到的另一个解决方案是创建一组有效数字并检查该数字是否是该集合的一部分,但是该集合需要非常大。
还有其他解决办法吗?
正如 Christoph 所提到的,计算实数的模数并没有多大意义。但是你的问题仍然有效:你问的是 x
是否是 TICK
的整数倍。您可以按如下方式执行此操作:
from z3 import *
TICK = 0.5
x = Real('x')
k = Int('k')
solve(x == 1, ToReal(k) * TICK == x)
solve(x == 1.2, ToReal(k) * TICK == x)
这会打印:
[k = 2, x = 1]
no solution
请注意,除非 x
是常数,否则这将导致混合整数-实数运算,并且可能会产生非线性约束。这会使求解器难以回答您的查询,即,它可能 return unknown
或响应时间过长。这完全取决于您对 x
.
的其他限制
我想创建一个约束以确保将 Real 值量化为某个刻度值。
TICK = 0.5
x = Real('x')
solve(x % TICK == 0)
不幸的是,这不适用于实数(它适用于 Int 和 FP)。 我想到的另一个解决方案是创建一组有效数字并检查该数字是否是该集合的一部分,但是该集合需要非常大。
还有其他解决办法吗?
正如 Christoph 所提到的,计算实数的模数并没有多大意义。但是你的问题仍然有效:你问的是 x
是否是 TICK
的整数倍。您可以按如下方式执行此操作:
from z3 import *
TICK = 0.5
x = Real('x')
k = Int('k')
solve(x == 1, ToReal(k) * TICK == x)
solve(x == 1.2, ToReal(k) * TICK == x)
这会打印:
[k = 2, x = 1]
no solution
请注意,除非 x
是常数,否则这将导致混合整数-实数运算,并且可能会产生非线性约束。这会使求解器难以回答您的查询,即,它可能 return unknown
或响应时间过长。这完全取决于您对 x
.