Z3 在位向量算法的决策过程中使用项重写

Z3 在位向量算法的决策过程中使用项重写,z3,bitvector,smt,rewriting,Z3,Bitvector,Smt,Rewriting,我正在从事一个项目,其重点是使用术语重写来解决/简化固定大小的位向量算术问题,这是一些有用的事情,可以作为一些决策过程(例如基于钻头爆破的决策过程)的前一步。术语重写可能根本解决问题,或者产生一个更简单的等价问题,因此两者的结合可以导致相当大的速度提高 我知道许多SMT解决方案实施此策略(例如Boolector、Beaver、Alt Ergo或Z3),但很难找到详细描述这些重写步骤的论文/技术报告/等。一般来说,我只在几段文章中找到作者描述这种简化步骤的文章。我想找到一些详细解释术语重写使用的文

我正在从事一个项目,其重点是使用术语重写来解决/简化固定大小的位向量算术问题,这是一些有用的事情,可以作为一些决策过程(例如基于钻头爆破的决策过程)的前一步。术语重写可能根本解决问题,或者产生一个更简单的等价问题,因此两者的结合可以导致相当大的速度提高

我知道许多SMT解决方案实施此策略(例如Boolector、Beaver、Alt Ergo或Z3),但很难找到详细描述这些重写步骤的论文/技术报告/等。一般来说,我只在几段文章中找到作者描述这种简化步骤的文章。我想找到一些详细解释术语重写使用的文档:提供规则示例,讨论AC重写和/或其他等式公理的便利性,重写策略的使用等

现在,我刚刚找到了描述CVC Lite执行的规范化/简化步骤的技术报告,我想找到更多类似这样的技术报告!我还发现了一张关于的海报,但它只是一个简短的总结

我已经访问了这些SMT解决方案的网站,并在他们的出版物页面中搜索了


我希望您能提供任何参考,或解释著名SMT解决方案的当前版本中如何使用术语重写。我对Z3特别感兴趣,因为它看起来有一个最聪明的简化阶段。例如,Z3.*引入了一个新的位向量决策过程,但不幸的是,我找不到任何描述它的文章。

Z3使用重写来实现预处理过程中执行的许多简化。UFBV策略中使用的许多重写规则(带量词)在下文中有详细描述:


我同意你的看法。很难找到描述现代SMT求解器中使用的预处理步骤的论文。 大多数SMT解算器开发人员都同意,这些预处理步骤对于位向量理论非常重要。 我相信这些技术之所以没有被公布,有几个原因:大多数都是一些小技巧,它们本身并不是重大的科学贡献;大多数技术只在特定系统的上下文中起作用;一种似乎在解算器
a
上非常有效的技术,在解算器
B
上不起作用。 我相信拥有开源SMT解决方案是解决这个问题的唯一途径。即使我们发布了特定解算器
a
中使用的技术,也很难在不查看其源代码的情况下再现解算器a的实际行为

总之,这里是Z3执行的预处理的摘要,以及重要的细节

  • 一些简化规则可能会在局部减小此大小,但会在全局范围内增大此大小。简化程序必须避免这种简化导致的内存膨胀。您可以在以下网址找到示例:

  • 第一个简化步骤仅执行保持等效性的局部简化。 示例:

  • 接下来,Z3执行恒定传播。给定一个等式
    t=v
    ,其中
    v
    是一个值。它用
    v
    替换
    t
    所有地方
  • 接下来,它对位向量执行高斯消去。然而,只有在算术表达式中最多出现两次的变量才会被消除。 此限制用于防止公式中加法器和乘法器的数量增加。 例如,假设我们有
    x=y+z+w
    并且
    x
    出现在
    p(x+z)
    p(x+2*z)
    p(x+3*z)
    p(x+4*z)
    。然后,在消除
    x
    之后,我们将有
    p(y+2*z+w)
    p(y+3*z+w)
    p(y+4*z+w)
    p(y+5*z+w)
    。虽然我们消除了
    x
    ,但我们的加法器比原来的公式多

  • 其次,它消除了无约束变量。Robert Brummayer和Roberto Brutomesso的博士论文中描述了这种方法

  • 然后,进行另一轮简化。这一次,将执行局部上下文简化。 这些简化可能非常昂贵。因此,将使用访问的最大节点数的阈值(默认值为1000万)。 本地上下文简化包含以下规则:

  • 接下来,它尝试使用分配性最小化乘数的数量。例如:
ab+ac->(b+c)*a

  • 然后,它试图通过应用结合性和交换性来最小化加法器和乘法器的数量。 假设公式包含术语
    a+(b+c)
    a+(b+d)
    。然后,Z3将它们重写为:
    (a+b)+c
    (a+b)+d
    。 在转换之前,Z3必须对4个加法器进行编码。之后,只需要对三个加法器进行编码,因为Z3使用完全共享的表达式

  • 如果公式仅包含相等、串联、提取和类似运算符。然后,Z3使用基于并集查找和同余闭包的专用解算器

  • 否则,它会对所有内容进行位爆破,使用AIG最小化布尔公式,并调用其SAT解算器


谢谢您的回答。几个月前我读过这篇文章(Z3网站的出版物部分引用了这篇文章),但是——如果我没记错的话——它非常关注公式量化这一事实带来的困难。
2*x - x ->  x 
x and x -> x
t = 0 and F[t]  -> t = 0 and F[0]
(x != 0 or  y = x+1) ->  (x != 0 or y = 1)