CN106682343B - 一种基于图的邻接矩阵的形式化验证方法 - Google Patents
一种基于图的邻接矩阵的形式化验证方法 Download PDFInfo
- Publication number
- CN106682343B CN106682343B CN201710003712.2A CN201710003712A CN106682343B CN 106682343 B CN106682343 B CN 106682343B CN 201710003712 A CN201710003712 A CN 201710003712A CN 106682343 B CN106682343 B CN 106682343B
- Authority
- CN
- China
- Prior art keywords
- state
- matrix
- ctl
- operator
- adjacency matrix
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/10—Geometric CAD
- G06F30/18—Network design, e.g. design based on topological or interconnect aspects of utility systems, piping, heating ventilation air conditioning [HVAC] or cabling
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Geometry (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Analysis (AREA)
- Computational Mathematics (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Computer Hardware Design (AREA)
- Evolutionary Computation (AREA)
- General Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于图的邻接矩阵的形式化验证方法。首先分析系统模型,将状态编码;将编码与状态转移关系结合,建立邻接矩阵;将带求规范转化为语法树;将语法树中的操作对应计算公式运用于矩阵中;求出反例,得出结果,查看初始状态是否在最终结果状态集里面,若初始状态不在最终状态集里面,则说明原规范正确,输出true;若初始状态在反规范里面,则原规范是错误的,从初始状态开始,找一条满足反规范的路径,那么该路径就是一条与原规范相斥的反例。本发明的实施,比OBDD构建和化简要简单,可以提高其验证效率。
Description
技术领域
本发明主要涉及一种形式化验证方法,特别涉及一种基于图的邻接矩阵的形式化验证方法。
背景技术
形式化验证技术使用严格的数学模型分析和验证系统的正确性,在计算机硬件、通信协议、控制系统、安全认证协议等方面有许多成功的应用。模型检测是基于模型的形式化验证的基本方法,是一种对待检测系统进行建模并自动分析验证的技术,最早由E.M.Clarke和E.A.Emerson以及J.P.Queille和J.Sifakis分别独立提出。
模型检测的基本问题是:把待测系统的行为用严格的形式化语言描述出来,建成待检测系统的抽象模型;针对待检测系统提取出待检测需求,再把待检测需求形式化为用逻辑公式表达的属性规范;再利用模型检测工具验证抽象模型是否满足规范,若不满足,给出违反属性规范的反例。因此模型检测方法要解决的问题是:如何建立抽象模型,如何对抽象模型进行验证。
传统的模型检测方法是基于Kripke结构的。一个Kripke结构M=(S,R,L)是一个由状态集S,和转移关系R(S上的二元关系),以及使得每个Si∈S存在一个Si′∈S,满足Si→Si′,和一个标记函数L:S→P(Atoms)组成的系统抽象。抽象模型是一个由Kripke结构描述的状态转换系统,属性规范是若干时序逻辑公式。Kripke结构描述的是一个非限定状态转换系统,可以用一个图来表示,图中的节点表示系统可以达到的状态,有向边表示状态的迁移。Kripke结构还定义了一个标记函数,标记出每个状态下为真的所有原子命题的集。时序逻辑公式的语义就是基于Kripke结构进行解释,Kripke结构在模型检测中负责描述待检测系统的行为。从Kripke状态转换图的初始节点出发,将该结构展开成一棵无限高度的树,树中的每一条路径就是待检测系统的一条状态转换序列,它表示待检测系统可能的一次运行状况。这棵树包含了所有可能的路径。实际应用时,待检测系统的路径往往很多很复杂,展开树的分支比较多,计算机的主要工作就是展开这个树,并遍历所有可能的路径,找出是否存在违反属性规范的路径。若存在违反属性规范的路径,则给出该路径。
为了使用模型检测工具进行分析和验证,建模中需要建立待检测系统的Kripke结构模型,并在模型的基础上提出用时序逻辑公式描述的待检测属性。建模者需要将待检测系统运行生命周期可能到达的阶段划分为若干个状态,并明确标示出所有状态下系统的相应属性。这样,计算机才能完成自动搜索并分析验证的工作。
基于传统模型检测方法的工具,在建模具体实现时,用的数据结构为OBDD(OrderBinary Decision Diagram),即将元素按一定的顺序排列好后并可以得到最简形式的二叉决策图。它的本质是真值表的简化。如一个公式(x∨y的结果取非)可以得到如图1所示的BDD结构,图中虚线表示该节点取0的值,实线表示该节点取1的值,最下面的1和0表示所有操作数根据不同取值后得到的真值。BDD结构是真值表的一个变形。在将x,y的顺序固定后,可以将其再次化简以缩小空间,如图2所示的OBDD结构。
一个固定顺序的布尔值,最终不同取值的结果将会在根节点处展现。这样做的目的是,OBDD可以很好的将每一个验证步骤中的状态集和结果通过真值表简化的结果所表示出来。但也存在一些不足,每进行一次布尔操作,其表达式的真值表都会改变。进而对整个二叉决策图的结果以及构成也会改变。再简单一个操作,只要引起了真值表的改变,整个表达式的OBDD就得全部重新构建,重新化简,去除冗余,整个过程非常繁琐、冗余。在传统的验证方法中,就是将状态集中的每个状态,写为原子命题的表示,再将其结果根据原子命题的真值构建OBDD结构。如一个状态集{s0,s1},s0的原子命题为s1&的原子命题为那么该状态集为其OBDD构成如图3所示。该结构图虽然简化了空间,但显得很不直观,无法很清楚的明白其状态集所表示的意义,即该状态集包含哪些状态。而且当集中的状态发生变化时,表达式改变,整个图也会重新变化。这是一个隐式的不可见的验证过程。特别元素个数的变多时,整个OBDD的深度也会变多,化简的过程难度也会随之上升。而将此数据结构运用于验证的规范过程时,每进行一个验证的操作,会存在多个状态标记的过程,而每一个状态的标记,都会影响到OBDD的重建,这是相当影响效率的一个过程。
发明内容
本发明的发明目的在于:针对上述存在的问题,提供一种建模与验证过程数据结构不是基于现有的OBDD,而是基于图的邻接矩阵的形式化验证方法。
本发明的基于图的邻接矩阵的形式化验证方法,包括下列步骤:
步骤1:输入待测系统模型,进行状态编码。
根据待测系统和待测需求的特点定义待检测系统的状态,这个状态即为待检测系统的抽象模型的状态。一个状态是一个多元组,每一个元可以当做一个原子命题,即一个待测系统,可以划分为一个由同一组原子命题组合成的状态集。若将原子命题的顺序固定,则按照一定的方式,可以将状态集编码。
每一个原子命题,它都是一个逻辑命题。在逻辑上,可以用“1”代表逻辑“真”,用“0”代表逻辑“假”。所以每一个编码后的状态,都可以被仅由“0”和“1”组成的数字序列所表示。若将原子命题的顺序固定,那么每一个状态根据固定原子命题顺序以及命题真假,所编码的结果将是固定的。由于编码的结果是一串由0和1组成的数字,可以将其结果看成一串二进制数,将其大小按从小到大排列,从而得到状态的排序。并将二进制数转换成十进制数的值,作为状态的下标元素。
如一个由4个原子命题组成的系统。编码为0000的状态,对应的状态编号为0,例如标记为S0,同理,编码为0001的状态可标记为S1,编码为0100的状态可标记为S4。
关于原子命题,有如下性质:一个由3个原子命题构成的系统,设3个原子命题分别为x1,x2,x3,并设置其编码序列为x1,x2,x3的顺序排列,用“1”代表逻辑“真”,用“0”代表逻辑“假”。可得到如下原子命题编码表格:
表1原子命题编码表
x<sub>1</sub> | x<sub>2</sub> | x<sub>3</sub> | coded |
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 2 |
0 | 1 | 1 | 3 |
1 | 0 | 0 | 4 |
1 | 0 | 1 | 5 |
1 | 1 | 0 | 6 |
1 | 1 | 1 | 7 |
表1前三列为三个不同的原子命题的真假,第四列为状态编号。从上表中不同原子命题的真值编码得到的结果中。由表1可知,对于一个有n个原子命题的系统,对于其在编码序列中的第m个原子命题,有如下性质:
xm为真时,能被划分标记的状态,2n-m个一组,有2m-1个组,组间相隔为2n-1,组内相邻出现,并且从数字2n-1开始。其编码序号可用公式表示为:
2n-m+j+k*2m-1,0≤j≤2n-m-1,0≤k<2m-1-1 (1)
其中,j为从1到2m-1中的每一个数。
公式(1)用于快速查找某个原子命题为“真”的状态编号,从而得到包括任意规范的状态集集s(f),其中f表示规范符号的表达式。例如f对应表1中的x2时,s(f)={2,3,6,7}。
步骤2:将编码与状态转移关系结合,建立邻接矩阵。待验证系统可以被一个有向图来描述。其中,系统中的状态作为有向图的顶点,状态间的转移关系,作为连接各顶点的有向边。一个有n个原子命题的系统,就有2n个状态,那么转换成有向图,就是一个有2n个顶点的有向图。将2n个状态按编码后的顺序对应成矩阵中的行和列,再根据邻接矩阵的定义,若状态Si到状态Sj存在转移关系,则邻接矩阵Am中,Am[i][j]=1,其余未有转移关系的为0。此时,可根据Kripke结构中的转移关系R,建立有向图和邻接矩阵。
由于一个系统中存在很多无效状态,即在状态转移关系中,从来不会到达,从来不会出现的状态。这些状态在邻接矩阵中的性质是:对应的行和列全为0。所以为了进一步简化计算复杂度,还可以在矩阵建立之后,将其行和列全为0的状态去掉,精简后的矩阵是一个全为有效状态的矩阵。由于对编码后的邻接矩阵进行了无效状态的剔除,所以要通过剔除前的映射表,将待测系统的状态集,重新对应至剔除后的矩阵中,即记录精简处理前邻接矩阵Am中的元素值为“1”的元素对应的状态编号(存在状态转移的两个状态编号),以备验证处理时映射到对应的状态。
步骤3:将待求规范转化为规范语法树并取反。待求规范是用户输入的一个字符串,要想实现自动化的验证,必须将其转换成高级语言能够识别的数据结构——规范语法树。语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次。简单说,语法树就是按照某一规则进行推导时所形成的树。在语法树中采用递归原理,就可以将语法树执行了。从规范语法树的根节点开始进行,先判断该节点的左右子树,可得出是否往下还有计算子树,若有,则继续递归,直到计算至叶子节点为止。通常,叶子节点都为CTL规范(计算树逻辑)中的原子节点。
步骤4:结合邻接矩阵Am对取反后的规范语法树进行验证处理,保存满足反规范的状态,得到最终状态集。
语法树中的操作算子有逻辑算子和时态算子两种。逻辑算子有(非),∨(或),∧(与)以及→(条件)和(蕴含)。时态算子分为2类。一类是范围描述,包括A、E,其中A代表all,所有路径,E代表exist,存在一条路径;另一类是行为描述,包括X、F、G、U,其中X代表next,下一状态;F代表future,以后的某一状态;G代表global,全时刻全局的状态;U代表until,直到出现某个状况的状态。将两类时态算子组合起来,就是CTL算子(计算树逻辑算子)。如AF,就代表所有路径的未来某一时刻;EG代表存在一条全局都满足的路径上的状态集。
用符号|=来表示满足关系。该符号左边为一个状态,右边为一个规范表达式。如Si|=f=1表示:状态Si满足公式f。
若待验证对象为逻辑算子,则直接进行逻辑计算,完成验证操作,具体如下:
若待验证对象为计算树逻辑CTL算子,则继续判断待验证对象包括的CTL算子是否属于基本CTL算子集,若是,则直接进行CTL算子验证;否则对待验证对象进行CTL算子转换(具体的转换关系为现有技术,本发明不再详述),用基本CTL算子集中的CTL算子进行表达后,再进行CTL算子验证。其中,基本CTL算子集包括的CTL算子为:EX、EF、EU、EG,各CTL算子的验证操作具体如下:
(1)EX
对于待验证对象EX(f),在邻接矩阵Am中,对于任意i,j∈s,若Am[i][j]=1,则状态Si能被EX(f)标记,其中f为CTL规范表达式,s表示对应系统模型的状态集S的状态编码集;即对于状态集S中任意状态Si、Sj,若Am[i][j]=1,则Si能被EX(f)标记,i,j为Si、Sj的状态编码。
用Am表示系统的邻接矩阵,可用如下公式来表示S中状态的满足EX的情况:
公式(2)中,i,j∈s。
(2)EF
对于待验证对象EF(f),先计算邻接矩阵Am的可达矩阵Rm;在可达矩阵Rm中,对于任意i∈s,j∈s(f),若Rm[i][j]=1,则Si能被EF(f)标记,其中s(f)表示包括规范符号的表达式f的状态编号集。
可用如下公式来表示S中状态的满足EF的情况:
公式(3)中,i∈s,j∈s(f)。
(3)EU
对于待验证对象E[f 1Uf2],执行下列步骤:
(3a)对于s(f1)中的每个状态编号i,s(f2)中的每个状态编号j,在邻接矩阵Am中,若Am[i][j]=1,则将状态编号i记入集合I。当统计完所有的i、j后,若集合I为空,则Si不能被E[f1U f2]标记,即Si能被E[f1U f2]标记,其中i∈I,其中s(f1)、s(f2)分别表示包括规范符号的表达式f1、f2的状态编号集;
(3b)剔除邻接矩阵Am中不能被f1标记的所有状态,得到子邻接矩阵Am′,并计算Am′的可达矩阵Rm′;在可达矩阵Rm′中,对任意i∈s(f1),k∈I,若Rm′[i][k]=1,则Si能被E[f1 U f2]标记。
可用如下公式来表示S中状态的满足情况:
公式(4)中,在Rm′[i][k]中的i和k分别为:i∈s(f1),k∈I。
(4)EG
对于待验证对象EG(f),执行下列步骤:
(4a)从邻接矩阵Am中剔除所有不能被规范符号的表达式f标记的所有状态,得到子邻接矩阵Am″,将对应子邻接矩阵Am″对应的状态编号集记为s″,并计算子邻接矩阵Am″的可达矩阵Rm″,子邻接矩阵Am″的强连通矩阵SCC″,并将强连通矩阵SCC″对应的状态编号集记为scc″,即符号&表示按位与;
(4b)在可达矩阵Rm″中,对任意i∈s″,j∈scc″,若Rm″[i][j]=1,则状态Si能被EG(f)标记。
可用如下公式来表示状态Si的满足情况:
公式(3)中,i∈s″,j∈scc″。
步骤5:判断初始状态是否在最终状态集中,若否,则验证通过;若是,则从初始状态开始,查找一条满足反规范的路径并输出。
由于求的是反规范的验证结果,所以,若初始状态不在最终状态集里面,则说明原规范正确,输出true。若初始状态在反规范里面,则原规范是错误的,从初始状态开始,找一条满足反规范的路径,那么该路径就是一条与原规范相斥的反例。
综上所述,由于采用了上述技术方案,本发明的有益效果是:本发明基于图的邻接矩阵实现形式化验证处理,根据邻接矩阵的定义,矩阵的行和列直接表示了一个转移关系中的两个状态,所以每次验证步骤的结果的改变,都可以根据矩阵很清楚明白的体现,是一个显示的验证过程。而且矩阵中的查找和计算操作,比OBDD构建和化简要简单,可以提高其验证效率。
附图说明
图1是BDD结构示意图。
图2是OBDD结构示意图一。
图3是OBDD结构示意图二。
图4是具体实施方式的实现过程示意图。
图5是实施例的模型图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面结合实施方式和附图,对本发明作进一步地详细描述。
将本发明的验证方法作为一个形式化验证工具进行应用实施。一个形式化验证工具需要有如下几个模块:系统建模模块、规范语法树模块、验证模块,输出反例模块。其中,系统建模模块用于将待测系统的Kripke结构转化为一个能表达出系统状态关系的邻接矩阵;规范语法树模块用于将表达待测规范的字符串转化为能被机器语言能识别的语法树;验证模块用于将输入的规范语法树与状态邻接矩阵按照已有的验证算法,进行系统验证;。输出反例模块用于正确规范和错误规范的结果输出。
参见图1,本发明基于输入的待测系统的Kripke结构和待测的CTL规范,通过系统建模模块实现Kripke结构、的邻接矩阵建立、通过规范语法树模块实现规范语法树的建立和取反、通过验证模块实现规范验证,若通过验证,则输出TRUE;否则通过输出反例模块输出一条路径作为反例。各部分的具体实现步骤如下:
一、将待测系统的Kripke结构转化为邻接矩阵具体包括如下步骤:
步骤101:提取Kripke结构的状态集S和原子命题集L,对原子命题进行排列和编码,从而得到状态编码,将二进制的状态编码所对应的十进制的值作为状态编号,再将状态编号对应进同样规模大小的邻接矩阵中。
步骤101-1:确定原子命题集L中的每个原子命题的编码序列,如将n(L的元素个数)个原子命题的编码序列设置为x0,x1,x2,x3,...,xn-1。每个原子命题可以取0或1,每组不同取值的原子命题集,对应了一个状态,即每个状态由n个“0”或“1”组成的数字表示。并将每个状态的二进制串所对应的十进制的值作为状态编号,得到2n个状态编号:0,1,……,N-1,其中N=2n。用s表示状态编号集,即s={0,1,…,N-1},对应的状态集S={S0,…,SN-1}。
步骤101-2:对于包括n个原子命题的待测系统,其对应的状态数目有2n个状态,所以建立一个2n阶的方阵A,将状态序列S0,S1,S2,...,SN-1对应进方阵的行和列中,即状态Si对应到矩阵的第i行或第i列(i=0,1,,...,2n),得到邻接矩阵Am。
步骤102:将Kripke中的状态转移关系R与邻接矩阵Am相结合,将存在转移关系的状态,在矩阵Am的对应位置处置为1。
步骤102-1:找出状态转移关系R中存在转移关系的2个状态,根据该状态的原子命题的真伪,来找到他们在状态集排序中的位置,如Si→Sj。
步骤102-2:根据邻接矩阵的定义,若从一个点i到另一个点j存在转移关系,那么矩阵中i行j列位置置为1,即若存在状态Si可达状态Sj,则在邻近矩阵Am中,有Am[i][j]=1,其中i、j表示邻近矩阵Am的行、列编号。
步骤102-3:重复102-1,102-2步骤,直到所有R中的转移关系处理完为止。
步骤103:建立好的邻接矩阵Am包括了很多无效状态,由于一个系统中存在很多无效状态,即在状态转移关系中,从来不会到达,从来不会出现的状态。这些状态在邻接矩阵中的性质是:对应的行和列全为0。所以在矩阵建立之后,将其行和列全为0的状态去掉,精简后的矩阵是一个全为有效状态的矩阵,以便于简化后续的验证过程。
步骤103-1:找出矩阵Am中全为0的行和列,表示没有一个状态会导致它发生,且它也不会导致其他状态转移,这类状态就是无效状态,将该行和该列从矩阵Am中删除。
步骤103-2:重复103-1,直到矩阵Am中不存在这样的行和列为止。
二、将待测规范的字符串转化为能被机器语言能识别的语法树,包括下列步骤。
步骤201:将用户输入的待测规范(包括操作符、符号、单词等),转换语法分析器能识别的单词表示符。
步骤201-2:,在词法分析器中编写关键词,如“EX”,“AG”等规范描述词和“!”“&”等逻辑符号词以及小括号,中括号等。
步骤201-2:基于关键词对用户输入信息进行匹配,并将匹配到的关键词替换为语法分析器能识别的单词表示符(token)。原规范就成为一组很正式的单词了。
步骤202:将词法分析转换好的单词组进行语法分析,通过判断操作符的优先级来决定处理顺序,即在语法树中的位置。优先级最高的,越靠近根节点。叶子节点必然是原子命题。
步骤202-1:在词法分析器中设置操作符的优先级,如时态逻辑操作符大于布尔逻辑操作符,大于原子节点等。
步骤202-2:在每个优先级中,设置节点插入操作通过二叉节点的合理操作,可将语法节点构成语法树。如新的节点的左儿子指向当前的根节点。
步骤202-3:执行202-1、202-2的操作,使得最后步骤201执行完的单词组构建成一个具有待求规范优先级顺序的语法树,即规范语法树。
步骤203:对得到的语法树取反,为的是后续验证过程的需要,验证一个反的规范,若它是正确的,则原规范错误,若反规范是正确的,那么它的一条路径,就是原规范的反例。
步骤203-1:设置每个操作符取反的操作,包括左右子树应该如何操作,是否取反,原操作符替换等。
步骤203-2:从根节点开始带入203-1设置的操作方式,将其递归进行取反操作,直到原子节点位置。整个语法树取反就完成了。
三、验证过程具体为:将规范语法树的根节点传入语法树递归模块,进行后序递归遍历,遍历到叶子节点时调用验证算法函数,进行验证。
步骤301:对每棵树的根节点,用一个数组存放满足当前子规范的状态集,存放的数字为排序后的状态下标,如“2”代表状态S2满足当前规范。若该节点为双目操作符,如AND,左右子树的节点代表了该操作符的左右两个操作数,若为单目操作符如EX,左子树为它的单操作数,右子树为空。从跟节点开始后序遍历直到左右孩子都为空的节点为止,即叶子节点,开始计算,从最底层的子规范开始,逐渐验证到最高层的原始规范。每次递归回溯到操作符时,调用预设置的验证算法,进行验证计算。
步骤302:递归过程传递过来的节点,通过判断节点的TYPE属性,可以知道是什么操作符,根据TYPE来调用所需操作,同时决定左右子树的调用情况,在操作函数中进行计算,并将该步的计算结果存放在节点的结果(result)向量中,供上一层递归节点所使用。
步骤303:重复302所有递归操作,递归完成后,将最终结果向量传给下一步输出结果模块。
四、输出验证结果包括如下步骤:
步骤401:对验证结果进行判断,根据判断结果进行不同的处理:
判断初始状态是否在最终结果中,若不在,则说明原规范是真,输出结果;若在最终结果中,则说明初始状态是满足反规范的,原规范不满足,为假。此时进入步骤402,进行反例路径找寻。
步骤402:,从根节点开始遍历,查找验证过程中每一步所保存的状态集。第一步在根节点选择初始状态,再往下走。每往下一个节点,根据节点的操作符类型,找出满足的状态,并输出,每条路径走到布尔操作符为止。最后,输出的查找路径,就是不满足原规范的反例。
对比验证过程的数据结构,本发明舍弃了用OBDD数据结构建模,使得每步验证结果不直观不可见的建模方法。而采用了用邻接矩阵建模,使得每个验证步骤能显式而直观的表示出运算结果。同时,由于本发明的验证过程是一个显式的可见的过程,所以每个过程的计算结果可以直观的表出,并且可以存入每个操作符在语法树中的节点里,使得在进行查找反例路径时,有所根据,更加方便、简洁。
实施例
为了更加清晰明白的说明上述验证过程,以下基于一个示例进行描述。
待测系统为一个简易的微波炉模型,其包括4个原子命题(Start,Close,Heat,Error),对应了启动,关门,加热,报错四个状态。图5给出了各个有效状态操作和迁移关系。现在给出规范公式AG(Start→AFHeat)来进行验证。首先根据其公式的等价关系,可以得到如下等价公式
根据本发明的验证方法,设置4个原子命题的编码序列为(Start,Close,Heat,Error),用“1”代表逻辑“真”,用“0”代表逻辑“假”,从而得到状态编号:S0,S1,S2,...,S15,建立一个16*16的方阵,同时根据图5中的转移关系,可得到如下邻接矩阵Am:
将状态编号集{0,1,2,4,5}与矩阵Am,带入公式(5)
再将状态编号集{1,4}与矩阵Am,带入公式(3)
因为初始状态S0不在最终的验证集里面,则说明原规范是真,输出结果。
Claims (3)
1.一种基于图的邻接矩阵的形式化验证方法,其特征在于,包括下列步骤:
步骤1:输入待测系统模型,进行状态编码:
所述待测系统模型为微波炉模型,包括四个原子命题,分别对应启动、关门、加热和报错四个状态;
提取系统模型的状态集和原子命题集,设置原子命题集中各原子命题的编码序列,用“1”代表原子命题的逻辑“真”,用“0”代表原子命题的逻辑“假”,得到状态编码,并将状态编码的十进制值作为状态编号,用S表示状态集,s表示状态集S的状态编号集;
并设置2n×2n的方阵A,所述方阵A的行、列编号与状态编号一一对应,其中n表示原子命题集的原子数目;
基于系统模型的转移关系构建有向图,其中有向图的顶点为不同的状态,有向边为状态间的转移关系;
在有向图中,若存在从状态Si到状态Sj的有向边,则将方阵A中的第i行第j列置1;否则第i行第j列置为0,得到邻接矩阵Am,其中Si,Sj∈S,i,j为状态编号;
步骤2:将用户输入的规范符号转化为规范语法树并取反后执行步骤3;
步骤3:结合邻接矩阵Am对取反后的规范语法树进行验证处理,保存满足反规范的状态,得到最终状态集:
若待验证对象为逻辑算子,则直接进行逻辑计算,完成验证操作;
若待验证对象为计算树逻辑CTL算子,则继续判断待验证对象包括的CTL算子是否属于基本CTL算子集,若是,则直接进行CTL算子验证;否则对待验证对象进行CTL算子转换,用基本CTL算子集中的CTL算子进行表达后,再进行CTL算子验证;
其中基本CTL算子集包括的CTL算子为:EX、EF、EU、EG,各CTL算子的验证操作具体如下:
(1)EX:
对于待验证对象EX(f),在邻接矩阵Am中,对于任意i,j∈s,若Am[i][j]=1,则状态Si能被EX(f)标记,其中f为CTL规范表达式;
(2)EF:
对于待验证对象EF(f),先计算邻接矩阵Am的可达矩阵Rm;在可达矩阵Rm中,对于任意i∈s,j∈s(f),若Rm[i][j]=1,则Si能被EF(f)标记,其中s(f)表示包括规范符号的表达式f的状态编号集;
(3)EU
对于待验证对象E[f1 U f2],执行下列步骤:
(3a)对于s(f1)中的每个状态编号i,s(f2)中的每个状态编号j,在邻接矩阵Am中,若Am[i][j]=1,则将状态编号i记入集合I,其中s(f1)、s(f2)分别表示包括规范符号的表达式f1、f2的状态编号集;
(3b)剔除邻接矩阵Am中不能被f1标记的所有状态,得到子邻接矩阵Am′,并计算Am′的可达矩阵Rm′;
在可达矩阵Rm′中,对任意i∈s(f1),k∈I,若Rm′[i][k]=1,则Si能被E[f1 U f2]标记;
(4)EG:
对于待验证对象EG(f),执行下列步骤:
(4a)从邻接矩阵Am中剔除所有不能被规范符号的表达式f标记的所有状态,得到子邻接矩阵Am″,将对应子邻接矩阵Am″对应的状态编号集记为s″,并计算子邻接矩阵Am″的可达矩阵Rm″,子邻接矩阵Am″的强连通矩阵SCC″,并将强连通矩阵SCC″对应的状态编号集记为scc″;
(4b)在可达矩阵Rm″中,对任意i∈s″,j∈scc″,若Rm″[i][j]=1,则状态Si能被EG(f)标记;
步骤4:判断初始状态是否在最终状态集中,若否,则验证通过;若是,则从初始状态开始,查找一条满足反规范的路径并输出。
2.如权利要求1所述的方法,其特征在于,对任意规范符号的表达式f,所述f在系统模型的原子命题的编码序列中的位置编号用m表示,若m从1开始编号,则状态编号集s(f)的元素的计算方式为:2n-m+j+k*2m-1,0≤j≤2n-m-1,0≤k<2m-1-1;若m从0开始编号,则状态编号集s(f)的元素的计算方式为:2n-m-1+j+k*2m,0≤j≤2n-m-1-1,0≤k<2m-1,其中n为系统模型的原子命题数目。
3.如权利要求1或2所述的方法,其特征在于,步骤2还包括,对邻接矩阵Am进行精简处理:删除邻接矩阵Am中全为0的行、全为0的列,并记录精简处理前邻接矩阵Am中的非0元素对应的状态编号。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2016107945415 | 2016-08-31 | ||
CN201610794541 | 2016-08-31 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106682343A CN106682343A (zh) | 2017-05-17 |
CN106682343B true CN106682343B (zh) | 2020-09-25 |
Family
ID=58849177
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710003712.2A Active CN106682343B (zh) | 2016-08-31 | 2017-01-04 | 一种基于图的邻接矩阵的形式化验证方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106682343B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022161668A1 (de) * | 2021-01-28 | 2022-08-04 | Bayerische Motoren Werke Aktiengesellschaft | Formale verifikation eines programms eines steuergeräts |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107688663B (zh) * | 2017-09-19 | 2020-06-05 | 华南理工大学 | 无环数据分析队列的形成方法及包含其的大数据支撑平台 |
CN107590254B (zh) * | 2017-09-19 | 2020-03-17 | 华南理工大学 | 具有合并处理方法的大数据支撑平台 |
CN109446358A (zh) * | 2018-08-27 | 2019-03-08 | 电子科技大学 | 一种基于id缓存技术的图数据库加速装置和方法 |
CN110489335B (zh) * | 2019-07-25 | 2023-01-24 | 金陵科技学院 | 应用于自动售卖机系统的基于模型检测的反例精化系统 |
CN111158691B (zh) * | 2019-12-05 | 2023-10-13 | 杭州安恒信息技术股份有限公司 | 实现规则引擎动态化的方法 |
CN111291324B (zh) * | 2020-02-28 | 2023-06-13 | 太原理工大学 | 一种粒分辨矩阵在逻辑电路优化中的应用 |
CN111597103B (zh) * | 2020-03-23 | 2023-11-28 | 浙江工业大学 | 一种嵌入式软件SysML模型状态空间约简方法 |
CN113268890B (zh) * | 2021-06-25 | 2023-06-23 | 华北电力大学(保定) | 一种行为树模型到Kripke结构的映射方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104050087A (zh) * | 2014-07-04 | 2014-09-17 | 东南大学 | 一种基于uml模型的软件架构正确性验证方法 |
-
2017
- 2017-01-04 CN CN201710003712.2A patent/CN106682343B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104050087A (zh) * | 2014-07-04 | 2014-09-17 | 东南大学 | 一种基于uml模型的软件架构正确性验证方法 |
Non-Patent Citations (3)
Title |
---|
A Graph-Based Approach for Containment Checking of Behavior Models of Software Systems;Huy Tran et al;《2015 IEEE 19th International Enterprise Distributed Object Computing Conference》;20151231;全文 * |
Model Checking;Doron Peled;《MIT Press》;20010131;全文 * |
软件开发的形式化方法在程序测试中的应用;廖伟志;《广西师范学院学报(自然科学版)》;20081231;第25卷(第4期);全文 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022161668A1 (de) * | 2021-01-28 | 2022-08-04 | Bayerische Motoren Werke Aktiengesellschaft | Formale verifikation eines programms eines steuergeräts |
Also Published As
Publication number | Publication date |
---|---|
CN106682343A (zh) | 2017-05-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106682343B (zh) | 一种基于图的邻接矩阵的形式化验证方法 | |
Krajíček | Proof complexity | |
CN104699883B (zh) | 采用紧凑多波形表示的电路设计评估 | |
Kim et al. | Structured attention networks | |
CN112579477A (zh) | 一种缺陷检测方法、装置以及存储介质 | |
CN110362597A (zh) | 一种结构化查询语言sql注入检测方法及装置 | |
CN108573020B (zh) | 融合装配信息的三维装配模型检索方法 | |
CN107251018A (zh) | 用于基于组合超图形的数据表示和操作的装置和方法 | |
Heule et al. | Proofs for satisfiability problems | |
Zeljić et al. | Deciding bit-vector formulas with mcSAT | |
CN114238100A (zh) | 基于GGNN和分层注意力网络的Java漏洞检测定位方法 | |
CN108664512A (zh) | 文本对象分类方法及装置 | |
Grohe et al. | Learning MSO-definable hypotheses on strings | |
CN114265860A (zh) | 执行语句的识别方法及装置 | |
CN116340952A (zh) | 一种基于操作码程序依赖图的智能合约漏洞检测方法 | |
CN115438169A (zh) | 一种文本与视频的互检方法、装置、设备及存储介质 | |
CN117573096B (zh) | 一种融合抽象语法树结构信息的智能代码补全方法 | |
Zengler et al. | Encoding the Linux kernel configuration in propositional logic | |
CN111638926A (zh) | 人工智能在Django框架中的一种实现方法 | |
CN111562943B (zh) | 一种基于事件嵌入树及gat网络的代码克隆检测方法和装置 | |
US12106228B2 (en) | Article processing method, electronic device, and program product | |
CN115329949A (zh) | 基于真值表的函数自动生成方法及系统 | |
CN111813837B (zh) | 一种智能检测数据质量的方法 | |
CN114385776A (zh) | 信息定位方法、存储介质及装置 | |
CN116167361A (zh) | 文本纠错方法、装置、设备及计算机存储介质、程序产品 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |