我正在尝试使用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可以自己举这样的例子吗?
答案 0 :(得分:1)
如果在visual studio扩展中运行Dafny,则在失败的断言旁边会出现一个红点。如果单击红点,则应显示验证调试视图。这应该显示一个反例(这是一个具有可变估值的执行跟踪)。
答案 1 :(得分:1)
现在有一个visual studio代码插件:https://marketplace.visualstudio.com/items?itemName=FunctionalCorrectness.dafny-vscode
您可以按mv
显示计数器示例,但对于您的示例来说,它不是非常易读:
在命令行上,您可以使用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
的文件中,但它比上面的屏幕截图更难阅读(插件似乎进行了一些后期处理)。