繁体   English   中英

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

[英]What conversion operators are available in Z3 and CVC4 for Bit-Vectors?

我正在编写一个问题的 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

z3中可以使用:

((_ int2bv BITS) <int_term>) ; Int => BitVec
???                          ; Signed BitVec => Int   
(bv2int <bv_term>)           ; Unsigned BitVec => Int

CVC4中可以使用:

((_ int2bv BITS) <int_term>) ; Int => BitVec
???                          ; Signed BitVec => Int   
???                          ; Unsigned BitVec => Int

问:

  • z3是否有用于 Signed BitVec 的bv2int BitVec (看起来没有。)
  • CVC4有任何bv2int function 吗? (我没有任何线索。)
  • 是否有记录这些转换功能的地方? (关于逻辑/理论的 SMT-LIB 网页似乎没有任何关于它们的信息。)

注意:我受限于基于文本的 SMT-LIB 接口(没有 API 解决方案)。

SMTLib 确实定义bv2natnat2bv

bv2nat,它接受一个位向量 b: [0, m) → {0, 1} with 0 < m,并返回 [0, 2^m) 范围内的 integer,定义如下:

 bv2nat(b):= b(m-1)*2^{m-1} + b(m-2)*2^{m-2} + ⋯ + b(0)*2^0

o nat2bv[m],其中 0 < m,它采用非负 integer n 并返回(唯一)位向量 b: [0, m) → {0, 1} 使得

 b(m-1)*2^{m-1} + ⋯ + b(0)*2^0 = n rem 2^m

见这里: http://smtlib.cs.uiowa.edu/theories-FixedSizeBitVectors.shtml

CVC4 和 z3 都应该支持这两个操作。 (如果没有,您应该向他们报告!)

对于其他一切,你必须自己做数学。 SMTLib 绝对不知道位向量的“符号”; 它不给给定向量赋予符号,而是在算术运算符不同时提供有符号和无符号版本的算术运算符。 (例如,只有一个版本的加法,因为对于该操作,您是否有带符号或无符号位向量并不重要,但对于比较我们得到bvultbvslt等)

从这两个函数中,您可以定义其他变体。 例如,要对 integer 进行长度为 8 的有符号位向量x ,我将使用 go:

(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 function 来为您执行此操作。 这是因为 SMTLib 不允许用户定义大小多态函数。 但是,您可以通过动态声明它们来生成任意数量的此类函数,或者在需要时简单地生成相应的表达式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM