【发布时间】:2014-06-12 15:26:21
【问题描述】:
我想创建一个表达式来选择一组给定表达式中的一个。给定一个表达式数组
Expr[] availableExprs = ...;
在静态已知长度的情况下,我希望 Z3 选择其中任何一个(如 switch 语句)。如果问题是 SAT,我需要一种方法来找出模型中选择了哪些(它在数组中的索引)。
最快的编码方式是什么?
到目前为止,我考虑过这些方法:
- 将 整数 限制为
[0, arrayLength)并使用 ITE 选择其中一个表达式。该模型允许我提取这个整数。不幸的是,这将整数理论引入了模型(以前根本不使用整数)。 - 每个可能的选择都有一个布尔值。使用 ITE 选择表达式。断言其中一个布尔值是真的。这种策略不需要任何特殊的理论(我认为),但编码可能过于冗长。
- 将表达式存储到 数组 表达式中,并使用整数从该数组中读取。这节省了 ITE 链,但引入了数组理论。
显然,所有这些都有效,但它们似乎都有缺点。最好的策略是什么?
【问题讨论】: