【发布时间】:2021-12-05 17:16:42
【问题描述】:
根据this answer,Z3 集合排序是使用数组实现的,考虑到 API 中可用的 SetAdd 和 SetDel 方法,这很有意义。 here 还声称,如果从不使用数组修改函数,那么使用数组而不是未解释的函数是浪费的开销。鉴于此,如果我对集合的唯一用途是使用 IsMember 应用约束(在单个值上或作为量化的一部分),那么使用从底层元素排序到布尔值的未解释函数映射是一个更好的主意吗?所以:
from z3 import *
s = Solver()
string_set = SetSort(StringSort())
x = String('x')
s.add(IsMember(x, string_set))
变成
from z3 import *
s = Solver()
string_set = Function('string_set', StringSort(), BoolSort())
x = String('x')
s.add(string_set(x))
这种方法有什么缺点吗?开销更少的替代表示?
【问题讨论】: