Event-B建模(三)——控制桥上汽车,初始模型


安装完了Rodin,现在让我们开始动手验证吧~

以一个控制软件为例,开启我们整个Event-B分析建模验证的过程

需求文档

在这里插入图片描述
现在有这么一座岛屿Island,有一座桥(Bridge)连通着大陆(Mainland)与这座小岛,而我们的系统主要功能是实现对桥上汽车的控制。

在这里我们的需求文档有两类需求,一些需求与控制器的功能有关,我们标记为FUN(Function的缩写),另一些与环境有关,标记为ENV(Environment的缩写)。(和软件功能直接相关的需求标记FUN,而ENV标记是外部环境的需求,不由系统所控制)

系统的主要功能控制一座桥上的汽车,该桥连接着大陆和一座小岛
在这里插入图片描述
系统设备包括两个交通灯,交通灯的颜色为红色和绿色
在这里插入图片描述
交通灯控制着桥两端的入口,一个交通灯安装在大陆一端,另一个安装在小岛一端
在这里插入图片描述
假定汽车司机都服从交通灯的指挥,红灯行,绿灯停
在这里插入图片描述
系统装备了四个两状态传感器,状态有开和关闭
在这里插入图片描述
传感器用于检测汽车进入或者离开这座桥,两个传感器安装在桥上,另外两个分别安装在大陆和小岛上
在这里插入图片描述
桥上和小岛上的汽车数量有限制
在这里插入图片描述
桥是单行道,不能同时双向行驶
在这里插入图片描述

分析

我们先从一个非常简单的模型开始,其中只考虑了需求FUN-2,然后通过精化的方式,逐渐考虑更多的需求。

在第一个模型中,我们不准备考虑各种各样的设备(交通灯和传感器),也不准备考虑桥,现在先把桥和小岛看成一个组合体。

现在这个模型是极度抽象的,如下图所示:
在这里插入图片描述
并且这个模型有两个迁移动作ML_out和ML_in,分别表示汽车进入以及离开这个桥岛组合体,我们第一步工作就是形式化表示系统中的状态事件

前置准备

rodin版本3.4

插件安装
1)atelier B
在这里插入图片描述

2)SMT solvers
在这里插入图片描述
3)ProB
在这里插入图片描述
为了让我们的证明更加顺畅,我们要更改一下证明求解器,下载SMT插件,并且在这个位置把自动证明器改成SMT求解器,如果没有设置的话呢,就会出现某些证明证明不出来的情况
在这里插入图片描述
还有这个地方最好也更改一下,它的作用是某些使用单击更改的地方需要用双击更改,省得到时候一不小心点了一下就报错了
在这里插入图片描述
然后呢,rodin的小bug还是蛮多的,用的时候要耐心一点,多多F5刷新

新建工程

打开Rodin,新建一个工程
在这里插入图片描述
填写一个项目名称
在这里插入图片描述

状态的形式化

模型的状态由两个部分组成:静态部分动态部分

静态部分包含一些与常量相关的定义和公理,而动态部分包含着随着系统演化而可以被修改的部分。

静态部分也称为模型的上下文(context),动态部分也称为机器(machine)

(其实machine和context最主要区别就是相关部分是否会发生变化,而不是下面框框里面的具体内容,例如machine和context都有定理(theorems)这部分,但machine就是和变化部分相关的定理,而context就是不变部分相关的定理)

在这里插入图片描述

模型状态的静态部分

第一个模型的上下文非常简单,只有一个常量d,它是一个自然数,表示出现在桥岛组合体上的最大汽车数。常量d有一条公理,它是自然数。

现在开始建一个上下文,上下文和机器都是模型的组件,在项目上右击,新建一个组件
在这里插入图片描述
选择下面的类型为context,组件名就随便取好了
在这里插入图片描述
先加入一个常量

在Rodin写东西可不是像写代码那么随意的哟,想要加入什么组件需要右键选择添加

在这里插入图片描述
把这个常量的名字改为d,接下来添加公理

在这里插入图片描述
∈和N符号在右下角的符号框可以找到,然后修改一下把这条公理的名字命名为axm0_1
在这里插入图片描述

模型状态的动态部分

动态部分只有一个变量n,代表某一个特定时刻,在桥岛组合体上的实际车辆数目,我们知道n同样是一个自然数,并且它肯定要小于等于d
在这里插入图片描述
再次右键,添加一个变量
在这里插入图片描述
然后添加n的约束,称为不变式(invariant),一个是n∈N,另一个是n小于等于

在上面添加一个see关系,表示这个机器观看(see)之前定义的机器ct。(机器和机器,上下文与上下文,上下文与机器之间有多种关系,这里先不讨论)

最后不得不先提一个动作的概念,在EVENTS栏目下的INITIALISATION事件中右键添加一个动作(Action),然后给n赋值0,因为Rodin所有变量都需要赋予初始值,不然会警告。
在这里插入图片描述

事件的形式化

OK,完成了状态的形式化,接下来就是事件的形式化工作

事件相当于因为系统发生了某种变化而导致系统的状态发生迁移,这个系统的事件有两个,分别是汽车进入或者离开桥岛组合体,这两个分别对应ML_out和ML_in,当汽车进入桥岛组合体时,会使得n加1,而汽车离开桥岛组合体时,会导致n减1

当然啦,在n加1减1的时候还要考虑n是否在边界值上,只有当n<d的时候才能执行n=n+1,而当n的值大于0的时候才能执行n=n-1,不然就明显错误了,这种使得一个事件能够执行的必要条件,称为(guard)
在这里插入图片描述
下面在Rodin中对事件部分进行构建

右键添加两个Event,分别命名为ML_out和ML_in
在这里插入图片描述
右键添加guard作为条件,加入action作为动作
在这里插入图片描述

证明义务

我们看到rodin的左边explorer里,点开mac1的Proof Obligations
在这里插入图片描述
这里面的就是证明义务,由rodin自动帮助我们生成,旁边的绿色的代表已证明,如果是红色的说明证明出现了问题,无法完成自动证明,这时候可以双击点进去看看到底是出了啥问题

证明义务的命名是一个组合名字,例如ML_out/inv1/INV,说明这是一个有关不变式保持的证明义务,因为ML_out在执行的时候会改变变量n的值,在改变过程中可能就会违反不变式,所以需要对此进行相应的证明。

因为这里的建模相对完备,所以都证明好啦

无死锁证明

我们的系统中有了两个卫,但有可能发生一种情况,即这两个卫都为假,模型就发生了死锁,当然啦,根据系统的不同,有时候也是可以发生死锁的,但显然我们的系统应该一直运行下去,所以在需求文档中,我们加入这么一行:

一旦系统开始执行,这个系统就应该永远工作下去

我们在不变式这里加上一条thm1, n < d   ∨   0 < n n<d\text{ }\vee\text{ }0<n n<d  0<n,然后点击not theorem,把它改成theorem,它表示不能出现同时不满足两个卫的情况
在这里插入图片描述
看到左边explorer这里多了一条证明义务,不过它标红了,是不是漏了什么呢?
在这里插入图片描述
我们双击进去看看,点击rodin右上角的proving视图
在这里插入图片描述
我们想到,当n和d都为0的时候就不满足无死锁性质了,但d明显不应该是0,所以是我们之前漏掉了一个重要的条件,d应该为正数

回到ct,加上d>0这个公理

在这里插入图片描述

重新保存,我们发现证明义务全都证明完成了

至此,我们的初始模型构建完毕

解决出现的问题

好~如果你照着敲并且出现了问题,那基本上就是你的问题,可以遵循以下思路尝试解决问题
1、rodin版本是否正确,我这里是3.4
2、插件都装上了嘛?特别是SMT这个还要设置以下
3、真的敲的一样嘛?看看符号什么有没有弄错
4、看看后面的not theorem,theorem,extend,ordinary,convergent之类的有没有设置完成,或者有没有误点
5、保存了吗?没有保存的话肯定证明不出来
6、在报错的证明义务下右键,点击retry auto provers,很多时候就好了

总之就是要多尝试,多总结~

该篇文章的后续Event-B建模(六)——控制桥上汽车,精化

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值