seq<int> 和 array<int> 之间的差异

Ore*_*lom 4 arrays sequence dafny

  • 我似乎无法区分 dafny seq<int>array<int>.
  • 它们与其 SMT 实体相对应吗?(不确定,因为 dafny 中的数组有.Length

Jam*_*cox 5

序列是一个(n 个不可变的)数学列表。数组是一个堆分配的(可变的,可能有别名的)数据结构。

考虑以下两种愚蠢的方法

method Seq()
{
  var x := [1, 2, 3];
  assert x[1] == 2;
  var y := x;
  assert y[1] == 2;
  y := y[1 := 7];
  assert y[1] == 7;
  assert x[1] == 2;
}

method Array()
{
  var x := new int[3](i => i + 1);
  assert x[1] == 2;
  var y := x;
  assert y[1] == 2;
  y[1] := 7;
  assert y[1] == 7;
  assert x[1] == 7;
}
Run Code Online (Sandbox Code Playgroud)

第一种方法使用序列。由于序列是不可变的,y因此更新为序列,索引 1 更新为值 7。正如预期的那样,x在 的整个操作过程中保持不变y

第二种方法使用数组。由于数组是在堆上分配的并且可以别名,因此当我们分配时y := x,我们进入了一个世界,其中xy是堆中同一数组的两个不同名称。这意味着如果我们通过 via 修改数组y,我们将看到 read through 中反映的结果x

要回答你的第二个问题,Dafny 级别的序列和数组并不直接对应于 SMT 级别的同名事物。Dafny 的编码根本不使用 SMT 级别的序列或数组。相反,一切都是通过未解释的函数进行编码的。我认为这主要是出于历史原因,我不知道是否有人认真研究过 Dafny 背景下的 SMT 序列理论。我可以说,当前的编码已经针对求解器性能进行了非常仔细的调整。