Почему я не могу вызвать (нестатическую) лемму из призрачного поля в Дафни?

На Дафни, 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).

Другие вопросы по тегам