在dafny

时间:2019-11-10 12:25:38

标签: verification dafny

在创建在dafny中创建的类类型的对象数组时遇到问题。问题是在初始化该类型的新数组时,我在vscode中遇到此错误:

  

除非为数组元素提供了初始化程序,否则新的'Cup'数组必须为空大小

这是代码(实际上是简化的版本,仍然可以说明问题):

datatype Drink = WATER | LEMONADE | COFFEE | TEA

class Cup {
  var volume: int
  var drink_type: Drink
  var dirty: bool

  predicate Valid()
  reads this;
  {
    volume >= 0 
  }

  constructor (v: int, dt: Drink, d: bool)
  requires v >= 0;
  ensures Valid();
  {
    volume := v;
    drink_type := dt;
    dirty := d;
  }
}

method FilterCupDrinkType(a: array<Cup>, dt: Drink) returns (b: array<Cup>, n: int)
{
  var temp := new Cup[a.Length]; 
}

我仔细阅读了手册和在线内容,但找不到真正的答案,所以我希望这里的人知道该怎么做。如果不可能在dafny中做到这一点(dafny的新手),我将对验证此类建议提供任何建议。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以创建默认的Cup,然后按照以下步骤初始化数组

method FilterCupDrinkType(a: array<Cup>, dt: Drink) returns (b: array<Cup>, n: int)
{
  var default := new Cup(0, WATER, false);
  var temp := new Cup[a.Length](_ => default); 
}

或者您可以允许temp是可为空的Cup(即Cup?)组成的数组

method FilterCupDrinkType(a: array<Cup>, dt: Drink) returns (b: array<Cup>, n: int)
{
  var temp := new Cup?[a.Length]; 
}

或者您可以如下复制a

method FilterCupDrinkType(a: array<Cup>, dt: Drink) returns (b: array<Cup>, n: int)
{
  var temp := new Cup[a.Length](i requires 0 <= i < a.Length reads a => a[i]); 
}

如果不想在这里等待答案,找到这些问题的解决方案的一种好方法通常是在https://github.com/dafny-lang/dafny/tree/master/Test上搜索Dafny广泛的测试套件。当然,如果处理该主题,则是一个更好的选择。

相关问题