Z3和CVC4中有哪些位向量的转换运算符?

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

我正在写一个需要转换的问题的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
((_ 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,那么您只需使用
    bv2nat
    转换它(您可以跳过顶部位,因为您知道它是0,这是一个小优化)

  • 如果顶部位是
    1
    ,则该值是通过跳过顶部位转换的值,然后从中减去128(=2^(8-1))。通常,您将减去2^(m-1),其中
    m
    是位向量的大小

有一个问题:你不能为所有位向量大小创建一个SMTLib函数。这是因为SMTLib不允许用户定义大小多态函数。但是,你可以通过动态声明来生成任意数量的函数,或者在需要时生成相应的表达式


其他操作同样可以使用类似的技巧进行编码。如果遇到问题,请询问具体问题。

谢谢!我希望有比这更直接的解决方案,因为正是出于您所述的原因,必须为每个BV大小实例化一个特殊转换操作。让我们开始编写一些正则表达式骗局。。