与直接使用z3编码公司中存在的问题相比,我正在评估Dafny的使用。
在试用z3 API时,我注意到有一个Array类型,它看起来很像Z3实现全部功能的方式。似乎没有一种简单的方法可以推断Z3中此类阵列的长度。
如果我们看一下Dafny,它可以轻松证明以下正确
method Find(a: array<int>) returns (index: int)
ensures index == a.Length
{
index := a.Length;
}
现在,对我来说,问题是:
Dafny使用的数组如何在Z3中编码?
让我们说Dafny实际上并没有使用Z3数组,在哪里可以找到一些有关Dafny抽象无法识别Z3中变量(例如数组)的东西的文档?相同的问题适用于任何堆分配的对象,它使用分配站点抽象还是其他东西?
答案 0 :(得分:0)
确实没有魔术,也没有任何“隐式”可保证所有数组访问都在范围之内。您可以肯定地编写出界外索引的Dafny程序,只是无法证明对它们有用的事情。 Dafny通过生成必要的“入站”检查使您做到这一点;但是仍然需要您通过添加必要的注释来进行验证。那是您要找的东西吗?此处也对此进行了说明:https://rise4fun.com/Dafny/tutorialcontent/guide#h27