Z3 String / Char xor?

时间:2016-03-14 15:43:02

标签: python python-3.x z3 z3py

我在Python中使用Z3并试图弄清楚如何进行字符串操作。一般来说,我使用class PartForm(forms.ModelForm): class Meta: model = Part fields = ['supplier', 'number', 'name'] def __init__(self, *args, **kwargs): super(PartForm, self).__init__(*args, **kwargs) self.fields['supplier'].widget = SelectWithButton( None, Supplier.objects.all(), "/contacts/create/?next=/parts/create", "Add Supplier", ) 作为对象,执行z3.String之类的操作。但是,我无法完成以下行为:

str1 + str2 == 'hello world'

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

谢谢!

1 个答案:

答案 0 :(得分:1)

到目前为止,我没有公开使用函数访问字符的方法。您必须定义捕获提取的辅助函数和公理。 operator []提取一个子序列,如果索引在边界内,则该子序列的长度为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)