Ответ Валери - хороший трюк для случаев, когда существование доказано леммой.Вы также можете расширить трюк до «подсказки внутри forall
», используя оператор forall
Дафни , например,
forall a: nat, b: nat
ensures exists c: nat :: difference_property(a, b, c)
{
var c := difference(a, b);
assert difference_property(a, b, c);
}
, который подтверждает выражение forall
forall a: nat, b: nat ::
exists c: nat ::
difference_property(a, b, c)
В связи с другим вопросом Джейсона об использовании правильных методов в доказательствах Дафни не поддерживает это.Действительно, я думаю, что имеет смысл, что это не поддерживается, так как, например, методы могут оказывать влияние на кучу.Таким образом, построение какого-либо свидетеля может в принципе зависеть от распределения состояния или даже изменения существующего состояния.Внедрение этого эффекта в логику подозрительно и изменит характер Дафни.