【问题标题】:Generic bitvector type of any length任意长度的通用位向量类型
【发布时间】:2012-05-06 23:13:05
【问题描述】:

出于与此处所述相同的原因 (user defined uninterpreted function),我想定义自己的未解释函数

bvredxnor() :对给定位向量的位进行 xnor。

如果我按照此处给出的示例 (example of universal quantifiers with C API) 我不知道要为我的函数的参数提供什么类型(位向量)

我可以创建一个给定长度的位向量,但我希望它用于任何长度的位向量。

查看 C API 中可用的位向量函数,我注意到所有参数的类型都是 Z3_ast,所以我想我可以使用相同的泛型类型。但是API中没有生成Z3_ast排序的函数......(写这个我感觉我在触摸类型和排序之间的区别,但还是有点不清楚)

是使用未解释排序的解决方案吗?如果是这样,那么在这样做时,我不会通过过度扩大类型来降低模型的精度,而这个人工制品仅用于调试目的吗?我的意思是,如果我将此函数应用于位向量,这会起作用吗?

提前谢谢你,

AG。

【问题讨论】:

标签: z3


【解决方案1】:

SMTLib 确实 允许具有可变长度的位向量。也就是说,您不能表达在位向量长度上参数化的问题。这样做的原因是,由于基数问题,关于位向量的属性不一定在长度上保持参数化。也就是说,考虑:

exists x0, x1, x2, x3, x4. distinct [x0, x1, x2, x3, x4]

此属性表示至少有 5 个不同的位向量值。如果 x 的域的长度至少为 3,则这是正确的,否则则不然。因此,声明的有效性取决于域。您也可以将其视为一般 SMTLib 一阶性质的限制。

当然,以上适用于 SMTLib,不一定适用于 Z3。 Leo 和 co 一直处于领先地位,Z3 确实有许多超出 SMTLib 要求的技巧。如果 Z3 确实以您描述的方式支持某些参数位向量问题的概念,那将是一个惊喜。

【讨论】:

  • 嗯,Z3_mk_bvredor() 存在于 API 中,并且与位向量的长度无关。我只是想要 xnor 相同,它不存在……如果我能做到,它应该简化我的约束的外观,这更容易调试。如果我能为这个功能做到这一点,我也可以将相同的原理应用于其他功能
  • 我明白了。您实际上并不想以参数方式证明关于变长位向量的事情,但有一种构造此类表达式的通用方法。看来我误解了你的问题。
  • @Heyji:我知道这是一个迟到的响应,但我认为您要求的是一个将n 映射到_ BitVector n 的高阶函数。 Z3(当前)不支持高阶函数。
猜你喜欢
  • 2023-03-04
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
相关资源
最近更新 更多