Z3 dafny如何编码涉及数组的条件验证?

Z3 dafny如何编码涉及数组的条件验证?,z3,dafny,Z3,Dafny,我正在评估Dafny的使用情况,与直接使用z3编码我们公司的一个问题进行比较 在试用Z3API时,我注意到有一种数组类型,它似乎与z3实现全部函数的方式非常相似。在Z3中,似乎没有一种简单的方法来解释这种数组的长度 如果我们看看Dafny,它可以很容易地证明以下是正确的 method Find(a: array<int>) returns (index: int) ensures index == a.Length { index := a.Length; } 方法Fi

我正在评估Dafny的使用情况,与直接使用z3编码我们公司的一个问题进行比较

在试用Z3API时,我注意到有一种数组类型,它似乎与z3实现全部函数的方式非常相似。在Z3中,似乎没有一种简单的方法来解释这种数组的长度

如果我们看看Dafny,它可以很容易地证明以下是正确的

method Find(a: array<int>) returns (index: int)
   ensures index == a.Length
{
   index := a.Length;
}
方法Find(a:array)返回(索引:int)
确保索引==a.长度
{
指数:=a.长度;
}
现在,对我来说,问题是:

Dafny使用的数组是如何在Z3中编码的


假设Dafny实际上没有使用Z3数组,我在哪里可以找到一些关于Dafny抽象事物的方法的文档,这些东西在Z3中没有标识数量有限的变量(比如数组)?同样的问题也适用于任何堆分配的对象,它是否使用分配站点抽象或其他东西?

实际上没有魔法,也没有任何“隐式”保证所有数组访问都在范围内。你当然可以编写索引超出范围的Dafny程序,但你无法证明它们有用。Dafny通过生成必要的“边界内”检查来实现这一点;但是,通过添加必要的注释来验证仍然取决于您。这就是你要找的吗?这里也解释了这一点:

实际上没有魔法,也没有任何“隐式”保证所有数组访问都在范围内。你当然可以编写索引超出范围的Dafny程序,但你无法证明它们有用。Dafny通过生成必要的“边界内”检查来实现这一点;但是,通过添加必要的注释来验证仍然取决于您。这就是你要找的吗?这里也解释了这一点: