【问题标题】:Z3 bitvector operationsZ3 位向量操作
【发布时间】:2015-07-30 18:25:15
【问题描述】:

如何使用 '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

试图通过猜测来理解“repeat”、“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,但也没有列出这些细节。好郁闷。

【问题讨论】:

    标签: z3 smt bitvector


    【解决方案1】:

    除了dejvuth的回答:

    SMT 语言有据可查(参见 smt-lib.org),对于这个特定问题,FixedSizeBitVectors theoryQF_BV logic 定义是相关的。后者包含重复的定义:

    ((_ 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 表达式的函数。

    【讨论】:

    • 而在短短三个月内,这三个链接中有两个被破坏了。
    • 链接已修复。
    【解决方案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

    【讨论】:

    • 如 dejvuth 所示,repeat 是一个参数函数,即它上面有一个参数,而不是一个参数,并且 SMT2 语法是 (_ ... )。这同样适用于许多其他功能和排序,如 (_ BitVec ...)。
    • @ChristophWintersteiger 谢谢。我不知道这些教程为什么会做这些事情(_BitVec 4),因为我能找到的任何文档中都没有解释这一点。你从哪里学来的?
    • @dejvuth 我不明白。你是如何从 API 链接中找出来的?搜索重复我看到诸如“Z3_OP_REPEAT 重复位向量 n 次”之类的内容。没有给出任何细节,像Z3_mk_repeat (__in Z3_context c, __in unsigned i, __in Z3_ast t1) 这样我永远猜不到的东西意味着脚本中的用法就像“((_重复3)a)”。
    • 不幸的是,我只有 API。 (可能@christoph 可以为您提供更多帮助。)无论如何,API 可以间接用于学习语法,例如Context ctx = new Context(); BoolExpr be = ctx.mkEq(d, ctx.mkBVRotateLeft(2, c)); System.out.println(be);,其中dcBitVecExpr。我知道这并不理想......
    猜你喜欢
    • 2020-04-29
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多