Z3 WhyML映射到SMT逻辑的精确机制

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;

你好,自动扣除和验证黑客

为了更深入地理解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;
而(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翻译的自动性质(例如,它不保留变量名)
我阅读了几乎所有为WhyML、Frama-C WP插件和Z3提供的资料。我还读了几篇关于验证C代码的论文,但没有发现任何关于C-->SMT翻译技术的内容

我应该学习哪些材料来获得这种理解?请您提供一些见解和/或链接,介绍将命令式代码转换为多排序一阶逻辑的机制

如有任何意见,我将不胜感激。谢谢

祝你好运, Evgeniy.

和论文“”提供了注释C代码如何转换为Why逻辑的高级概述,以及Why逻辑如何转换为定理证明器的输入逻辑

如WP插件手册第1.3节所述,首先考虑Hoare的三重:

{P} stmt{Q}

即:只要先决条件p保持不变,那么在运行stmt之后,后决条件Q保持不变。WP插件将最弱的先决条件视为stmt和后决条件上的函数,以便以下Hoare三重条件成立:

{wp(stmt,Q)}stmt{Q}

从某种意义上说,最薄弱的前提条件是在执行stmt之前必须保持的最简单的属性,因此Q在执行stmt之后保持不变

作为一个例子,考虑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