z3任何表达式从int到float的转换,反之亦然

z3任何表达式从int到float的转换,反之亦然,z3,smt,z3py,Z3,Smt,Z3py,比如说python表达式,例如 float(x + 1 * 2) * 2 == 2 如何将其转换为z3表达式?使用明显的ToReal(x+1*2)不起作用。 另一方面,我使用了z3.ToReal,我甚至无法获得sat的简单示例,但ToInt的工作与预期相符。例如 从z3导入* a=Int(“a”) b=真实(“b”) s=解算器() s、 加(ToReal(a)=1.1) s、 检查() >>>未售出 s、 重置() s、 加(ToInt(b)+1.1==2) s、 检查() >>>坐 我不知

比如说python表达式,例如

float(x + 1 * 2) * 2 == 2
如何将其转换为z3表达式?使用明显的
ToReal(x+1*2)
不起作用。 另一方面,我使用了
z3.ToReal
,我甚至无法获得sat的简单示例,但
ToInt
的工作与预期相符。例如

从z3导入*
a=Int(“a”)
b=真实(“b”)
s=解算器()
s、 加(ToReal(a)=1.1)
s、 检查()
>>>未售出
s、 重置()
s、 加(ToInt(b)+1.1==2)
s、 检查()
>>>坐

我不知道你为什么说
它不起作用。它似乎如预期的那样起作用:

>>从z3导入*
>>>x=Int('x')
>>>s=解算器()
>>>s.add(ToReal(x+1*2)*2==2)
>>>打印(s.check())
坐
>>>打印(s.model())
[x=-1]
事实上,对于整数值
x=-1
,您想要的等式确实成立


你必须更清楚地知道你到底期望什么,以及z3做了(或没有做!)什么。

x
得到一个实数时,我似乎会被取消sat。如果我做了
ToReal(x)/2==3/2
它将返回预期的模型
x=3
,但当我做
ToReal(x)==0.5
时,它给了我unsat。在我的大脑恢复了良好的睡眠后,现在我确实认为这是预期的行为,因为
x
被定义为Int。如果我想将变量转换为实数,我可以创建一个新的实数变量。另一个问题是,IIRC-ToInt取的
floor
值。有没有办法取
上限
值?确实有。没有
x
使得
ToReal(x)==0.5
能够保持;因为所有的整数也是实数;i、 有一个完美的注射。您可以证明所有x的
ToReal(x)==x
。天花板/地板功能,虽然存在,但SMT通常不能很好地处理。解算器。请参阅以获取解释。