繁体   English   中英

实数值的模运算 (Z3Py)

[英]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]]

所以,它告诉你的是它“挑选”了modquot是以下功能:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM