在创建在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的新手),我将对验证此类建议提供任何建议。谢谢!
答案 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广泛的测试套件。当然,如果处理该主题,则是一个更好的选择。