高完整性系统:Invariants

news2024/11/21 0:16:33

目录

1. INVARIANTS

1.1 例子

1.2 正式的证明


1. INVARIANTS

一个不变式需要满足以下三个属性:

  1. 当循环开始时,不变式是正确的
  2. 在每一次循环迭代之后,不变式仍然是正确的
  3. 当循环条件为假时,不变式能推出循环结束后的条件(即后置条件)

其中循环结构的一般形式表示为:({P ∧B} S {P} P ∧ ¬B => Q) / ({P} while B do S done {Q}),其中P为不变式,B为循环条件,S为循环体中的语句,Q为循环结束后的条件。

1.1 例子

a = A;
result = 0;
while a > 0 do 
  result = result + B; 
  a = a - 1;
done

这个程序计算的是result = A * B

consequence rules:

 

sequence rules:

{true}
{?P}
a = A;
{?P1}
result = 0;
{?I}
while a > 0 do 
result = result + B; 
a = a - 1;
done
{result = A * B}

iteration/while loop rule:

 

{?I}
while a > 0 do
{?I ∧ a > 0} 
result = result + B;
a = a - 1;
{?I}
done
{?I ∧ a ≤ 0}
{result = A * B}

在用不变式对这个循环结构进行分析时,我们需要找到一个适合的不变式。根据前面说的不变式的性质,我们可以知道,这个不变式通常需要涉及到循环中改变的变量和后置条件中的内容。

在这个例子中,循环中改变的变量有resulta,后置条件中涉及到的变量有AB。根据这些变量,我们可以得到一个可能的不变式:result + (a * B) = A * B

我们观察到每次迭代,result 增加 B,而 a 减1。所以我们可以选择 result + a * B = A * B 作为我们的循环不变量。

接下来,我们可以验证这个不变式是否满足不变式的性质:

  1. 当循环开始时,a的值是Aresult的值是0,所以result + (a * B) = 0 + (A * B) = A * B,满足不变式。
  2. 在每一次循环迭代之后,result增加Ba减1,所以result + (a * B)的值没有变化,仍然等于A * B,满足不变式。
  3. a变为0时,result的值变为A * B,所以result + (a * B) = result + 0 = A * B,满足后置条件。

因此,我们可以确认这个不变式是正确的。这个不变式也帮助我们理解了这个程序的功能:它实现的是一个乘法运算,其中的循环就是不断地做加法运算来实现乘法。

1.2 正式的证明

这里有两个关键目标:

  1. 在循环开始时和每一次循环之后,我们需要证明不变式(Invariant)result + (a * B) = A * B是正确的。

  1. 在循环结束时(即a不大于0时),我们需要证明result = A * B

目标1在早前的幻灯片中已经完成。对于目标1,我们可以发现,如果我们只使用result + (a * B) = A * B这个不变式,并不能推导出result = A * B。因为当a小于等于0时,它可能是负数,而在这个程序中,a应当是非负的。

因此,我们需要将不变式加强,包括条件a ≥ 0。所以,新的不变式变为result + (a * B) = A * B ∧ a ≥ 0

接下来,我们进行两个目标的证明:

目标1(循环结束时):我们需要证明result + (a * B) = A * B ∧ a = 0能够推导出result = A * B。这个显然是正确的,当a = 0时,result = A * B

目标2(循环中):我们需要证明,给定result + (a * B) = A * B ∧ a > 0,执行一次循环后(result = result + B; a = a - 1;),仍能保持不变式result + (a * B) = A * B ∧ a ≥ 0

将待证明的整个过程分成两个小步骤,每一步都有一个中间条件?R1?R

使用霍尔逻辑的赋值规则(Assignment Rule)来找出?R。赋值规则说,如果你有一个赋值x := E和一个后置条件P,那么前置条件是P[E/x]。这里,我们将a - 1替换a

在前置条件中完成替换。

同样,使用赋值规则来找出?R1。这次,我们将result + B替换result

在前置条件中完成替换。 

Holds If:这一部分是在检查步骤5得到的前置条件是否能够由原前置条件推导出。在这里,显然是可以的。

Rest of the Program

同理,这些步骤都在找出每一步的前置条件。唯一不同的是,这里的目标是找出整个程序的前置条件,而不仅仅是循环部分。 

 

这一步是在处理赋值a = A。同样,我们使用赋值规则,将A替换a

在前置条件中完成替换。

Holds If:这一部分是在检查步骤11得到的前置条件是否能够由原前置条件推导出。在这里,我们发现,如果A小于0,那么前置条件并不能得到满足,所以我们得出结论:这个推导不成立。

Strengthen Precondition

 因为上一步的结果,我们需要加强前置条件,保证A ≥ 0

在前置条件中添加了新的条件。

这是一个完整的霍尔逻辑证明,包括前置条件、后置条件、以及循环的不变式。在这一步,我们得出了最终的结论:在前置条件A ≥ 0下,这个程序能够正确计算result = A * B

这部分的证明包含了一些较复杂的代换和推导,核心的证明步骤是:首先按照程序的执行,将resulta的值进行更新;然后,证明更新后的表达式仍满足不变式。这里的关键是,不变式中的result增加了B,而a减小了1,所以result + (a * B)的值并没有改变。

然后,我们检查这个循环程序的前置条件。我们发现,当A小于0时,前置条件并不满足。因此,我们需要加强前置条件,确保A ≥ 0

最后,我们得到了完整的循环程序和它的霍尔逻辑表示:

{A ≥ 0}
a = A;
result = 0;
while a > 0 do 
  result = result + B; 
  a = a - 1;
done
{result = A * B}

其中,不变式(Invariant)是result + (a * B) = A * B ∧ a ≥ 0。通过这个不变式,我们可以保证在循环开始、循环中、循环结束时,程序的状态都满足我们的期望,从而证明了这个循环程序的正确性。

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

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

相关文章

逻辑漏洞学习-身份验证漏洞

逻辑漏洞就是程序在实现业务逻辑上存在的错误,辑漏洞的出现通常是因为程序在设计业务逻辑时考虑不够全面,或者程序员的思维过程存在瑕疵,没有充分考虑到各种可能的情况 大部分程序员在设计的时候,目标是实现功能需求,…

华为OD机试真题B卷 Java 实现【计算数组中心位置】,附详细解题思路

一、题目描述 给你一个整数数组 nums,请计算数组的中心位置,数组的中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相的积。 数组第一个元素的左侧积为 1,最后一个元素的右侧积为 1。如果数组有多个中心位置&…

pytest:灵活替换用例中的变量

背景: 这几天在调试之前搭建的pytest框架时,发现原框架对case中的变量进行动态替换的代码不够完美,原代码逻辑会造成代码中会出现大量的if语句,让代码量增加不少,并且后期维护也不方便:case只要新增了一个…

vue3 实现全选/全不选功能

List item vue3实现全选/全不选功能 实现逻辑就是全选按钮的选中与否依赖,所有的子复选框是否选中, 通过计算属性的 get()跟set()方法绑定 全选按钮的值. <template><div class"container"><input type"checkbox" v-model"checkAll&qu…

面了个蚂蚁金服拿38K出来的,真是砂纸擦屁股,给我露了一手啊

今年的春招结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石&…

小狐狸ChatGPT付费创作系统1.9.7独立版 + H5端 + 小程序前端增加AI绘画+GPT4接口

小狐狸ChatGPT 1.9.7独立版经播播资源测试了版本比较&#xff0c;本版核心增加了GPT4.0接口功能&#xff0c;小程序端内置了AI绘画功能。体验下来问答速度感觉体验更好。小程序端有更新请对应开发工具更新上传&#xff0c;本版无开源端。播播资源提供的安装教程详见下方&#x…

网路安全技能竞赛——【Linux操作系统渗透提权】解析(超级详细)

Linux操作系统渗透提权 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2202&#xff08;关闭链接&#xff09;用户名&#xff1a;hacker 密码&#xff1a;123456 使用渗透机对服务器信息收集&#xff0c;并将服务器中SSH服务端口号作为flag提交&#xff1b;…

【Redis】聊一下Redis的哨兵机制

在上一篇文章中&#xff0c;我们学习了数据库的Redis的主从集群复制模式&#xff0c;如果从库出现问题&#xff0c;那么其他主从库还可以处理读写请求&#xff0c;但是如果主库宕机&#xff0c;写请求从库处理不了&#xff0c;整个系统就不可用了&#xff0c;虽然只处理只读请求…

Windows提权:利用MSSQL数据库,Oracle数据库

目录 MSSQL提权&#xff1a;使用xp_cmdshell进行提权 MSSQL&#xff1a;使用sp_OACreate进行提权 MSSQL&#xff1a;使用沙盒提权 Oracle提权&#xff1a;工具一把梭哈 总结 MSSQL在Windows server类的操作系统上&#xff0c;默认具有system权限。 MSSQL提权&#xff1a;使…

三、浅谈机器人的底盘设计

两电机差速底盘 方式1&#xff1a;驱动轮在后&#xff0c;万向轮在前&#xff08;支撑轮也可以换成全向轮&#xff0c;目的只是撑地&#xff09;&#xff0c;在一般的巡线比赛中较常用。 该底盘的优点&#xff1a;运动灵活&#xff0c;组装简单 该底盘的缺点&#xff1a;车体…

如何增加音频音量,给大家分享两个免费方法!

相信许多音频剪辑新手在刚开始的阶段需要探索学习各种操作方法。其中&#xff0c;许多用户发现自己的音频文件音量太小&#xff0c;想要增加音量&#xff0c;但却不知道使用哪种工具更好&#xff0c;如何操作更为方便。为此&#xff0c;我为您整理了两种方法&#xff0c;并向新…

docker的基本相关知识和操作

镜像相关操作命令&#xff1a; 访问DockerHub搜索镜像&#xff0c;https://hub.docker.com/ 查看本地镜像&#xff1a;docker images 搜索镜像 docker search redis &#xff08;搜索redis&#xff09; 拉取镜像&#xff1a;docker pull redis &#xff08;默认版本&#x…

Slow-Fast使用教程2023.5.30

项目地址 https://github.com/facebookresearch/SlowFast 安装教程 首先参考官方安装必须的包并下载项目文件&#xff1a;https://github.com/facebookresearch/SlowFast/blob/main/INSTALL.md 安装注意&#xff1a; 最好使用Linux系统&#xff0c;如果是windows系统&#xf…

3. JVM对象创建与内存分配机制深度剖析

JVM性能调优 1. 对象的创建1.1 类加载检查1.2 分配内存1.3 初始化1.4 设置对象头1.HotSpot虚拟机的对象头包括三部分信息&#xff1a;Mark Word、Klass Pointer类型指针、数组长度 1.5 执行<init>方法 2. 对象大小与指针压缩2.1 什么是java对象的指针压缩&#xff1f;2.2…

数据结构——链式二叉树

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

【云原生|探索 Kubernetes 系列 7】探究 Pod 有什么用,为什么需要它

前言 大家好&#xff0c;我是秋意零。 前一篇&#xff0c;我们介绍了如何从 0 到 1 搭建 Kubernetes 集群。现在我们可以正式了解&#xff0c;Kubernetes 核心特征了。 今天我们来探究 Pod&#xff0c;为什么需要 Pod&#xff1f; &#x1f47f; 简介 &#x1f3e0; 个人主页…

编程示例:求排列的逆,反序表,以及从反序表计算排列

编程示例&#xff1a;求排列的逆&#xff0c;反序表&#xff0c;以及从反序表计算排列 计算机程序设计艺术的第三卷 第五章排序中&#xff0c;第5.1.1节中 提到了排列的反序&#xff0c;反序表&#xff0c;逆的概念。 首先&#xff0c;简单地介绍一下这两个概念。例如一个排列…

RK3566 ALC5616录音调试

1.硬件原理图 MIC_P&#xff0c;MIC_N&#xff1a;mic输入。 I2S&#xff1a;总共有5根线&#xff08;这里不是指 i2s 标准接口&#xff09;&#xff1a;两根音频数据线&#xff08;输入/输出&#xff09;、三根时钟线 其中&#xff1a; I2S_LRCK 是指示当前数据线传输的是左声…

【网络】UDP的应用场景

文章目录 翻译功能命令行解析网络聊天室UDP之Windows与Linux 翻译功能 我们写的UDP服务端并不是只接收到数据就完了&#xff0c;还需要进行处理任务。 我们可以在服务端udpServer.hpp中设置一个回调函数 _callback&#xff0c;具体的逻辑通过udpServer.cc中由外部进行传入 代…

Windows系统安全基线

文章目录 前言一、安全基线概述1.操作系统安全基线 二、系统账户安全1.控制密码安全2.密码策略3.账户锁定策略例&#xff1a;密码策略应用例&#xff1a;账户锁定策略应用 三、本地策略1.审核策略2.用户权限分配3.安全选项配置例&#xff1a;审核策略应用例&#xff1a;用户权限…