文章目录
第三章 系统建模
相关概念
-
需求工程:指定系统应具有的属性,并了解在哪个抽象级别可以评估这些属性的真实性或虚假性。
-
构建形式化模型
(1)捕获影响属性正确性的系统方面
(2)抽象出与指定细节无关但使验证更复杂的细节 -
kripke结构:为建模系统,充分分析系统状态及行为,通过这样一组状态转换图来捕捉关于反应系统行为的直觉。
组成:一组状态、一组状态之间的转换和一个用在一组在此状态下为true的属性标记每个状态的函数。
- 一阶逻辑公式:用来形式化表示系统,并由此构造出kripke结构。
本章主要内容:
- 定义kripke结构
- 如何从一阶逻辑公式中提取此类结构
- 演示如何用一阶公式形式化不同的编程结构
3.1 转换系统和kripke结构
转换系统
用三元组(S,S0,R)形式化转换系统,其中:
- S是一组状态
- S0 ⊆S是初始状态的集合
- R⊆S×S是转换关系(包含所有状态转换关系)
kripke结构
用五元组(S,S0,R,AP,L)表示kripke结构,其中:
- S,S0,R与转换系统中定义相同
- AP为一组原子命题(为观察特定状态而定义的一组状态标签的集合)
- L为一个函数,它用那些在该状态下为真的原子命题集来标记每个状态
注:1. kripke结构通常用有向图可视化。
2. 原子命题也称简单命题,即不包含其他命题作为其组成部分的命题,不能带有非、或、且、如果,那么等联结词。
实例:kripke结构为S = {s1,s2,s3},S0 = {s1},R = {(s1,s2),(s2,s1),(s3,s2)},AP = {p,q},L = {s1↦{p}, s2↦{p,q},s3↦∅,那么用有向图可表示为:
3.2 不确定性与输入
不确定性:系统从给定的状态开始有两个以上的后继状态或是系统的初始状态不唯一,我们称转换系统具有不确定性。不确定性常用于模拟系统本身或者运行环境的未知细节。
实例:灯开关模型:初始灯为关闭状态,切换状态必须返回释放状态再进行按压。用0和1表示灯开关状态,r和p表示释放和按压,kripke结构如下:
初始环境的两种不同状态以及每个状态的两种后继状态体现了这种不确定性。这种不确定性实际上是由于环境的输入导致的,3.6节将会提到系统内部产生的不确定性。
3.3一阶逻辑和符号表示
由一阶逻辑公式导出kripke结构
- 状态表征:系统变量估值表示系统的状态
例如:系统变量集合V={v1,v2,v3},值域Dv=N(自然数)。那么某种系统状态可表示为:
- 集合表征:对特征函数进行适当变换来执行通常的集合运算
例如:S为所有状态集合,A、B为S的子集,对于A、B的集合操作可转化为对特征函数Α(s) 、ℬ(s)(s∈S)的操作。(Α、ℬ表示取子集函数)
-
转换关系表征:用V表示当前状态变量,V’表示下一状态变量。若R⊆S×S为转换关系,则可用
ℛ(V,V’)表示该转换关系。 -
原子命题表征:
若 l ∈ AP,且v ∈ V且d ∈ Dv,则:
l ∈ L(s)可表示为s ╞ l;
l ∉ L(s)可表示为s l╪ l;
(v = d) ∈ L(s)可表示为s ╞ (v = d);
具体方式:从代表并发系统的一阶公式S0 和ℛ推导出kripke结构M = (S, S0, R, AP, L)
状态集S是V的所有估值集合
初始状态集S0是满足公式S0 的V的所有赋值s0的集合,即s0╞ S0
s、s’为系统前后两种状态,当s、s’╞ ℛ时,R(s,s’)成立
L(s)是在s处保持真的所有标签集,即s╞ l。
实例:考虑有两个变量x1、x2的简单系统。
条件如下:
1、值域为D={0,1},d1、d2为x1、x2的取值,则系统变量赋值满足(d1, d2) ∈ D × D
2、系统可执行操作为:x := (x+y) mod 2
3、初始状态集为:
4、转换关系为:
提取kripke结构M = (S, S0, R, AP, L)如下:
从初始状态开始的唯一路径为:(1,1)(0,1)(1,1)(0,1)…
注:由于kripke结构要求转换关系是完全的,我们扩展了关系R。
3.4 布尔编码
布尔编码能将推理技术用于命题逻辑,如BDD和命题可满足性,本小节提出一种将S0 和ℛ的特征函数转换为命题逻辑的方法,在状态S有限的情况下,这种转换是可能的。
实例:具有四个状态的kripke结构如下
状态标签有a、b,用两个布尔变量v0、v1(值域为真-true和假-false)对系统状态进行编码;
左边第一个状态设为v0=false,v1=false,第二个为v0=true,v1=false;
用公式表示如下:
初始状态为:
过渡关系为:
注:由图中可知第二状态到下一状态的路径有两条,故R中的第二个子句为该情况的简化书写,代表两种不同的状态切换。
3.5 数字电路建模
3.5.1 状态保持元素
定义:将电路中用来存储数据的特殊元素。
若用V表示状态保持元素的集合,在下面两种情况,状态保持元素集合分别为:
同步电路:主输入和寄存器输出
异步电路:电路中所有导线
用公式描述数字电路:为简单起见,将状态保持元素的值限制为0和1,于是电路状态可通过布尔表达式描述,即可通过布尔编码来描述数字电路。
例:用S0 (V)和ℛ(V,V’)分别表示数字电路的初始状态集合和转换关系。
3.5.2 同步电路
同步电路的各状态转换同时发生,故可通过各部分转换关系的合取描述整体电路状态转换关系。
3.5.3 异步电路
异步电路的表示与同步类似,为简单起见,限定各部件只有一个输出且没有内部状态变量,我们采用各转换关系的析取式来表示组合关系。
与上节类似,一个具有n个状态元件的异步电路的组合转换关系可表示为
每个子关系满足:
这是由于异步电路的异步性,同一时刻只能发生一次状态转换。
与同步电路的不同:例如一个模型为V={v0,v1},v0’=v0⊕v1,v1’=v0⊕v1;初始状态为v0=1∧v1=1。
若该模型为同步电路:后继状态仅可能为v0=0∧v1=0(两种转换关系同时发生)。
若为异步电路:由于两种转换关系发生前后的不确定性,存在两种后继状态。
(1)v0=1∧v1=0(v0先发生转换)
(2)v0=0∧v1=1(v1先发生转换)
3.6 程序建模
3.6.1 顺序进程
本节主要描述了一个翻译程序C,将顺序程序P的文本转换为表示程序转换集的一阶公式。
方法:给程序每条语句引入出入口标记概念,通过标记转换,将未标记的程序P转换成标记为P’的程序,我们将标记称为程序位置。
常用类型语句标记转换如下(由于一条语句出口即为下一语句入口,标记入口即可):
- 若P不为复合语句(例:P为x := e,skip,wait,lock,unlock等),则P’=P;
- 若P = P1;P2 ,则P’ = P1’ ; L1 : p2’ ;
- 若P = if b then P1 else P2 end if,则P’ = if b then L1 : P1’ else L2 : P2’ end if ;
- 若P = while b do P1 end while,则P’ = while b do L1 : P1 end while ;
以上L为标签项。
在引入翻译程序前,我们先定义几个符号表示:
翻译程序:
程序P的初始状态及公式为:
常见程序翻译过程C(L , P , L’):
- Assignment
C(L, v:= e, L′) ≡ pc = L ∧ pc′ = L′ ∧ v′ = e ∧ same(V∖{v})- Skip
C(L, skip, L′) ≡ pc = L ∧ pc′ = L′ ∧ same(V)- 顺序语句
C(L, P1; L′′: P2, L′) ≡ C(L, P1, L′′) ∨ C(L′′, P2, L′)
注:L’‘为中间标签,P2必须在L’'后执行,即在P1语句后。- 条件语句
C(L, if b then L1: P1 else L2: P2 end if, L′) ≡
(pc = L ∧ pc′ = L1 ∧ b = true ∧ same(V))
∨ (pc = L ∧ pc′ = L2 ∧ b = false ∧ same(V))
∨ C(L1, P1, L′)
∨ C(L2, P2, L′)- while语句
C(L, while b do L1: P1 end while, L′) ≡
(pc = L ∧ pc′ = L1 ∧ b ∧ same(V))
∨ (pc = L ∧ pc′ = L′ ∧ ¬b ∧ same(V))
∨ C(L1, P1, L)(pc值用来保护相应转换的执行)
3.6.2 并发进程建模
并发程序由一组可以并行执行的进程组成,本节考虑异步程序的翻译过程,方法与顺序进程相似。
符号表示:
Vi:过称Pi改变的变量集。
V:所有程序变量集。
pc(i):过程Pi的程序计数器。
PC:所有程序计数器集合。
标签转换实例(与顺序程序类似,出入口有所区别):
翻译程序:
注:第一个析取式为进程初始化;第二个为进程结束;第三个为进程执行。
常用进程同步语句翻译过程(常用于对共享变量的独立访问):
实例:
转换粒度:转换粒度是并发系统建模的一个关键问题,粒度的大小可能会影响模型检测的结果。从程序文本或电路图中提取一阶表示可以视为编译任务,此任务必须考虑如上所述的粒度考虑因素。
例:存在同时执行两个转换的系统,普通表示及汇编语言表示如下;
这两种不同的表示可看成两种不同的粒度。
—若只考虑粗粒度α、β,则由执行顺序可知程序只可能存在两种不同的结果;
—若考虑细粒度,则系统根据每条语句执行的先后可能存在许多的结果。
在系统建模时,若某种情况违背了系统某些属性,但在粗粒度下我们无法检测到这种情况,就会错误的判定系统正确。
3.7 公平
由于我们的模型过度地逼近真实系统的行为,我们有时会向模型添加不需要的行为。有许多方式可以通过给kripke结构添加约束来消除这些行为,公平约束就是其中一种。
形式:公平的kripke结构为六元组M = (S, S0, R, AP, L, F):
- S, S0, R, AP, 和L与普通kripke结构相同
- F ⊆ 2∧S是一组公平约束
设F={F1,F2,…},其中每个Fj是S的子集,设S0,S1,…表示在M中形成路径π的状态。如果沿着π对于每个公平约束Fj∈F有无限多个的si∈Fj,那么路径π称为公平。
注:一般情况下,我们只考虑M中的公平路径。
实例:
给定如图所示的 Kripke 结构,假设我们需要检验:𝑀, s0⊨ 𝑨𝑮(𝑝 → 𝑨𝑭𝑞)。
那么路径𝑠0𝑠1𝑠2𝑠4𝑠2𝑠4⋯则不会满足未来会有一个状态𝑞;而路径𝑠0𝑠1𝑠2𝑠3𝑠2𝑠3⋯则满足该性质。
此时可以发现:在𝑠2产生了一个非确定性的可选下一路径。由于路径𝑠0𝑠1𝑠2𝑠4𝑠2𝑠4⋯的存在,此时我们得到𝑀, s0⊭ 𝑨𝑮(𝑝 → 𝑨𝑭𝑞)。
通常情况下,如果只是在𝑠3上循环,我们认为这样的路径是不公平的。在此基础上,我们加上公平性约束𝐹 = {𝐹1, 𝐹2},其中𝐹1= {𝑆3}𝐹2= {𝑆4}。
此时,我们再次检验性质𝑨𝑮(𝑝 → 𝑨𝑭𝑞)。
由于加上了公平性约束𝐹,由前面的定义可以知道,由于加上了公平性约束,必须保证𝐹1和𝐹2中的状态在公平路径上无限次的出现,即𝑆3和𝑆4必须无限次的出现。此时路径𝑠0𝑠1𝑠2𝑠4𝑠2𝑠4⋯并不会出现。因此我们可以得出𝑀, s0⊨ 𝑨𝑮(𝑝 → 𝑨𝑭𝑞)