По поводу призраков:

Dec 01, 2019 12:27

Кажется не все въезжают, "о чем это":

ghost var prevElements := a[..];
while // ...
invariant a[lo..hi] == prevElements[lo..hi];
{
// ...
}
ghost var нужны имено для задания инвариантов без порождения лишнего кода. С точки зрения компилятора они ведут так же как обычные и на общих правах участвую в процессе верификации "как если бы были настоящими" - но в код это не попадает.

Аналогом этого кода в С было бы что-то вроде:

std::vector a = ...
...
auto const inv = std::vector (a [lo], a [hi]);
for (int i = 0; i != a.size(); ++ i) {
assert (inv == std::vector (a [lo], a [hi]));
...
}
Только без оверхеда и с контролем условия во время компиляции

verification, Языки программирования, dafny, Компутерщина

Up