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

如何找到在Z3(NET API)中建模/检查可满足性所需的内存和时间,z3,Z3,我与Z3和Yices合作不到一年的时间来解决一些研究问题。使用这些解算器时,我总是需要评估性能,特别是两件事:建模/检查所需的时间和空间(内存)(可满足性)。在Z3的案例中,我没有发现直接找到它们的线索。我尝试了“统计”(使用Z3 NET API提供的函数“DisplayStatistics”),发现输出如下所示(例如): 冲突数目:122 决定数目:2245 传播次数:27884(二进制:21129) 重启次数:1 最终检查数量:1 最小立数:52 添加的等式数量:3766 mk布尔变量数:2

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

冲突数目:122

决定数目:2245

传播次数:27884(二进制:21129)

重启次数:1

最终检查数量:1

最小立数:52

添加的等式数量:3766

mk布尔变量数:2782

德尔布尔变量数:658

mk enode数量:1723

伊诺德人数:78

第3622条

条款编号:1517

条款编号:3067

mk lits数量:18935

ta冲突数:28

添加行数:5091

支点数目:328

数目:2597

数目:3416

数量:1353

绑定道具数:787

固定式数量:697

偏移量等式:866

伪nl数:34

数量相等适配器:820

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


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

您使用的是哪个版本的Z3?最新版本(Z3.2)包括内存消耗统计数据。它将显示为
最大堆大小
。也就是说,评估Z3性能的最佳方法是使用
Z3.exe
。Z3可执行文件将报告时间和内存消耗。此外,一些性能改进尚未通过API提供


对于一些应用程序,文本界面是理想的选择。也就是说,应用程序通过管道使用SMT2.0命令与Z3进程通信。其主要优点是:很容易使用不同的SMT解算器并进行比较;很容易杀死Z3并重新启动;您可以创建多个不同的流程;如果Z3失效,则应用程序不会失效。当然,对于执行数千个简单查询或需要与Z3紧密集成的应用程序(例如,
Scala^Z3
),此解决方案并不适用

多谢各位。我有一个不同的问题。我想知道Z3(特别是Z3NetAPI)中的MAXSAT功能。我发现我需要实现这样的功能(如C API示例所示)。对于Yices,有内置函数(例如Yices_max_sat),它根据加权断言(使用Yices_assert_加权)工作。Z3能提供这样一种使用NetAPI使用MAXSAT的简单方法吗?我使用
假设实现了
yices\u max\u sat
命令。命令
yices\u assert\u weighted
只创建一个
隐藏的
布尔变量(即假设变量),并将权重与之关联。因此,这两个命令可以在Z3API上使用
假设进行模拟。有许多方法可以在Z3API之上实现MAXSAT。
maxsat.c
示例描述了其中两个。我们没有计划在官方API中支持MAXSAT。也就是说,在未来的版本中,我们可能会包括.NET版本的
maxsat.c
。谢谢。.NET版本的maxsat.c对我很有帮助。我希望我们能很快得到它。但是,如何设置权重对我来说并不清楚,因为maxsat.c example.Z3(SMT-LIB)不支持maxsat-like yices(即SMT-LIB中的“max-sat”命令)。MAXSAT的代码是针对C API给出的。Z3能否在SMTLIB(和API)中提供类似于yices(两者)的功能?是的,我们不支持maxsat命令,近期也没有计划支持它。正如我在前面的评论中所说,您可以使用
假设来模拟它。这就是我在Yices中实现它的方式。