记录学习LTL2BA和SPIN实现LTL satisfiability checking

2023-12-10 19:40

本文主要是介绍记录学习LTL2BA和SPIN实现LTL satisfiability checking,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里记录一下学习LTL2BA和SPIN实现LTL satisfiability checking

1. LTL satisfiability checking关注这样一类问题:对于一个系统,给定一个由线性时序逻辑(LTL)描述的性质,判断系统是否具有该性质,解决该问题的理论方法之一简单理解是将LTL性质转换为等价的Buchi自动机,再列举系统所有的运行轨迹,检验这些运行轨迹能否使得Buchi自动机最终停留在“接受”的状态。

2. 实现LTL satisfiability checking的方法/工具有很多,读者可以参考下面这篇文章做出的总结:

Rozier, K. Y., & Vardi, M. Y. (2007, July). LTL satisfiability checking. In International SPIN Workshop on Model Checking of Software (pp. 149-167). Springer, Berlin, Heidelberg.

3. 本文主要介绍一下以SPIN为工具的LTL satisfiability checking,

  • 输入:Promela(PROcess MEta LAnguage,一种用于建模并行程序的语言),一个用于LTL satisfiability checking的Promela(.pml)文件包含两部分,分别是对于待验证系统的描述,和对于待验证性质的描述
  • 输出:系统是否满足给定的性质,如果不满足则会连带输出一条系统不满足该性质的运行轨迹
  • 对于性质的定义,SPIN可以接受LTL性质(其会将输入的LTL性质转换为Buchi自动机),也可以直接接受Buchi自动机(以“never claims”的形式进行定义);另外一种输入方法是先使用特定工具将LTL性质转换为Buchi自动机,再将转换结果输入SPIN,这些工具包括LTL2AUT,LTL2BA,LTL2Buchi(JavaPathFinder)等。

本文学习使用的是LTL2BA+SPIN的组合

4. LTL2BA

官网为http://www.lsv.fr/~gastin/ltl2ba/index.php,其提供了一个在线的demo,LTL2BA的理论文章以及LTL2BA的下载。

  • demo的应用示例:输入LTL公式“[] ( s ->  ( X e ) )”(意为系统当前状态如果使得命题s成立,则下一个状态需使得命题e成立),以下是输出的Buchi自动机表达式和图像
never { /* G ( c ->  ( X s ) ) */
accept_init :    /* init */if:: (!c) -> goto accept_init:: (1) -> goto accept_S2fi;
accept_S2 :    /* 1 */if:: (!c && s) -> goto accept_init:: (s) -> goto accept_S2fi;
}

 

  • LTL2BA的下载和安装:官网上有下载连接,下载解压后需要编译c文件,作者运行系统是WIN10,采用的具体方法是下载cygwin→安装过程中勾选gcc-core和make包→将cygwin的bin目录添加至环境变量PATH→命令行在LTL2BA根目录下执行命令make -f Makefile
  • 编译完成后即可命令行使用ltl2ba命令,使用方法可参见根目录下的README文档,一般使用的命令是ltl2ba -f 'formula'和ltl2ba -F xxx.txt,前者直接在命令行中输入LTL公式,后者则是将LTL公式保存在.txt文件中再运行命令
  • 其它运行Makefile文件的方法可参见stackoverflow上的这个帖子How to run a makefile in Windows

这篇关于记录学习LTL2BA和SPIN实现LTL satisfiability checking的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478155

相关文章

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体