gpt4 book ai didi

arrays - seq 和 array 的区别

转载 作者:行者123 更新时间:2023-12-04 09:18:51 24 4
gpt4 key购买 nike

  • 我似乎无法区分 dafny 的 seq<int>array<int> .
  • 他们是否对应于他们的 SMT 实体? (不确定,因为 dafny 中的数组有 .Length )
  • 最佳答案

    序列是一个(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;
    }
    第一种方法使用序列。由于序列是不可变的, y更新为新序列,索引 1 更新为值 7。正如预期的那样, xy的整个操作过程中保持不变.
    第二种方法使用数组。由于数组是堆分配的并且可以别名,当我们分配 y := x 时,我们进入了一个世界 xy是堆中同一个数组的两个不同名称。这意味着如果我们通过 y 修改数组,我们将看到通过读取 x 反射(reflect)的结果.
    回答你的第二个问题,Dafny 级别的序列和数组并不直接对应于 SMT 级别的同名事物。 Dafny 的编码根本不使用 SMT 级别的序列或数组。相反,一切都是通过未解释的函数编码的。我认为这主要是出于历史原因,我不知道是否有人认真研究了 Dafny 背景下的 SMT 序列理论。我可以说当前的编码已经针对求解器性能进行了非常仔细的调整。

    关于arrays - seq<int> 和 array<int> 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63132888/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com