Z3实数算术和数据类型理论的集成不是很好

Z3实数算术和数据类型理论的集成不是很好,z3,Z3,这与我之前在会议上提出的问题有关 我用无穷大实现了正实的完整代数,而解算器的行为不正常。 当注释的约束给出约束的实际解决方案时,我不知道这个简单的实例 #数据类型声明 MyR=数据类型('MyR') MyR.declare('inf'); MyR.declare('num',('re',RealSort())) MyR=MyR.create() inf=MyR.inf num=MyR.num re=MyR.re #功能声明 #总数 def msum(a、b): 返回If(a==inf,a,If(

这与我之前在会议上提出的问题有关 我用无穷大实现了正实的完整代数,而解算器的行为不正常。 当注释的约束给出约束的实际解决方案时,我不知道这个简单的实例

#数据类型声明
MyR=数据类型('MyR')
MyR.declare('inf');
MyR.declare('num',('re',RealSort()))
MyR=MyR.create()
inf=MyR.inf
num=MyR.num
re=MyR.re
#功能声明
#总数
def msum(a、b):
返回If(a==inf,a,If(b==inf,b,num(re(a)+re(b)))
#大于或等于
def mgeq(a、b):
返回If(a==inf,True,If(b==inf,False,re(a)>=re(b)))
#大于
def管理(a、b):
返回If(a==inf,b!=inf,If(b==inf,False,re(a)>re(b)))
#乘法inf*0=0 inf*inf=inf num*num normal
def mmul(a、b):
返回If(a==inf,If(b==num(0),b,a),If(b==inf,If(a==num(0),a,b),num(re(a)*re(b)))
s0,s1,s2=常数('s0 s1 s2',MyR)
#约束添加到解算器
约束条件=[
s2==mmul(s0,s1),
s0!=inf,
s1!=inf
]
#约束=[s2==mmul(s0,s1),s0==num(1),s1==num(2)]
sol1=解算器()
sol1.add(约束)
设置\u选项(有理\u到\u十进制=真)
如果sol1.check()==sat:
m=sol1.model()
打印m
其他:
打印sol1.check()

我不知道这是令人惊讶还是意料之中。有没有办法让它工作起来?

你的问题是非线性的。Z3中新的(完整的)非线性算术解算器(
nlsat
)未与代数数据类型等其他理论集成。见帖子:

这是当前版本中的一个限制。未来版本将解决此问题

同时,您可以通过使用不同的编码来解决这个问题。如果只使用实数算术和布尔运算,则问题将出现在
nlsat
的范围内。一种可能是将
MyR
编码为Python对:Z3布尔表达式和Z3实表达式

这是一个部分编码。我没有对所有操作符进行编码。该示例也可在线访问

从z3导入*
#将MyR编码为成对(Z3布尔表达式,Z3实表达式)
#我们使用一个类来重载+,*,