高完整性系统(7)Formal Verification and Validation

news2024/12/23 22:10:35

文章目录

  • Specification Process 规格化过程
  • State Invariants
    • 案例
    • check ... expect

在这里插入图片描述
Alloy是一种用于构建和检查抽象模型的语言和工具。当Alloy说所有断言都成立时,这意味着你的模型或规格在给定范围内已成功通过了所有的断言检查。换句话说,对于你所定义的所有属性,Alloy的分析器已经找到了证据来确认这些属性在你的模型中是正确的。

然而,这并不一定意味着你的规格就是正确的。这主要有以下几个原因:

  • 有限范围: Alloy的分析器基于有限范围进行检查,所以只能证明在给定范围内没有找到反例。如果在更大的范围内有反例存在,Alloy就可能无法检测到。

  • 规格的完整性: Alloy只能检查你明确编写的断言。如果你的规格不完整,即遗漏了某些重要的断言,那么Alloy就无法检查这些遗漏的部分。因此,即使Alloy没有发现任何问题,你的规格也可能是错误的。

  • 规格的正确性: Alloy不会检查你的规格是否正确地描述了你想要的行为。如果你的断言是基于错误的理解或者假设编写的,那么Alloy会根据这些错误的断言进行检查。因此,Alloy可能会告诉你所有断言都成立,但这并不意味着你的规格是正确的。

Specification Process 规格化过程

在这里插入图片描述
在Alloy中,规格化过程(Specification Process)是使用Alloy语言来形式化问题描述并建立模型的过程。下面是规格化过程的一般步骤:

  • 理解问题域: 首先,需要理解你要建模的问题或系统的领域。这可能涉及到研究相关的背景知识,理解领域的基本概念和规则。

  • 定义sigrelation: 使用Alloy语言中的签名(sig)来表示领域中的实体,使用关系(relation)来表示实体之间的联系。例如,如果你正在建模一个图书管理系统,你可能需要定义"Book"和"User"这样的签名,以及"borrow"这样的关系。

  • 定义约束: 约束是描述实体和关系必须满足的规则。在Alloy中,你可以使用facts来定义全局约束,也可以在签名中定义局部约束。

  • 定义断言: 断言(assertion)是你对系统预期行为的声明。断言是需要被验证的,如果Alloy分析器找不到违反断言的例子,那么就可以说这个断言在给定范围内成立。

  • 分析和验证: 使用Alloy分析器来检查你的模型是否满足所有的断言。如果分析器找到了违反断言的例子,那么就需要对模型进行调整。

  • 迭代: 随着你对问题的理解深入,或者随着问题本身的发展,你可能需要反复进行以上步骤,以逐步完善你的模型。

今天本文的目的是介绍,如何让 alloy 帮我们实现一个 “不会产生 bad 行为的” 系统

State Invariants

在计算机科学中,状态不变式(state invariant)是一种描述系统在其整个生命周期中都必须维持的属性或条件的表述。换言之,无论系统经历了怎样的状态转移或操作,状态不变式都必须保持为真。

举例来说,如果你在设计一个银行系统,你可能会有一个状态不变式,即所有账户的余额总和(这是系统的一个状态)必须等于某个固定的值。这就意味着无论怎样进行转账操作(这是状态转移),这个总和都不应该改变。

在Alloy模型中,状态不变式通常通过 fact 关键字来定义,表示一个 全局的约束条件,必须在所有时刻都成立。例如,以下是一个Alloy模型中的状态不变式的示例:

fact {
  all a: Account | a.balance >= 0
}

这个状态不变式指出,在任何时刻,所有账户的余额都不能小于0。如果存在使这个状态不变式不成立的状态转移或操作,那么我们就可以说这个操作是非法的,或者说这个模型是有缺陷的。

  • 我们的系统其实是使用有限状态机来表示的:
    在这里插入图片描述
  • 如果想让整个系统在运行过程中不发生 bad 行为,其实只需要:
    • 保证在 init state 的时候不发生 bad 行为,即系统在初始状态满足 state invariant
    • 保证在每次执行了 O p t i o n i Option_i Optioni 之后依然不发生 bad 行为, 在任何一个 state 都要满足条件不变式子,并且在这个 state 执行完 operation 后也要保证同样满足 state invariant
  • 那么就能够保证系统在整个的运行过程中都不会有 bad 行为
    在这里插入图片描述
  • 第一个 assert 语句保证了在开始状态 s 的时候,整个系统是满足条件不变式的
  • 第二个 assert 语句保证的是对于所有的时间步骤 (采用了 always 来约束所有的时间步骤),所有的 state 首先满足条件不变式 Inv,并且在 Op_i 操作之后的状态依然是满足条件不变式 Inv[s]

案例


sig URL{}
sig Password{}
sig Username{}

sig Passbook{
	var password: Username -> URL -> Password
}

// 定义一个 sig 来标志是否正常地 add 了 password
abstract sig Report{}
one sig Failed extends Report{}
one sig Success extends Report{}

pred init[pb: Passbook]{
	no pb.password
}

//首先定义一个所有状态都需要遵守的不变量 inv,表示在所有的 state 中,对于任意给定一个 username 和 url, 他们的密码最多只有 1 个
pred inv[pb: Passbook]{
	all user: Username, url: URL | lone pb.password[user][url]
}

// 当给定一个 user 和 url 的时候,需要保证给定条件的 password 尚未存在,才能正常 add
pred addPreCondition[pb: Passbook, user: Username, url: URL]{
	no pb.password[user][url]
}

// 当 add 操作正常执行的 post condition
pred addPostCondition[pb: Passbook, user:Username, url:URL, psd: Password]{

	pb.password' = pb.password + (user -> url -> psd)
}


//  正常增加 add,需要满足 addPrecondition 如果成功之后会满足 addPostCondition
pred addNormal[pb: Passbook, user: Username, url: URL, psd: Password, report: Report]{
	addPreCondition[pb, user, url]
	addPostCondition[pb, user, url, psd]
	report in Success
}


// 如果增加 add 的时候不满足 precondition 则会进入这个 pred,那么 password 的状态保持不变
pred addException[pb: Passbook, user:Username, url:URL, psd:Password, report: Report]{
	not addPreCondition[pb, user, url]
	pb.password' = pb.password
	report in Failed
}


// 在这个函数中封装 addNormal 和 addException,add 只可能是这两种行为
pred add[pb: Passbook, user:Username, url:URL, psd:Password, report: Report]{
	addNormal[pb, user, url, psd, report] or addException[pb, user, url, psd, report]
}


// 开始的时候就保证不变量满足条件
assert initEstablished{
	all pb: Passbook | init[pb] => inv[pb]
}


// 保证完成 add operation 之后依然满足不变量
assert AddOperationInv{
	always all pb: Passbook, user: Username, url: URL, psd: Password, report: Report |
	inv[pb] and add[pb, user, url, psd, report] => after (inv[pb])
}


check initEstablished for 3 expect 0
check AddOperationInv for 3 expect 0


这段Alloy代码定义了一个名为Passbook的密码管理器的模型。密码管理器可以存储和管理用户的用户名(Username)、密码(Password)和对应的网址(URL)。

  • 在这个模型中,Passbook有一个名为password的变量,它是一个映射,可以将每个用户名和网址映射到对应的密码。

  • 然后,模型定义了两个报告类型,分别是成功(Success)和失败(Failed),表示添加密码的操作是否成功。

接下来,模型定义了几个断言和谓词:

  • init:这是初始化的谓词,表示一个Passbook在初始状态下没有任何密码。
  • inv:这是一个不变量,表示在任何状态下,对于给定的用户名和网址,其密码最多只有一个。
  • addPreCondition:这是添加密码操作的预条件,表示对于给定的用户名和网址,其密码尚未存在。
  • addPostCondition:这是添加密码操作的后条件,表示在操作后,新的密码被添加到映射中。
  • addNormal:表示正常添加密码的操作,当预条件满足时,后条件会被满足,并且报告为成功。
  • addException:表示异常情况,当预条件不满足时,密码的状态不改变,并且报告为失败。
  • add:表示添加密码的操作,它可以是正常的添加或者异常情况。

最后,模型定义了两个断言:

  • initEstablished:断言初始化确实建立了不变量,即所有的Passbook在初始状态下都满足不变量。
  • AddOperationInv:断言添加操作保持了不变量,即对于所有的Passbook,如果一个添加操作满足不变量并且被执行,那么在操作后,不变量仍然被满足。
    这个模型的目标是检查这两个断言是否被满足。check 语句被用来验证这些断言是否在所有可能的情况下都被满足,expect 0 表示我们期望没有违反断言的情况。

在之前的一个 passbook 例子中 https://blog.csdn.net/qq_42902997/article/details/131046821
在之前的这个例子中,我们通过 fact 来假设这个 password[usr][url] 始终最多只有一个值。
在这里插入图片描述

  • 但是现在我们通过 pred 定义了一个不变量 inv 这样做的目的是,为了证明整个过程中确实不会出现 password[usr][url] 有超过一个值的情况!
  • 根据前面的知识,这里我们如果要保证 state 在不同状态下始终不出现 bad 的情况,就要保证:
    • 在初始化的时候,所有的 state 满足不变量
    • 在操作完成后,所有的 state 也要满足不变量
      在这里插入图片描述

check … expect

在Alloy中,expect 关键字用于指定预期的反例数量。这个关键字通常在 check 语句后面使用。check 语句用于验证一个断言,如果存在违反该断言的情况,Alloy分析器会产生一个反例。

expect 关键字可以帮助你确保你的模型的行为符合你的预期。如果你已经知道有 n 个反例,你可以写 check ... expect n 然后,当你运行Alloy分析器时,如果它找到的反例数量与你的预期不符,你就知道可能需要进一步检查你的模型。

例如,你可能会写这样一个语句:

check someAssertion for 4 expect 0

这个语句的意思是,对于给定的范围(在这个例子中是 4),检查断言 someAssertion,并预期找不到任何反例(即 expect 0)。如果Alloy分析器找到了反例,那么就意味着someAssertion在给定的范围内不成立,可能需要进一步调整模型。

需要注意的是,expect 关键字只能提供一种预期的反例数量,并不能改变Alloy分析器的行为。即使你写了expect 0,如果存在违反断言的情况,Alloy分析器仍然会找到反例。同样,即使你写了expect n,如果没有足够的反例,Alloy分析器也无法创造出反例。

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

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

相关文章

SOLIDWORKS PDM 独立程序 C#

本主题介绍如何创建登录到 一个 SOLIDWORKS PDM Professional 文件库,并列出根文件夹中的文件。 启动Visual Studio.文件 > 新建 > 项目 > Visual C# > WPF(也可以使用WF) 输入程序名称选择存储路径确定在解决方案资源管理器中…

(学习日记)2023.06.06

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【Linux】基础文件IO、动静态库的制作和使用

基础IO 前言回顾C语言文件IO操作三个标准 系统文件I/O系统调用接口不带mode的open带mode的openwirtereadopen的第二个参数flagsopen返回值文件的管理0,1,2演示文件描述符的分配规则重定向C中的0、1、2输入重定向追加重定向 另一种重定向的方式dup2实现输…

MySQL5.7主从同步配置(一台master,两台slave)

1. 下载MySQL(5.7.42) rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2.安装 yum install mysql-server2.1 安装过程中如果报错如下,按下边方法处理。否则略过即可 2.2 解决方案:执行以下命令 rpm --import https…

mongodb redis mysql 区别

一、MySQL 关系型数据库。 在不同的引擎上有不同 的存储方式。 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。 开源数据库的份额在不断增加,mysql的份额页在持续增长。 缺点就是在海量数据处理的时候效率会显著变慢。 二、Mo…

Vue3中setup函数、以及父子组件传值讲解

文章目录 1.vue3中setup函数的执行时机2.setup函数的两种写法2.1 普通写法2.2 语法糖写法 3.vue3父组件给子组件传值。4.vue3子组件给父组件传值 1.vue3中setup函数的执行时机 setup选项的写法和执行时机,setup函数在beforeCreate函数之前执行,并且是自…

以安全为底线 共迎机遇和挑战|2023 开放原子全球开源峰会可信基础设施技术分论坛即将启幕

蚂蚁集团的业务领域,对于「可信」有非常高的技术要求。这种可信技术不仅体现在可靠、健壮,也体现在金融领域独有的风控难题以及分布式系统中持续提供服务的续航能力。可信基础设施中有大量的开源项目,而新的机会也在不断涌现。 2023 开放原子…

echarts 图表导出PDF(带滚动条)/图片导出PDF

echarts 图表导出PDF[带滚动条]/图片导出PDF 效果展示提出问题思考问题解决问题导出PDF 里面的页头中文乱码问题参数说明 效果展示 提出问题 在开发过程中,有需求是将展示出来的echarts图表导出为pdf 原本我的滚动条是使用echarts图表进行的滚动,但通过了解后得知,echarts图表如…

《人月神话》阅读推荐

用了两周的时间,大致过了一遍。书中讲述的很多方面可能此时并没有很深刻的体会,但是该书的预见性和分析还是很让人钦佩的。书中对项目、产品、程序、程序员等一系列对象的分析是相当精准的。虽然距今已有四十多年,但很多依旧在发生。   书中…

Java设计模式(四)

系列文章目录 UML类图 文章目录 系列文章目录前言一、UML类图二、UML基本介绍三、UML图1.类图—依赖关系(Dependence)2.类图—泛化关系(generalization)3.类图—实现关系(Implementation)4.类图—关联关系(Association)5.类图—聚合关系(Aggregation)6.类图—组合关系(Composi…

分布式(二)-大型网站架构演化发展历程

大型网站架构演化发展历程 大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,任何简单的业务一旦需要处理数以 P 计的数据和面对数以亿计的用户,问题就会变得很棘手。大型网站架构主要解决这类问题。 初始阶段的网站架构 …

MinIO 分片上传

文章目录 1.MinIO 简介2.为什么要分片上传?3.实现思路4.具体实现初始化客户端获取分片上传的预签名 URL合并分片中止合并 5.FAQ端口错误协议错误 参考文献 1.MinIO 简介 MinIO 是适用于 AI 的高性能对象存储系统。 MinIO 简单易用。简单性是 EB 级数据基础设施的基…

宝塔配置MySQL队列调度 | ModStart

执行以下操作前提前进入网站根目录,如 cd /www/wwwroot/xxx.com执行 artisan 命令前请参照 开发教程 → 开发使用常见问题 → 如何运行 /www/server/php/xxx/bin/php artisan xxx 命令 ① 生成数据库队列表迁移文件 在执行该步骤前,请先检查迁移文件 da…

【CSS 05】文本颜色 文本对齐 文字装饰 文本转换 文字间距 文本阴影 字体 字体样式 字体大小 谷歌字体

CSS 说在前面文本 text文本对齐 text-align文字装饰 text-decoration文本转换 text-transform文字间距 text_spacing文本阴影 text-shadow字体 font字体样式 font-style字体大小 font-size谷歌字体简写属性 shorthand 说在前面 事实证明,Zoro只要出现在标题就会被识…

go-GUI开发:fyne解决中文乱码+注册windows服务

go-GUI框架:fyne教程及解决中文乱码等常见bug 1 fyne教程 fyne教程地址: https://www.topgoer.cn/docs/goday/goday-1crdp17nj4v6phttps://pkg.go.dev/fyne.io/fyne/v2#section-readme 1.1 介绍 简单易用,fyne提供了简单直观的API&#xff…

iOS编译提效插件cocoapods-jxedt方案详解

1. 前言 本篇文章是cocoapods-jxedt插件实现方案的详解,主要从以下几个方面阐述了一下插件的实现方案和历程。 插件文件目录介绍插件的工作流程介绍插件实现过程中的问题和解决方案记录 如果你对插件的使用还不了解,建议先读一下cocoapods-jxedt使用介…

CVE漏洞复现-CVE-2023-32233 NetFilter权限提升

CVE-2023-32233 NetFilter权限提升 Netfilter是Linux 内核中的网络数据包处理框架(iptables)通过各种规则和过滤器,基于数据包的来源、目标地址、协议类型、端口号等信息,控制网络流量和数据包的转发和处理具体,详情请…

使用贝叶斯网络预测糖尿病:从理论到实践

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 引言 在现实世界中,许多变量之间存在着复杂的概率关系,例如天气、交通、健康等方面的因素都会相互影响。为了更好地理解…

音频基本概念

1.音频信号 音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理。 数字音频系统通过将声波的波型转换…

调用腾讯云API实现英文识别

目录 1. 作者介绍2. 腾讯云英文识别API介绍2.1 英文识别原理—OCR技术2.2 腾讯云英文识别API 3. 实验过程3.1获得API3.2申请调用接口3.3调试接口3.4实验代码3.5实验结果3.6 问题分析 4. 参考连接 1. 作者介绍 乔奕婕,女,西安工程大学电子信息学院&#…