Z3 WhyML映射到SMT逻辑的精确机制
你好,自动扣除和验证黑客 为了更深入地理解WhyML是如何为ACSL注释的C程序提供证明的,我试图手动“复制”Why3对WhyML程序所做的工作,同时将其翻译成SMT逻辑并输入Z3验证程序 假设我们有以下C片段:Z3 WhyML映射到SMT逻辑的精确机制,z3,frama-c,why3,Z3,Frama C,Why3,你好,自动扣除和验证黑客 为了更深入地理解WhyML是如何为ACSL注释的C程序提供证明的,我试图手动“复制”Why3对WhyML程序所做的工作,同时将其翻译成SMT逻辑并输入Z3验证程序 假设我们有以下C片段: const int L = 3; int a[L] = {0}; int i = 0; while (i < L) { a[i] = i; i++; } assert (a[1] == 1); const int L=3; int a[L]={0}; int i=0;
const int L = 3;
int a[L] = {0};
int i = 0;
while (i < L) {
a[i] = i;
i++;
}
assert (a[1] == 1);
const int L=3;
int a[L]={0};
int i=0;
而(i
我试图将其编码为SMT逻辑,如下所示:
(set-logic AUFNIRA)
(define-sort _array () (Array Int Int))
(declare-const ar _array)
(declare-fun set_a_i (_array Int Int) _array)
(assert (forall ((ar0 _array) (i Int) (j Int))
(ite (< i j)
(= (set_a_i ar0 i j)
(set_a_i (store ar0 i i) (+ i 1) j))
(= (set_a_i ar0 i i) ar0) )))
(assert (= (select (set_a_i ar 0 3) 1) 1))
(check-sat)
(设置逻辑AUFNIRA)
(定义排序数组()(数组Int))
(声明常量ar_数组)
(声明乐趣集\u a\u i(_arrayint Int)\u array)
(assert(forall((ar0_数组)(i Int)(j Int))
(ite(
Z3表示“未知”
这可能是因为在指定set_a_i函数时使用了量化。但我看不到其他方式来具体说明这一点
我知道以下陈述:
- SMT解算器通常无法(或以不好的方式)处理数组上的量化李>
- 如果我提供前置和后置条件以及循环不变量,WhyML能够证明这样的程序
- 即使后端设置为Z3,WhyML也能证明这些程序,所以SMT解算器本身不是问题
- WhyML可以生成z3 smt文件,但理解它是一项艰巨的工作,部分原因是WhyML->smt翻译的自动性质(例如,它不保留变量名)
作为一个例子,考虑STMT是<代码> x=x+1 < /代码>的情况,{q}是{x> 0 }。根据霍尔演算的赋值规则,我们知道{x+1>0}
x=x+1
{x>0}成立。实际上,{x+1>0}是x=x+1
和{x>0}的最弱先决条件
更一般地说,可以确定任何语句和任何后置条件的最薄弱的先决条件
现在假设你有一个函数f,用前置条件p和后置条件Q注释:
{P} f{Q}
定义W=wp(f,Q)。根据wp的定义,我们知道以下Hoare三重持有:
{W} f{Q}
如果我们能够证明p⇒ W(这是提交给定理证明者的内容),然后建立f的性质P和Q的有效性
WP插件生成Why逻辑。如“Why3:牧养你的证明人”论文第4节所述,Why3的操作被描述为处理证明任务,这是以目标结束的一系列声明。这就是为什么逻辑转换为特定定理证明器的输入逻辑的方式
作为一个具体的例子,本文给出了将Why逻辑转换为Z3的概述。不仅输入语言不同(Z3使用语法),Why和Z3的逻辑也存在显著差异。本文给出了Z3不支持多态性和归纳谓词的例子
为了将Why逻辑转换为定理证明器的输入逻辑,Why3使用一系列转换,逐步将Why逻辑转换为目标输入逻辑。Why3使用被称为驱动程序的配置文件来定义所有转换,一个输出校准仪本机输入格式的漂亮打印机,以及解释校准仪输出的正则表达式
假设您已经运行了why3config
,您可以查看主目录中自动生成的.why3.conf
config文件,以确定why3用于特定校准仪的驱动程序。例如,在我的系统上,当使用z3时,Why3使用~/.opam/system/share/Why3/drivers/z3_432.drv
z3_432.drv
导入smt-libv2.drv
驱动程序作为smt-LIB2兼容校准仪的基本驱动程序
我知道您知道检查生成的SMT2,但我想我会向感兴趣的人介绍如何执行此操作。如果将-wp out DIR
和-wp-proof trace
选项传递给frama-c
,则wp将保存在各个属性上运行校准仪的输出。然后,您可以找到感兴趣的属性对应的.err
文件。在我的例子中,它是main\u assert\u final\u a\u Why3\u z3.err
。在文本编辑器中打开该文件,您将看到如下内容:
Call_provers: command is: /Users/dtrebbien/.opam/system/lib/why3/why3-cpulimit
10 1000 -s z3 -smt2 sat.random_seed=42 nlsat.randomize=false
smt.random_seed=42
/var/folders/1v/2nkqhkgx0qnfwd75h0p3fcsc0000gn/T/why_9f8a52_main_Why3_ide-T-WP.smt2
尽管有点违反直觉,
unsat
意味着属性的有效性已经建立。据我所知,如果可以找到并证明循环不变量,并且
WARNING: pattern does contain any variable.
WARNING: pattern does contain any variable.
WARNING: pattern does contain any variable.
WARNING: pattern does contain any variable.
unsat
why3cpulimit time : 0.020000 s