Может ли dafny показать встречный пример для неудачного утверждения?

#verification #dafny

#проверка #dafny

Вопрос:

Я пытаюсь доказать правильность / некорректность следующей программы, используя Dafny.

 datatype List<T> = Nil | Cons(T, List)
function tail(l:List):List
{
    match l
    case Nil => Nil
    case Cons(x,xs) => xs
}
method check(l:List) 
{
    assert(expr(l)!=2);
}
function expr(l : List):int
{
    if(l == Nil) then 0 
    else if(tail(l)==Nil) then 1 
    else if(tail(tail(l)) == Nil) then 2 
    else 3
} 
  

Dafny успешно доказывает, что утверждение неверно.
Однако он не дает примера, для которого утверждение не удалось.
Может ли Dafny привести такой пример сам по себе?

Ответ №1:

Теперь есть плагин для кода Visual Studio: https://marketplace.visualstudio.com/items?itemName=FunctionalCorrectness .dafny-vscode

Вы можете нажать F7 , чтобы показать встречные примеры, но это не очень удобно для вашего примера:

Скриншот Dafny

В командной строке вы можете использовать mv опцию: Dafny.exe -mv:model.bvd myfile.dfy . Это сохранит модель в файле с именем model.bvd , но его еще сложнее прочитать, чем на скриншоте выше (плагин, похоже, выполняет некоторую постобработку).

Ответ №2:

Если вы запустите Dafny в расширении Visual Studio, рядом с неудачным утверждением появится красная точка. Если щелкнуть красную точку, должно появиться представление отладки проверки. Это должно показать встречный пример (который представляет собой трассировку выполнения с оценками переменных).

Комментарии:

1. Я вижу аналогичный индикатор в веб-версии Dafny. У меня нет доступа к Visual Studio. Показывает ли версия Dafny для командной строки что-то подобное?

2. Насколько я знаю, в настоящее время он не поддерживается. Возможно, стоит еще раз задать свой вопрос на странице Dafny codeplex .