我在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。
谢谢!
答案 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)