Z3位向量操作

时间:2015-05-19 04:44:42

标签: z3 smt bitvector

如何使用'repeat'和'rotate_left'位向量操作?

更一般地说,在哪里可以找到Z3使用的SMT2脚本格式的位向量操作的详细文档?

我找到的所有内容似乎只是去教程或链接断开:
https://github.com/Z3Prover/z3/wiki/Documentation
http://research.microsoft.com/en-us/um/redmond/projects/z3/old/documentation.html

通过猜测试图理解“重复”,“rotate_left”和“rotate_right”一直令人沮丧。我无法弄清楚如何使用它们。例如

(display (repeat #b01))
(display (repeat #b01 3))
(display (repeat 3))
(display (rotate_left #b0001 2))

给出

"repeat expects one non-zero integer parameter"
"repeat expects one argument"
"operator is applied to arguments of the wrong sort"
"rotate left expects one argument"

文件在哪里?希望他们没有解释,因为所有这些都是标准的,我也看了smt-lib.org但是也没有列出这些细节。太令人沮丧了。

2 个答案:

答案 0 :(得分:3)

除了dejvuth的回答:

SMT语言有详细记录(请参阅smt-lib.org),对于此特定问题,FixedSizeBitVectors theoryQF_BV logic定义是相关的。后者包含repeat的定义:

((_ repeat i) (_ BitVec m) (_ BitVec i*m))
- ((_ repeat i) x) means concatenate i copies of x

除此之外,David Cok写了一篇优秀的SMT2 tutorial

Z3 API中的函数名称与语法允许的SMT2中的相同,在本例中以Z3_mk_为前缀,表示它们是构造Z3表达式的函数。

答案 1 :(得分:2)

对于你的例子,你应该写这样的东西

(declare-const a (_ BitVec 2))
(declare-const b (_ BitVec 6))
(assert (= a #b01))
(assert (= b ((_ repeat 3) a)))

(declare-const c (_ BitVec 4))
(declare-const d (_ BitVec 4))
(assert (= c #b0001))
(assert (= d ((_ rotate_left 2) c)))

(check-sat)
(get-model)

你会得到

sat
(model 
  (define-fun d () (_ BitVec 4)
    #x4)
  (define-fun c () (_ BitVec 4)
    #x1)
  (define-fun b () (_ BitVec 6)
    #b010101)
  (define-fun a () (_ BitVec 2)
    #b01)
)

我通常使用的一个好文档是API