dafny能否为失败的断言显示一个反例?

时间:2016-10-02 06:46:16

标签: verification 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可以自己举这样的例子吗?

2 个答案:

答案 0 :(得分:1)

如果在visual studio扩展中运行Dafny,则在失败的断言旁边会出现一个红点。如果单击红点,则应显示验证调试视图。这应该显示一个反例(这是一个具有可变估值的执行跟踪)。

答案 1 :(得分:1)

现在有一个visual studio代码插件:https://marketplace.visualstudio.com/items?itemName=FunctionalCorrectness.dafny-vscode

您可以按mv显示计数器示例,但对于您的示例来说,它不是非常易读:

Dafny Screenshot

在命令行上,您可以使用Dafny.exe -mv:model.bvd myfile.dfy选项:model.bvd。这会将模型存储在名为library(stocks) library(RSQLite) library(dplyr) library(rpart) filename = "C:/Users/Kun/Documents/Dashin/test.db" # db connect sqlite.driver = dbDriver("SQLite") db = dbConnect(sqlite.driver,dbname = filename) database = dbListTables(db) str(database) database mytable = dbReadTable(db,'A005930') #stock table > head(mytable,10) Date Volume Open High Low Close diff_Close5 1 20170710 211888 2425000 2445000 2416000 2433000 2 20170707 162638 2387000 2406000 2381000 2393000 3 20170706 218461 2400000 2405000 2386000 2403000 4 20170705 212805 2341000 2384000 2339000 2379000 5 20170704 159220 2358000 2370000 2345000 2350000 6 20170703 136111 2375000 2389000 2356000 2361000 7 20170630 237551 2375000 2381000 2355000 2377000 8 20170629 166131 2402000 2416000 2397000 2397000 9 20170628 191450 2380000 2400000 2378000 2385000 10 20170627 192335 2411000 2420000 2395000 2415000 的文件中,但它比上面的屏幕截图更难阅读(插件似乎进行了一些后期处理)。