【问题标题】:function to get nibbles using Z3 and bitvector theory使用 Z3 和位向量理论获取半字节的函数
【发布时间】:2015-02-10 13:30:02
【问题描述】:

我正在尝试学习一些关于 z3 和位向量理论的知识。 我的意图是创建一个函数来从位向量的位置获取半字节

此代码返回半字节:

(define-fun g_nibble(
   (l ( _ BitVec 12))
   (idx (Int))
) ( _ BitVec 4)

(ite
    (= idx 1) ((_ extract 11 8) l)
    (ite
        (= idx 2) ((_ extract 7 4) l)
        (ite
            (= idx 3) ((_ extract 3 0) l)     
            (_ bv0 4)
        )
    )
))

问题是我想避免多次 ite 调用。 我试图将 ((_ extract 3 0) l) 替换为 ((_ extract (+ 4 idx) idx l) 之类的东西,但它不起作用。

谢谢

P.S: 这个想法是从命令行使用 z3(不使用任何库)。

【问题讨论】:

    标签: z3 smt sat-solvers


    【解决方案1】:

    extract 函数只接受数字作为参数,而不是任意表达式。但是,我们可以将表达式转移到一个方向,然后提取第一个或最后四个位,例如沿着

    ((_ extract 11 8) (bvshl l (bvmul idx four)))
    

    (其中 idx 和 4 是大小为 12 的位向量表达式)。

    【讨论】:

    • thx,我想idx必须是位向量,因为两种理论(Int和位向量)不能一起使用对吧?
    • 是的,索引必须是位向量。这些理论可以一起使用,但是 bvshl 函数需要一个位向量。
    猜你喜欢
    • 2020-04-29
    • 2014-05-18
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多