Python 和Z3:整数和浮点数,如何正确管理它们?
Python and Z3: integers and floating, how to manage them in the correct way?
需要 Z3 方面的帮助,Python...看来我太笨了。我的代码:
from z3 import *
num1 = Int('num1')
num2 = Int('num2')
num3 = Int('num3')
s = Solver()
s.add( 2 * num1 - num2 + 0.5 * num3 == 5412.0)
s.add( 2 * num1 + 3 * num2 + 4 * num3 == 28312.0)
结果如下:
[num3 = 1, num1 = 5568, num2 = 5724]
这并不完全正确:第一个表达式实际上 returns 5412.5,而不是 5412.0。
我想这与 "Int" 与某些 "point numbers" (0.5) 的混合使用有关。
我实际上需要将 "numX" 保留为 "Int",因为它们是整数(这是一个约束)。
我想我想念如何处理这种混合情况。有人可以帮助我吗?
谢谢,
已编辑
感谢 "alias" 的回答,我找到了正确的方向:
添加
cc1 = RealVal(0.5)
然后在表达式中使用该常量,我得到了正确的结果。
感谢大家!
Int
声明(数学)整数,仅此而已,因此模型值将始终为整数。表达式 0.5 * num3
会自动转换为整数(可以选择禁用这些自动转换并抛出错误)。如果您需要小数值,请使用 Real
而不是 Int
。
您完全正确,Python 绑定到 Z3 受到弱类型的影响。这经常会在最意想不到的时候再次出现。
在这些情况下,sexpr()
方法是您的朋友。将 print s.sexpr()
添加到程序末尾。它打印以下内容:
(declare-fun num3 () Int)
(declare-fun num2 () Int)
(declare-fun num1 () Int)
(assert (= (+ (- (* 2 num1) num2) (* 0 num3)) 5412))
(assert (= (+ (* 2 num1) (* 3 num2) (* 4 num3)) 28312))
你可以看到你的 0.5
变成了 0
!这完全不是你想要的。欢迎来到 "I'll coerce to make things fit behind your back."
的世界
要解决这个问题,您确实需要非常清楚转换。 Z3 支持浮点数和实数。 (即,具有无限精度。)并且算术在 SMTLib 领域中不会混搭,因此您必须非常小心地构造适当的常量。
需要 Z3 方面的帮助,Python...看来我太笨了。我的代码:
from z3 import *
num1 = Int('num1')
num2 = Int('num2')
num3 = Int('num3')
s = Solver()
s.add( 2 * num1 - num2 + 0.5 * num3 == 5412.0)
s.add( 2 * num1 + 3 * num2 + 4 * num3 == 28312.0)
结果如下:
[num3 = 1, num1 = 5568, num2 = 5724]
这并不完全正确:第一个表达式实际上 returns 5412.5,而不是 5412.0。 我想这与 "Int" 与某些 "point numbers" (0.5) 的混合使用有关。 我实际上需要将 "numX" 保留为 "Int",因为它们是整数(这是一个约束)。 我想我想念如何处理这种混合情况。有人可以帮助我吗?
谢谢,
已编辑
感谢 "alias" 的回答,我找到了正确的方向:
添加
cc1 = RealVal(0.5)
然后在表达式中使用该常量,我得到了正确的结果。
感谢大家!
Int
声明(数学)整数,仅此而已,因此模型值将始终为整数。表达式 0.5 * num3
会自动转换为整数(可以选择禁用这些自动转换并抛出错误)。如果您需要小数值,请使用 Real
而不是 Int
。
您完全正确,Python 绑定到 Z3 受到弱类型的影响。这经常会在最意想不到的时候再次出现。
在这些情况下,sexpr()
方法是您的朋友。将 print s.sexpr()
添加到程序末尾。它打印以下内容:
(declare-fun num3 () Int)
(declare-fun num2 () Int)
(declare-fun num1 () Int)
(assert (= (+ (- (* 2 num1) num2) (* 0 num3)) 5412))
(assert (= (+ (* 2 num1) (* 3 num2) (* 4 num3)) 28312))
你可以看到你的 0.5
变成了 0
!这完全不是你想要的。欢迎来到 "I'll coerce to make things fit behind your back."
要解决这个问题,您确实需要非常清楚转换。 Z3 支持浮点数和实数。 (即,具有无限精度。)并且算术在 SMTLib 领域中不会混搭,因此您必须非常小心地构造适当的常量。