【问题标题】:Z3 String/Char xor?Z3 字符串/字符异或?
【发布时间】:2016-03-14 15:43:01
【问题描述】:

我正在使用 Python 中的 Z3 并试图弄清楚如何进行字符串操作。一般来说,我以z3.String 为对象,做str1 + str2 == 'hello world' 之类的事情。但是,我一直无法完成以下行为:

solver.add(str1[1] ^ str1[2] == 12) # -- or --
solver.add(str1[1] ^ str1[2] == str2[1])

所以基本上添加了字符 1 xor 字符 2 等于 12 的约束。我的理解是字符串被定义为引擎盖下的 8 位 BitVectors 序列,并且 BitVectors 应该能够被异或。

谢谢!

【问题讨论】:

    标签: python python-3.x z3 z3py


    【解决方案1】:

    到目前为止,我还没有公开使用函数访问字符的方法。您必须定义捕获提取的辅助函数和公理。运算符 [] 提取一个子序列,如果索引在边界内,则该子序列的长度为 1。

    这是访问元素的一种方式:

    from z3 import *
    
    nth = Function('nth', StringSort(), IntSort(), BitVecSort(8))
    
    k = Int('k')
    str1, str2, s = Strings('str1 str2 s')
    
    s = Solver()
    s.add(ForAll([str1, k], Implies(And(0 <= k, k < Length(str1)), Unit(nth(str1, k)) == str1[k])))
    
    s.add( ((nth(str1, 1)) ^ (nth(str2, 2))) == 12)
    

    【讨论】:

    • 如果我只使用像a = z3.Array('a',z3.IntSort(),z3.BitVecSort(8)) 这样的数组来模拟字符串,它会简化事情吗?我已经测试过我可以只做a[0] ^ a[1] 并且它似乎可以工作,而且python 本身应该很容易将数组连接在一起形成一个实际的字符串。此外,z3-str github.com/z3str/Z3-str> 的研究人员似乎在这方面做了一些工作。对此有何想法?
    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多