形式化之模型检测TLA+实践一

形式化方法简介

形式化方法是基于严格数学基础,对计算机硬件和软件系统进行描述、开发和验证的技术.其数学基础建立在形式语言、语义和推理证明三位一体的形式逻辑系统之上。形式化方法概貌[^1]一文阐述了形式化方法学科所有的可能发展方向。
作为刚刚接触形式化方法以及形式化模型检测的小白,学习和使用形式化方法进行模型检测目的就是用数学方法证明系统(金融系统、操作系统OS、芯片等部件)是无Bug。传统的“软件测试”是来找Bug,不能证明系统没有bug。
TLA+(Temporal Logic of Actions) 是Leslie Lamport开发的一门形式化验证语言,用于程序的设计、建模、文档和验证等内容

TLA+工具简介(Toolbox 和 Visual Studio Code使用)

TLA+工具箱提供了用来编写TLA+、语法检查,参数设置,程序运行等功能,该工具TLA+ Toolbox,下载路径为: Toolbox工具下载;也可以通过Visual Studio Code 加载TLA+ 或者 TLA+ Nightly来实现模型编写、语法检查、参数设置和运行模拟等功能,这里我们举一个例子来进行工具的使用性说明。

欧几里得算法举例子(最大公约数)

计算两个数的最大公约数(欧几里得算法),比如计算(24 ,N)的最大公约数,这里N通过配置文件定义,根据Euclidean算法(欧几里得算法):两个数的最大公约数等于两数之差与较小数的最大公约数。更相减损术,具体算法实现如下:
1、计算u和v的差值c(假设u>v),把问题转化成求v和c的最大公约数;
2、将v赋值给u,将c赋值给v;将问题转化为u和v的最大公约数,再进行计算两者之间的差值;
以此类推,把两个较大整数之间的最大公约数简化成两个较小整数之间的最大公约数,到两个数可以相等为止。两个数即为最大公约数数值。
用TLA+表示如下:pluscas语言类似C语言,比较好理解,而且工具能够自动将PlusCas语言转化为TLA+语言表示

TLA+语言表示

----------------- MODULE Euclid ----------------
EXTENDS Naturals, TLC
CONSTANTS N
(*--algorithm Euclid Alg
variables u = 24 ; v \in 1..N ;
begin
print <<u, v>> ;
while u # 0 do
    if u < v then
        u := v || v := u ; \* swap u and v.
    end if ;
    u := u - v;
end while ;
print <<"have gcd", v>> ;
end algorithm*)
VARIABLES u, v, pc
====================================================

打开Toolbox 工具 或者 Visual Studio Code编辑器,讲述TLA+代码复制进去。toolbox工具和VScode工具都能够自动解析并转化为TLA+语言

------------------------------- MODULE Eucld -------------------------------
EXTENDS Naturals, TLC
CONSTANTS N
(*--algorithm EucldAlg
variables u = 24 ; v \in 1..N ;
begin
print <<u, v>> ;
while u # 0 do
    if u < v then
        u := v || v := u ; \* swap u and v.
    end if ;
    u := u - v;
end while ;
print <<"have gcd", v>> ;
end algorithm*)
VARIABLES u, v, pc

vars == << u, v, pc >>

Init == (* Global variables *)
        /\ u = 24
        /\ v \in 1..N
        /\ pc = "Lbl_1"

Lbl_1 == /\ pc = "Lbl_1"
         /\ PrintT(<<u, v>>)
         /\ pc' = "Lbl_2"
         /\ UNCHANGED << u, v >>

Lbl_2 == /\ pc = "Lbl_2"
         /\ IF u # 0
               THEN /\ IF u < v
                          THEN /\ /\ u' = v
                                  /\ v' = u
                          ELSE /\ TRUE
                               /\ UNCHANGED << u, v >>
                    /\ pc' = "Lbl_3"
               ELSE /\ PrintT(<<"have gcd", v>>)
                    /\ pc' = "Done"
                    /\ UNCHANGED << u, v >>

Lbl_3 == /\ pc = "Lbl_3"
         /\ u' = u - v
         /\ pc' = "Lbl_2"
         /\ v' = v

(* Allow infinite stuttering to prevent deadlock on termination. *)
Terminating == pc = "Done" /\ UNCHANGED vars

Next == Lbl_1 \/ Lbl_2 \/ Lbl_3
           \/ Terminating

Spec == Init /\ [][Next]_vars

Termination == <>(pc = "Done")

\* END TRANSLATION 

前面部分是利用PlusCas语言编写的逻辑,后面部分是工具自动转化为TLA+语言模型,具体语法说明可以参考TLA+建模《Practical TLA+》此书,本文先介绍工具使用。

TLA+ Toolbox工具和VsCode使用和调试

TLA+ ToolBox工具使用说明
在这里插入图片描述
Vscode工具使用
在这里插入图片描述
两个工具都能很好进行TLA+语言的语法检查和调试,不同之处在于TLA+ toolbox工具更直观一些,对于配置参数的确定、关键变量的观测、死锁的检查等更直观,而vscode需要通过编写配置文件方式进行。
如下图所示:
在这里插入图片描述
toolbox可以直接修改和要观测模型进行处理,比如在1中可以设置初始状态,以及下个状态;2可以设置配置数据N的大小;3可以观测或者检查转改是否满足要求;4输出console内容

在这里插入图片描述
VsCode 可以通过编写配置文件xx.cfg方式,输出窗口通过界面来显示查看 模型是否有错误、执行状态变化等相关功能。

后续

后续Toolbox和Vscode工具、TLA+以及PlusCas等使用的问题,还会同步使用说明一下。

[1]: Journal of Software 软件学报 Vol.30, No.1, January 2019 33-61

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值