Z3:QBVF中的函数扩展和编码

Z3:QBVF中的函数扩展和编码,z3,Z3,我试图用Z3中的函数对公式进行编码,但我遇到了一个编码问题。考虑下面的例子: f(x) = x + 42 g(x1, x2) = f(x1) / f(x2) h(x1, x2) = g(x1, x2) % g(x2, x1) k(x1, x2, x3) = h(x1, x2) - h(x2, x3) sat( k(y1, y2, y3) == 42 && k(y3, y2, y1) == 42 * 2 && ... ) 我希望我的编码既高效(无表达式重复),又允

我试图用Z3中的函数对公式进行编码,但我遇到了一个编码问题。考虑下面的例子:

f(x) = x + 42
g(x1, x2) = f(x1) / f(x2)
h(x1, x2) = g(x1, x2) % g(x2, x1)
k(x1, x2, x3) = h(x1, x2) - h(x2, x3)
sat( k(y1, y2, y3) == 42 && k(y3, y2, y1) == 42 * 2 && ... )
我希望我的编码既高效(无表达式重复),又允许Z3跨子问题重用有关函数的引理。以下是我迄今为止所尝试的:

  • 内联每个自由变量实例化y1、y2等的函数。这引入了重复,性能不如我所希望的好
  • 用通用量词断言函数声明。这适用于非常具体的示例-从求解时间来看,Z3似乎可以(?)重用以前查询中涉及相同函数的结果。但是,求解时间差别很大,在许多情况下(1)的求解速度更快
  • 使用函数定义(即量词+宏查找器选项)。如果我对文档的理解是正确的,这应该扩展功能,因此应该接近(1)。然而,就性能而言,结果有点令人惊讶(“>”表示速度更快):
    • 对于(1)>(2)我得到的问题:(1)>(3)>(2)
    • 对于(2)>(1)我得到的问题:(2)>(1)=(3)
  • 我还试着用上面的大部分内容调整MBQI选项(和其他选项)。然而,目前尚不清楚什么是最佳组合。我使用的是Z34.0

    问题是:编码问题的“正确”方式是什么?请注意,我只有解释函数(我并不真正需要UF)。我可以利用这个事实进行更有效的编码并避免函数扩展吗


    谢谢

    我想这个问题没有明确的答案。一些技术对一种基准测试更有效,而其他技术对其他基准测试更有效。对于到目前为止我们已经看过的QBVF基准测试,我们发现宏为我们提供了小基准大小和小求解时间的最佳组合,但这可能不适用于这种情况

    您对文档的理解是正确的,宏查找器将识别看起来像函数定义的量词,并用其定义替换对该函数的所有其他调用。可能不是所有宏都被拾取,或者您使用的准宏没有被正确检测到,这两种情况都可以解释为什么性能有时比您的(1)更差。如果(1)>第(3)种情况,差异有多大?预计会有一点开销,但运行时的巨大变化可能是由于某些宏格式错误或未被检测到


    总的来说,编码这些问题的方法并不“正确”。功能扩展并非总是可以避免的。这种权衡基本上是在急切地扩张(1,3)和懒惰地扩张(2)之间进行的。可能是SAT(快1、3)和UNSAT(快2)之间存在关联,但也不能保证是这样。

    我认为这个问题没有明确的答案。一些技术对一种基准测试更有效,而其他技术对其他基准测试更有效。对于到目前为止我们已经看过的QBVF基准测试,我们发现宏为我们提供了小基准大小和小求解时间的最佳组合,但这可能不适用于这种情况

    您对文档的理解是正确的,宏查找器将识别看起来像函数定义的量词,并用其定义替换对该函数的所有其他调用。可能不是所有宏都被拾取,或者您使用的准宏没有被正确检测到,这两种情况都可以解释为什么性能有时比您的(1)更差。如果(1)>第(3)种情况,差异有多大?预计会有一点开销,但运行时的巨大变化可能是由于某些宏格式错误或未被检测到


    总的来说,编码这些问题的方法并不“正确”。功能扩展并非总是可以避免的。这种权衡基本上是在急切地扩张(1,3)和懒惰地扩张(2)之间进行的。可能是SAT类型(快1、3)和UNSAT类型(快2)之间存在相关性,但也不能保证是这样。

    谢谢您的回答。我希望有一个解决方案,可以懒散地扩展,避免为不同的变量重新扩展。在任何情况下,我都运行过基准测试,其中(1)的速度几乎是(3)的两倍。我的基准测试中的所有函数都是f(x1,x2,…)=。。。。这应该由宏查找器拾取-即使我没有指定模式-对吗?是的,这些应该在没有模式的情况下拾取。目前我们没有延迟扩展,我们只能打开或关闭宏查找器,对于一些基准测试,一个比另一个更好。不过,在未来的解算器中,延迟扩展将是一个有趣的补充。谢谢你的回答。我希望有一个解决方案,可以懒散地扩展,避免为不同的变量重新扩展。在任何情况下,我都运行过基准测试,其中(1)的速度几乎是(3)的两倍。我的基准测试中的所有函数都是f(x1,x2,…)=。。。。这应该由宏查找器拾取-即使我没有指定模式-对吗?是的,这些应该在没有模式的情况下拾取。目前我们没有延迟扩展,我们只能打开或关闭宏查找器,对于一些基准测试,一个比另一个更好。不过,在未来,延迟扩展将是对解算器的一个有趣的补充。