UPPAAL使用方法

UPPAAL使用方法

由于刚开始学习时间自动机及其使用方法,对UPPAAL使用不太熟悉,网上能找到的教程很少,摸索了很久终于成功实现一个小例子,所以记录一下详细教程。

这里用到的例子参考【UPPAAL学习笔记】1:基本使用示例,详细信息可自行有链接查看,本文重点手把手教学UPPAAL方法,本人也是刚开始学习,有不足或理解有误的情况欢迎指出。

下面使用几个小例子展示使用 UPPAAL建模,验证的方法。

简单迁移

建模

首先,打开UPPAAL 后,【文件】→【新建模型】
在这里插入图片描述
新建模型如下所示:
在这里插入图片描述
需要建的模型如下图,为一个简单的TS模型
在这里插入图片描述
在【编辑器】的模板(【Template】)中,右侧通过添加位置、顶点(钉子)和边进行建模。
在这里插入图片描述
位置用名称和不变量标记。通过下面红框修改位置类型
在这里插入图片描述
通过【编辑location】,在【名字】处为位置命名,在【Invariant】处编辑不变量
在这里插入图片描述
在这里插入图片描述
通过下图添加位置
在这里插入图片描述
以相同的方法,将其命名为end,通过下图添加边,边用守卫条件(Guard)(例如,e == id)、同步(Sync)(例如,go?)和赋值(Update)(例如,x:=0)标记。

在这里插入图片描述
创建模型如下,可以在红框处修改模板名字,添加参数
在这里插入图片描述

在【模型声明】处将模型实例化,得到Process,此处实例化Template(),名称与模板名称相同,由于此处模板没有参数,故()内为空

// Place template instantiations here.
Process = Template();
// List one or more processes to be composed into a system.
system Process;

在这里插入图片描述
建模完成后,对模板进行语法检查,点击【工具】→【检查语法】,若右下角没有消息,则语法无误,可继续进行模拟或验证。
在这里插入图片描述

模拟

在【模拟器】中可以看到这个模型
在这里插入图片描述
选中例化对象Process,点击【下一步】,就可以往下走
在这里插入图片描述
当TS走到end状态后就无路可走了,故【使能迁移】里也没有选项了

验证

在【验证器】中,点击【添加】,在【待验证性质】中输入待验证性质

性质描述意义如下:

  • E<> p:存在一条路径,其中最终成立p,可达属性()。
  • A[] p:对于所有路径,始终成立p,安全属性(安全属性的形式是:某些坏事永远不会发生)。
  • E[] p:存在一条路径,其中始终成立p,安全属性。
  • A<> p:对于所有路径,最终将成立p,活性属性(活性属性的形式是:某些事最终会发生)。
  • p --> q:每当成立p时,最终将成立q,活性属性。
    在这里插入图片描述
    此处验证两条性质:
    E<> Process.end
    A<> Process.end

在这里插入图片描述
依次对性质进行验证,选中需验证的性质,点击【开始验证】即可。验证结果在下方【验证进度与结果】中。
在这里插入图片描述

此处,E<> Process.end表示存在一条路径,未来能让实例Process到达end状态,显然,验证结果通过;
A<> Process.end表示对所有路径,都能在未来让实例Process达到end状态,验证结果不通过。因为一个TS的Guard条件通过,只表示“这条迁移可以发生”,但不代表一定会发生,可能存在一直停留在start状态的情况,而不发生这条唯一的迁移,因此不满足这条性质。
若想让迁移在一定条件下一定发生,可以为状态设置不变性,一旦不变性不满足,就无法停留在这个状态,迫使其进行迁移。

互斥进入临界区

新增内容为:
1. 边用守卫条件(Guard)(例如,e == id)、同步(Sync)(例如,go?)和赋值(Update)(例如,x:=0)标记示例。
2. 模板参数设置及实例化

建模

同步通道和时钟控制

新增内容:

  1. 边的标记方法
  2. 模板参数设置及实例化
  3. 一个项目中使用两个进程模板
  4. 为状态添加不变性条件

建模

模型如下图所示
在这里插入图片描述

需建立两个模板,新建模板方法为:【编辑】【添加模板】

在这里插入图片描述
建模方法同上,对边的标记方法为:右键需标记的边,选择【编辑edge】
在这里插入图片描述
依次填写,Guard(守卫条件,如,x>=2e == id),同步通信(Sync,如,go?reset?),赋值(Update,如,x:=0e:=id
在这里插入图片描述
建立模型如下图。
模板P1是一个自循环,Guard条件x>=2时进行Sync(同步通信),往通道reset上发送重置信号(!表示发送,?表示接收)
在这里插入图片描述
模板Obs(意为Observer,观察者),行为就是接收到通道reset上的信号之后,就将全局变量x设置为0(其实是表示时钟重置,要从后面声明的地方看出这一点):
在这里插入图片描述
这里要注意taken上有个C,因为它勾选了Commited,被标记Commited的状态会冻结时间流逝,而且下一次转移一定从某个Commited状态开始(要把所有冻结时间的状态走出去,才能考虑普通的状态),如果多个状态被标Commited,它们就按Interleaving算。
模型声明部分,这里可以不去显式做例化(为啥?),直接两个模板拿来用:

// Place template instantiations here.
// Process = Template();
// List one or more processes to be composed into a system.
system P1, Obs;

在这里插入图片描述

设置全局变量(全局的【声明】),其中,x是时钟(clock),reset是通道(chan):

// Place global declarations here.
clock x;
chan reset;

在这里插入图片描述

模拟

语法检查通过就可以去模拟,就是P1发信号然后Obs重置然后再回来,因为taken状态被标Commited,所以到必须使Obs走出这个状态才能桀纣往下走,即图中红框部分:总是先让Obs回到idle状态。在这里插入图片描述

验证

此处验证两条性质:
A[] Obs.taken imply x>=2,即对所有路径的所有状态都有,如果Obs到达了taken状态,一定有时钟x满足x>=2,验证是通过的,因为x>=2才能发信号到reset通道上,让Obs同步接收之后进到taken状态。
E<> Obs.idle and x>3,即存在某个路径上某个状态,Obsidle状态闲置时就有x>3了,验证也是通过的。这条性质直观上可能让人感觉不能通过(因为x>=2P1迁移的条件),但是回想最开始学的,这些Guard条件满足时只表示“迁移可以发生”,而不是一定会发生,所以P1完全可以x超过3了还不发生迁移,也就不会往reset发信号,所以Obs也就处在最开始的idle状态了。
在这里插入图片描述

为状态添加不变性条件

对上述E<> Obs.idle and x>3性质的验证通过,是因为可以一直停留在某个状态,要解决这个问题,可以为状态添加一个有关时钟的不变性条件,当时间流逝使得这个条件不满足时,就不得不离开这个状态,发生迁移。
在模板P1中编辑位置loop(双击或右键编辑),在【Invariant】里添加x<=3,为P1loop状态添加了x<=3的限制,也就是说它最多可以在这里停留到时钟流到3,就必须执行迁移到别的状态去了.
在这里插入图片描述
在这里插入图片描述
验证性质A[] Obs.taken imply (x>=2 and x<=3),即只要Obs到了taken状态,时钟x一定在23之间,验证通过。

验证性质E<> Obs.idle and x>2,即可能Obsidle状态时,时钟x是大于2的,验证通过。因为这个也是满足loopx不超过3的不变性的,完全可以等到2.999...

但是它对性质E<> Obs.idle and x>3就是不满足的了,因为一旦x>3P1就必须从loop迁移走,发出的信号让Obs也同步离开idle
在这里插入图片描述

参考文献

【1】【UPPAAL学习笔记】1:基本使用示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业级润滑油,一站式批发服务

要为机械设备提供持久稳定的动力保障吗&#xff1f;选择我们的专业级润滑油&#xff0c;让您的设备运转更顺畅&#xff0c;效率更高。 我们专业从事润滑油批发多年&#xff0c;以优质的产品、合理的价格和完善的服务赢得了广大客户的信赖。无论是汽车、机械还是工业设备&#x…

【Vue3】env环境变量的配置和使用(区分cli和vite)

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、env文件二、vue3cli加载env1..env配置2..dev配置&#xff08;其他环境参考&#xff09;3.package.json文件4.使用 三、vue3vite加载e…

【html5】03-新表单元素及属性

目录 1 引言 2 智能表单控件-type 3 表单属性 form input 5 答疑--解决required自定义提示信息 1 引言 HTML5引入了一系列新的表单输入类型&#xff0c;如email、url、number、range、date、time、datetime-local、month、week、search、color和tel等。这些新类型增强了表…

FFmpeg源码:bytestream_get_byte函数解析

一、引言 FFmpeg源码中经常使用到bytestream_get_byte这个函数&#xff0c;比如使用FFmpeg对BMP图片进行解析&#xff0c;其源码会调用函数bmp_decode_frame&#xff0c;而该函数内部会通过bytestream_get_byte读取BMP 的header。本文讲解函数bytestream_get_byte的作用和内部…

Spark SQL 中DataFrame DSL的使用

在上一篇文章中已经大致说明了DataFrame APi,下面我们具体介绍DataFrame DSL的使用。DataFrame DSL是一种命令式编写Spark SQL的方式&#xff0c;使用的是一种类sql的风格语法。 文章链接&#xff1a; 一、单词统计案例引入 import org.apache.spark.sql.{DataFrame, SaveMod…

Xinstall助力实现App间直接跳转,提升用户体验

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;在使用各类App时&#xff0c;我们经常会遇到需要在不同App之间切换的情况&#xff0c;这时如果能够直接跳转&#xff0c;将会大大提升用户体验。而Xinstall正是这样一款能够帮助开发者实…

OpenCV 获取 RTSP 摄像头视频流保存至本地

介绍 Java OpenCV 是一个强大的开源计算机视觉库&#xff0c;它提供了丰富的图像处理和分析功能&#xff0c;越来越多的应用需要使用摄像头来获取实时视频流进行处理和分析。 在 Java 中使用 OpenCV 打开摄像头的基本步骤如下&#xff1a; 确保已经安装了OpenCV库使用 OpenC…

Raylib 绘制自定义字体的一种套路

Raylib 绘制自定义字体是真的难搞。我的需求是程序可以加载多种自定义字体&#xff0c;英文中文的都有。 我调试了很久成功了&#xff01; 很有用的参考&#xff0c;建议先看一遍&#xff1a; 瞿华&#xff1a;raylib绘制中文内容 个人笔记&#xff5c;Raylib 的字体使用 - …

W801 实现获取天气情况

看了小安派&#xff08;AiPi-Eyes 天气站&#xff09;的源码&#xff0c;感觉用W801也可以实现。 一、部分源码 main.c #include "wm_include.h" #include "Lcd_Driver.h"void UserMain(void) {printf("\n user task \n");Lcd_Init();Lcd_Clea…

MySQL主从复制(五):读写分离

一主多从架构主要应用场景&#xff1a;读写分离。读写分离的主要目标是分摊主库的压力。 读写分离架构 读写分离架构一 架构一结构图&#xff1a; 这种结构模式下&#xff0c;一般会把数据库的连接信息放在客户端的连接层&#xff0c;由客户端主动做负载均衡。也就是说由客户…

RabbitMQ 消息队列安装及入门

市面常见消息队列中间件对比 技术名称吞吐量 /IO/并发时效性&#xff08;类似延迟&#xff09;消息到达时间可用性可靠性优势应用场景activemq万级高高高简单易学中小型企业、项目rabbitmq万级极高&#xff08;微秒&#xff09;高极高生态好&#xff08;基本什么语言都支持&am…

leetcode124 二叉树中的最大路径和-dp

题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解题感悟 提示的太明显了

redis核心面试题二(实战优化)

文章目录 10. redis配置mysql实战优化[重要]11. redis之缓存击穿、缓存穿透、缓存雪崩12. redis实现分布式session 10. redis配置mysql实战优化[重要] // 最初实现OverrideTransactionalpublic Product createProduct(Product product) {productRepo.saveAndFlush(product);je…

MQTT 5.0 报文解析 05:DISCONNECT

欢迎阅读 MQTT 5.0 报文系列 的第五篇文章。在上一篇中&#xff0c;我们已经介绍了 MQTT 5.0 的 PINGREQ 和 PINGRESP 报文。现在&#xff0c;我们将介绍下一个控制报文&#xff1a;DISCONNECT。 在 MQTT 中&#xff0c;客户端和服务端可以在断开网络连接前向对端发送一个 DIS…

手把手教你搭建一个花店小程序商城

如果你是一位花店店主&#xff0c;想要为你的生意搭建一个精美的小程序商城&#xff0c;以下是你将遵循的五个步骤。 步骤1&#xff1a;登录乔拓云平台进入后台 首先&#xff0c;你需要登录乔拓云平台的后台管理页面。你可以在电脑或移动设备上的浏览器中输入乔拓云的官方网站…

2024.5.26 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、Motivation 5、naive Lite-HRNet 6、Lite-HRNet 7、实验 深度学习 解读SAM(Segment Anything Model) 1、SAM Task 2、SAM Model 2.1、Patch Embedding 2.2、Positiona Embedding 2.3、Transformer …

互联网医院开发:引领智慧医疗新时代

随着科技的迅猛发展和互联网的普及&#xff0c;传统医疗模式正在迎来一场深刻的变革。互联网医院的崛起&#xff0c;打破了时间和空间的限制&#xff0c;为患者和医疗机构带来了更加便捷、高效、安全的医疗服务体验。本文将从技术角度深入探讨互联网医院的开发&#xff0c;包括…

多线程(八)

一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…

Pod容器资源限制和探针

目录 一、资源限制 1.Pod和容器的资源请求和限制 2.CPU 资源单位 案例一 案例二 二、健康检查&#xff0c;又称为探针&#xff08;Probe&#xff09; 1.探针的三种规则 2.Probe支持三种检查方法 3.探测获得的三种结果 案例一&#xff1a;exec 案例二&#xff1a;htt…