Z3和CVC4中有哪些位向量的转换运算符?
我正在写一个需要转换的问题的BV编码 一些Z3和CVC4中有哪些位向量的转换运算符?,z3,smt,cvc4,optimathsat,mathsat,Z3,Smt,Cvc4,Optimathsat,Mathsat,我正在写一个需要转换的问题的BV编码 一些Int到BitVec,反之亦然 在mathsat/optimathsat中,可以使用: ((_ to_bv BITS) <int_term>) ; Int => BitVec (sbv_to_int <bv_term>) ; Signed BitVec => Int (ubv_to_int <bv_term>) ; Unsigned BitVec => Int ((_ int2b
Int
到BitVec
,反之亦然
在mathsat
/optimathsat
中,可以使用:
((_ to_bv BITS) <int_term>) ; Int => BitVec
(sbv_to_int <bv_term>) ; Signed BitVec => Int
(ubv_to_int <bv_term>) ; Unsigned BitVec => Int
((_ int2bv BITS) <int_term>) ; Int => BitVec
??? ; Signed BitVec => Int
(bv2int <bv_term>) ; Unsigned BitVec => Int
((_ int2bv BITS) <int_term>) ; Int => BitVec
??? ; Signed BitVec => Int
??? ; Unsigned BitVec => Int
在CVC4
中,可以使用:
((_ to_bv BITS) <int_term>) ; Int => BitVec
(sbv_to_int <bv_term>) ; Signed BitVec => Int
(ubv_to_int <bv_term>) ; Unsigned BitVec => Int
((_ int2bv BITS) <int_term>) ; Int => BitVec
??? ; Signed BitVec => Int
(bv2int <bv_term>) ; Unsigned BitVec => Int
((_ int2bv BITS) <int_term>) ; Int => BitVec
??? ; Signed BitVec => Int
??? ; Unsigned BitVec => Int
((2bv位));Int=>BitVec
??? ; 有符号位向量=>Int
??? ; 无符号位向量=>Int
Q:
是否具有签名的z3
的BitVec
功能?(似乎没有。)bv2int
是否有任何CVC4
功能?(我不知道。)bv2int
- 是否有一些地方记录了这些转换函数?(关于逻辑/理论的SMT-LIB网页似乎没有任何关于它们的信息。)
注意:我受到基于文本的SMT-LIB接口(无API解决方案)的限制。SMTLib确实定义了
bv2nat
和nat2bv
:
bv2nat,取位向量b:[0,m)→ {0, 1}
0 bv2nat(b) := b(m-1)*2^{m-1} + b(m-2)*2^{m-2} + ⋯ + b(0)*2^0
o nat2bv[m],0 b(m-1)*2^{m-1} + ⋯ + b(0)*2^0 = n rem 2^m
请看这里:
CVC4和z3都应该支持这两个操作。(如果不支持,您应该向他们报告!)
对于其他所有内容,您必须自己进行计算。SMTLib对于位向量的“符号”绝对是不可知的;它不将符号赋予给定向量,而是在算术运算符不同时提供有符号和无符号版本。(例如,加法只有一个版本,因为该操作是否有符号或无符号位向量并不重要,但为了进行比较,我们得到了bvult
,bvslt
等。)
从这两个函数中,您可以定义其他变量。例如,要执行长度为8到整数的有符号位向量x
,我将:
(ite (= ((_ extract 7 7) x) #b0)
(bv2nat ((_ extract 6 0) x))
(- (bv2nat ((_ extract 6 0) x)) 128)))
也就是说,检查x
的顶部位:
- 如果它是0,那么您只需使用
转换它(您可以跳过顶部位,因为您知道它是0,这是一个小优化)bv2nat
- 如果顶部位是
,则该值是通过跳过顶部位转换的值,然后从中减去128(=2^(8-1))。通常,您将减去2^(m-1),其中1
是位向量的大小m
其他操作同样可以使用类似的技巧进行编码。如果遇到问题,请询问具体问题。谢谢!我希望有比这更直接的解决方案,因为正是出于您所述的原因,必须为每个BV大小实例化一个特殊转换操作。让我们开始编写一些正则表达式骗局。。