Z3 Dafny证明中非稳健性的来源是什么?

Z3 Dafny证明中非稳健性的来源是什么?,z3,dafny,boogie,Z3,Dafny,Boogie,我偶尔(不经常,但经常)会看到一个证明在Dafny中工作,然后一些看起来不相关的东西会发生变化(例如,变量名、与证明不相关的函数定义等等),证明会被破坏 我想知道发生这种情况的技术原因。我目前对电子匹配和量词实例化有一个粗略的了解。对于我来说,这些算法对这些看似无关的输入特征是否应该具有鲁棒性,这一点并不明显;也不清楚它们为何会不强健。我也不知道在实践中是否有任何电子匹配实现的考虑因素会导致不健壮性 我所说的“稳健”是指“将始终成功或不成功,与变量名等因素无关” 因此,我有兴趣了解这种非健壮性的

我偶尔(不经常,但经常)会看到一个证明在Dafny中工作,然后一些看起来不相关的东西会发生变化(例如,变量名、与证明不相关的函数定义等等),证明会被破坏

我想知道发生这种情况的技术原因。我目前对电子匹配和量词实例化有一个粗略的了解。对于我来说,这些算法对这些看似无关的输入特征是否应该具有鲁棒性,这一点并不明显;也不清楚它们为何会不强健。我也不知道在实践中是否有任何电子匹配实现的考虑因素会导致不健壮性

我所说的“稳健”是指“将始终成功或不成功,与变量名等因素无关”

因此,我有兴趣了解这种非健壮性的技术原因(无论是实际的还是理论的)

我想在这里获得更多直觉的部分原因是,当我遇到这样的情况时,我可以以这样的方式修补证据,使其更加可靠。(取而代之的是,现在通常发生的是,我会以某种任意方式修补证明,它得到修复,然后它会在以后再次中断。)


我希望找到的答案类似于“Z3使用算法X,它使用复杂的启发式Y来确定何时放弃搜索空间的一部分,很明显Y取决于搜索顺序”。这样的答案可能不会帮助我写出更好的愚蠢的证据,但它会满足我的好奇心。

这些问题都没有简单的答案。下面,我将总结我使用z3的经验。虽然Dafny的人可能会提供其他建议,但我还是冒昧地猜测,它适用于现有的所有此类(半)自动验证工具

众所周知,即使更改变量名也会使z3响应
sat
unknown
,请参见此讨论

当您使用Dafny/Boogie等时,它们会在您的程序上执行大量转换,即使是简单的更改也会导致后端解算器表现出截然不同的行为。(请注意,
sat
永远不应该变成
unsat
,反之亦然:这将是一个合法的bug。但事情可能会变成
未知的
,或者需要非常不同的时间。)下面是另一个讨论类似现象的例子

根本原因总是要追溯到z3用于解决问题的随机种子、选择的启发式方法以及大量可能影响搜索过程的设置。在终端上运行
z3-pd
。到今天为止,有超过500个“参数”可以调整!几乎不可能尝试所有相关选项,更不用说选择“正确”的设置。有人研究在飞行中“修改”参数,以便为回归目的选择性能最佳的集合,但这通常没有帮助,因为问题和解决方案会不断变化

通过改变z3参数smt.random_seed=N,您甚至可以在完全相同的问题上获得不同的性能。对于不同的
N
,性能可能会有所不同

因此,作为一名从业者,你真的没有什么可以做的;不幸的是。特别是如果你在z3上使用像Dafny/Boogie这样的工具,它会增加自己的魔力。一个简单的想法是使用多个核心:使用不同的种子、启发式、策略等在多个核心上启动多个解算器实例,并选择最快的结果。当然,这说起来容易做起来难

总而言之,这些解算器/系统中的大多数都作为黑匣子工作。即使您对它们的内部结构了解很多,也很难始终“稳健”地使用它们。事实上,能够做到这一点可能值得拥有博士学位。水平论文工作,如果你能够想出一个解决方案/证明系统,是免疫于这种差异

作为最终用户,假设您使用的是SMTLib,那么有一组“常见”技巧和陷阱可以帮助您创建性能更好的模型。有关概述,请参阅

但也没有必要绝望。情况正在好转,今天的解决者的表现比去年好很多倍。结果是跟踪进展的好方法

祝你好运