[英]Modulo operation on Real values (Z3Py)
我想使用 Z3Py 实现模运算。 我在 Z3 github 页面上找到了这个讨论,其中一位创建者有以下解决方案。 但是,我不确定我是否完全理解它。
from z3 import *
mod = z3.Function('mod', z3.RealSort(), z3.RealSort(), z3.RealSort())
quot = z3.Function('quot', z3.RealSort(), z3.RealSort(), z3.IntSort())
s = z3.Solver()
def mk_mod_axioms(X, k):
s.add(Implies(k != 0, 0 <= mod(X, k)),
Implies(k > 0, mod(X, k) < k),
Implies(k < 0, mod(X, k) < -k),
Implies(k != 0, k * quot(X, k) + mod(X, k) == X))
x, y = z3.Reals('x y')
mk_mod_axioms(x, 3)
mk_mod_axioms(y, 5)
print(s)
如果您未设置其他约束,则 model 的计算结果为 0,即第一个解决方案。 如果您设置 x 和 y 应小于 0 的附加约束,则会产生正确的解决方案。 但是,如果您设置 x 和 y 应大于 0 的约束,则会产生不正确的结果。
s.add(x > 0)
s.add(y > 0)
model 的 x 值为 1/2,y 值为 7/2。
这是 model z3 打印件:
sat
[y = 7/2,
x = 1/2,
mod = [(7/2, 5) -> 7/2, else -> 1/2],
quot = [else -> 0]]
所以,它告诉你的是它“挑选”了mod
和quot
是以下功能:
def mod (x, y):
if x == 3.5 and && y == 5:
return 3.5
else:
return 0.5
def quot (x, y):
return 0
现在 go 在您输入的公理之上:您会看到 model 确实很好地满足了它们; 所以这并没有什么问题。
您链接到的答案是关于您可以通过 state 获得“合理”的 model 的属性。 并不是说它是独一无二的 model。 特别是,您希望quot
成为此类值的最大值,但公理中没有任何要求。
长话短说,你得到的答案是正确的; 但它可能没有用。 公理化需要更多的工作,特别是你需要量化,而 SMT 求解器不能很好地处理这些规范。 但这完全取决于您要实现的目标:对于特定问题,您可以使用更简单的 model 来解决问题。 在不了解您的实际应用程序的情况下,我们只能说这种公理化对于您的用例来说太弱了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.