如何在Z3(NET API)中找到建模/检查可满足性所需的内存和时间

时间:2011-12-29 06:06:50

标签: z3

我正在与Z3和Yices合作不到一年就解决了一些研究问题。使用这些求解器,我总是需要评估性能,尤其是两件事:建模/检查所需的时间和空间(内存)(可满足性)。在Z3的情况下,我发现没有直接找到它们的线索。我尝试使用“统计”(使用Z3 NET API提供的“DisplayStatistics”功能),并找到如下所示的输出(例如):

  

NUM。冲突:122

     

NUM。决定:2245

     

NUM。传播:27884(二进制:21129)

     

NUM。重启:1

     

NUM。最终检查:1

     

NUM。分钟。 lits:52

     

NUM。添加了方程式:3766

     

NUM。 mk bool var:2782

     

NUM。 del bool var:658

     

NUM。 mk enode:1723

     

NUM。 del enode:78

     

NUM。 mk子句:3622

     

NUM。 del子句:1517

     

NUM。 mk bin子句:3067

     

NUM。 mk lits:18935

     

NUM。 ta冲突:28

     

NUM。添加行:5091

     

NUM。枢轴:328

     

NUM。断言:2597

     

NUM。断言上限:3416

     

NUM。断言:1353

     

NUM。约束道具:787

     

NUM。固定方程:697

     

NUM。偏移量eqs:866

     

NUM。伪nl。:34

     

NUM。 EQ。适配器:820

我不知道如何解释这些值来理解使用的内存/时间。有一些方法可以找到运行时间(使用秒表等计时器类)。但是,在空间要求的情况下,我没有找到任何办法。如果我能得到建模所需的布尔变量(低级,SAT求解器)的数量对我来说非常好。

如果有人能告诉我解决方案,那就太好了。

1 个答案:

答案 0 :(得分:2)

您使用的是哪个版本的Z3?最新版本(Z3 3.2)包括内存消耗统计信息。它将显示为max. heap size。话虽这么说,评估Z3性能的最佳方法是使用z3.exe。 Z3可执行文件将报告时间和内存消耗。此外,API还没有提供一些性能改进。

对于多种应用,文本界面是理想的选择。也就是说,您的应用程序通过管道使用SMT 2.0命令与Z3进程通信。主要优点是:使用不同的SMT求解器非常容易并进行比较;很容易杀死Z3并重新启动它;你可以创建几个不同的过程;如果Z3死了你的应用程序不会死。当然,这种解决方案不适合执行数千个简单查询的应用程序,或者需要与Z3紧密集成(例如Scala^Z3)。