Почему я не могу вызвать (нестатическую) лемму из призрачного поля в Дафни?
На Дафни, lemma
реализован в виде ghost method
Таким образом, это полезно только для спецификации.
Тем не менее, вы не можете вызвать лемму из ghost field
, как это:
class A {
var i: int;
lemma sum_is_commutative(i: int, j: int)
ensures i + j == j + i
{}
}
class B {
ghost var a: A;
lemma a_sum_is_commutative(i: int, j: int)
ensures i + j == j + i
{ a.sum_is_commutative(i, j); }
method test() {
// a.sum_is_commutative(3, 2); // <- Cannot use directly this
a_sum_is_commutative(3, 2);
}
}
В чем причина такого поведения? Как это можно обойти? Это лучший выбор, чтобы просто повторить лемму во внутреннем классе и использовать (как правило, вызов) другого класса lemma
?
3 ответа
Я не могу комментировать обоснование такого поведения (и я обновлю выбранный ответ, если есть академический ответ, а не просто ошибка или отсутствие реализации).
Чтобы обойти эту проблему, семантически то же самое, чтобы определить
class A {
lemma sum_commutative(i: int, j: int) {}
}
как-то так
class A {
static lemma sum_commutative(a: A, i: int, j: int) {}
}
Так что, даже если вам нужен доступ к this
Например, вы можете передать его как параметр, а не полагаться на него неявно.
Затем вы можете назвать из любого другого класса вашу лемму как A.sum_commutative(a, i, j)
не сталкиваясь с проблемой вызова метода-призрака для переменной-призрака из не-призрачного метода.
Спасибо за обнаружение и сообщение об этом. Это ошибка. Я только что исправил это.
Rustan
Я не знаком с Дафни, но я думаю, что вы должны объявить test
метод как призрак, чтобы иметь возможность использовать параметр призрак в нем.
Обычно в рамках проверки программ, ghost
означает, что определение будет стерто во время выполнения и приведено здесь только для целей проверки. Таким образом, ваш test
метод не должен содержать код, определение которого будет удалено, или он должен быть помечен как стираемый (ghost
).