В Dafny 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
другого класса?