形式化方法在逻辑科学中是指分析、研究思维形式结构的方法。它通过严格的 符号系统和 数学模型来描述和验证一个目标系统的行为和特性,包括需求规格、设计和实现等。在面对复杂时序任务时,常见的自然语言在描述任务中可能存在歧义、繁琐导致主要信息弱化等问题,影响对任务的理解,而因为形式化方法所使用的是严格的数学语言,所以它的语法和语义都是无二义的、精确的,能准确描述系统行文和任务目标。
背景
形式化方法的研究最早可追溯到 1949 年,当时图灵在其论文《Checking a large routine》中探讨了程序正确性的问题。自那时起,形式化方法的发展经历了长时间的演进。其核心思想是通过严格的数学推理和符号表示来理解和验证计算系统的行为,从而减少系统设计和实现中的错误和缺陷。主要有以下两个要求:
-
首先,形式化方法涉及建立精确的数学模型来描述系统的结构和行为。这通常包括使用数学逻辑表示系统的状态、转换规则和约束条件等。例如,使用线性时序逻辑、信号时序逻辑和度量时序逻辑来描述系统规范和约束。
-
其次,形式化方法也包括使用数学推理和证明技术来验证系统的性质。这涉及到对系统规范的数学公理进行推理,以证明系统在给定条件下满足某些期望的行为。例如,使用模型检查、定理证明、符号执行等技术来验证系统的功能正确性、安全性和并发性质。
最初的形式化方法起源于计算机系统及软件的规约、设计、验证与演化等行为,但现在学者们发现在控制领域,尤其是针对复杂任务的描述和控制,形式化方法特别有效,所以越来越多的学者开始研究形式化方法在控制领域中的应用。
意义
形式化方法的意义在于它能帮助发现其它方法不容易发现的系统描述的不一致、不明确或不完整,有助于开发人员对系统的理解,因此形式化方法是提高安全攸关系统的安全性与可靠性的重要手段。最早的形式化方法是逻辑与逻辑推理,它的目标是使推理机械化。在理论层面上,这一方法收到很多挑战,比如说逻辑系统的不完备性、逻辑系统的不可判定性、自动推理的难处理性。但是在一些实际应用上,逻辑方法和自动推理还是起着非常大的作用。
主要内容
形式化方法的主要内容分为以下三个步骤:
系统建模:通过构造系统 S S S的模型 M M M来描述系统及其行为模式
在形式化建模阶段,工程师使用建模语言严格地定义了一个系统。建模语言允许用户使用固定的语法从预定义的类型中建立复杂的结构模型。一方面,为了适合验证需要,模型应能捕捉到系统与正确性有关的行为特征;另一方面,为了简化和缩减被检测的系统,不使验证过于复杂,模型抽象时应该去掉一些不影响验证属性正确性的细节。
在计算机领域,常见的模型可以大致分为两种:串行系统和并行系统
- 串行系统:系统的各个模块之间存在执行上存在顺序性,这是一种很常规的系统,具有顺序性、封闭性、可再现性等特点。由于串行系统的顺序性局限,导致现实生活中很少的实用性不高,逐渐被并行系统取代
- 并行系统:若系统内部发生的两个行为之间没有因果、顺序等关系,可以按任意次序发生,则称两个行为是并发的,存在并发行为的系统称为并发系统,具有不确定性和并发性等特点。
并行系统的出现,大大提高了系统运行的效率和能力,但同时也大大增加了系统分析的复杂度。常见的并发系统:- 迁移系统:通过系统的状态集合以及对应状态间变迁的迁移(操作)集合刻画系统的行为模型。
- 自动机:计算机科学中最基本的一类抽象计算模型。有穷自动机是基础,描述有穷状态系统的抽象数学模型。
- Petri网:不了解,有需求自己学习
其实仔细看一下,迁移系统和自动机的形式很像,都有各自的状态集合、迁移动作集合(等价于字母表)、迁移关系(等价于状态迁移函数)、初始状态等等。
形式规约:通过定义系统 S S S必须满足的一些属性 φ \varphi φ,如安全性、活性等描述系统约束
对于任意系统行为,我们首先要明确“做什么”,这就是所谓的需求规约,以一种明晰、简明、一致且无歧义的方式,刻画所需系统中所有重要方面的一组陈述。需求规约至关重要,理想化的目标是无歧义精确表达,常采用三种描述形式
- 非形式化:即为常见的自然语言描述需求规约,快捷方便,但是可能会产生歧义、繁琐或表述不清等问题,例如“一把把把把住了”能理解不😂
- 半形式化
- 形式化:用符号语言描述需求,基本可以做到无歧义,表述清晰,但是需要一定的形式化知识储备,例如 F [ 0 , 10 ] p 1 F_{[0,10]}p_1 F[0,10]p1
形式规约是用具有精确语义的形式化语言描述系统需求,对形式化规约通常要讨论其一致性和完备性等性质。这个形式化规范的过程类似于将一个文字问题转换为代数符号的过程,以一种清晰、简明、一致且无歧义的方式,刻画用户所需系统中的所有重要方面的一组陈述。根据形式规约方法的要求不同,采用不同的形式规约语言,比如线性时序逻辑、信号时序逻辑、度量时序逻辑和计算树逻辑等。
形式验证:证明描述系统 S S S行为的模型M确实满足系统的形式规约 φ \varphi φ
形式验证与形式规约之间具有严密的联系,形式验证就是验证已有的系统是否满足其规约,也是形式化方法所有解决的核心问题,主要方法分为两类:
- 以逻辑推理为基础的演绎验证
演绎证明是逻辑公式描述系统及其性质,通过一些公理或者推理规则来证明系统具有某些性质,其主要方法有自然推演、时序演算等。演绎验证的优点可以验证简单的有穷状态系统,也可以使用归纳法处理无限状态的问题;但不足是不能做到自动化验证,对于复杂系统,推理复杂难以实施。 - 以穷尽搜索为基础的模型检测
模型检测是通过搜索待验证的系统模型的有穷状态空间来检验该系统的行为是否具有预期属性的一种自动验证技术,主要通过自动机方法。模型检测算法的输入包括待验证系统 M M M和待检测属性规约 φ \varphi φ,验证系统 M M M是否满足规约 φ \varphi φ。模型检测的优点是可以自动化验证,并且穷尽搜索可以覆盖所有的结果,保证任务的绝对满足;但不足时穷举的方法消耗资源大,运行时间长。
系统建模
接下来将主要介绍两个系统:迁移系统和自动机。
迁移系统(Transition System)
迁移系统是R. M. Keller最初于1976年提出的一种基于交错并发执行方式的计算模型,也是描述计算机软硬件系统行为的基本抽象模型。迁移系统可以对处于不同情况下的并发系统建模,如可以是在进程完全自动运行的简单情况下,也可以是在进程间以某种方式通信的更现实的环境中。
形式定义
常见迁移系统 T S TS TS的六元组描述形式为 T S = ( S , T , → , I , A P , L ) TS=(S, T, \rightarrow, I, AP, L) TS=(S,T,→,I,AP,L)
- S = { s 0 , s 1 , s 2 , … , s n , … } S =\{s_0, s_1, s_2,\dots, s_n,\dots\} S={ s0,s1,s2,…,sn,…} 表示非空状态集;
- T = { T 0 , T 1 , T 2 , … } T = \{T_0,T_1,T_2,\dots\} T={ T0,T1,T2,…}表示迁移动作集;
- → ⊆ S × T × S \rightarrow \subseteq S\times T\times S →⊆S×T×S 表示迁移关系,如 ( s , τ , s ′ ) ∈ → (s, \tau, s')\in \rightarrow (s,τ,s′)∈→,也可用 s → τ s ′ s \stackrel{\tau}{\rightarrow} s' s→τs′或 ρ τ ( s , s ′ ) \rho_{\tau} (s, s') ρτ(s,s′)表示;
- I ⊆ S I\subseteq S I⊆S 表示初始状态集;
- A P = { a , b , c , … } AP = \{a, b, c, \dots\} AP={ a,b,c,…} 表示原子命题集;
- L : S → 2 A P L: S\rightarrow 2^{AP} L:S→2AP称为标签函数。
如果 S S S、 T T T 和 A P AP AP 都是有穷集,那么称 T S TS TS 是有穷迁移系统。
一个迁移系统的直观行为描述如下:系统始于一些初始状态 s 0 ∈ I s_0 \in I s0∈I,通过迁移关系 → \rightarrow → 发生状态转变。也就是说,如果 s s s 是当前状态,那么源于 s s s 的迁移 s ⟶ τ s ′ s \stackrel{\tau}{\longrightarrow} s' s⟶τs′ 被不确定地选择并且执行,即执行迁移动作 τ \tau τ,并且系统从状态 s s s 迁移到状态 s ′ s' s′ 。这个选择过程会在状态 s ′ s' s′ 重复并且终止于一个没有出迁移的状态(需要注意的是, I I I 可以为空,在这种情形下,迁移系统由于没有初始状态可以选择,不产生任何行为)。更重要的是当一个状态有多个出迁移时,下一个迁移的选择完全是非确定的,也就是这个选择过程的结果是不可以推理得到的,并且也无法知道某个迁移被选择的可能性有多大。类似地,当初始状态集由多个状态组成时,开始状态的选择也是不确定的。
标签函数 L L L 将原子命题的一个集合 L ( s ) ∈ 2 A P L(s) \in 2^{AP} L(s)∈2AP 与状态 s s s 联系起来。 L ( s ) = { a ∣ a ∈ A P L(s)=\{a|a \in AP L(s)={ a∣a∈AP 且 a a a 完全满足状态 s } s\} s},假设 φ \varphi φ 是一个命题逻辑公式,如果 L ( s ) L(s) L(s) 使得公式 φ \varphi φ 为真,那么可以推导 s s s 满足公式 φ \varphi φ,则可以表示为
s ⊨ φ iff L ( s ) ⊨ φ s \vDash \varphi \quad \text{iff} \quad L(s) \vDash \varphi s⊨φiffL(s)⊨φ
迁移图
迁移图时L/Lamport于1983年提出的一种表示并发程序的图形化建模方法,是有向图。
自动机
有穷自动机
有穷自动机是一个五元组 M = ( Q , Σ , δ , q 0 , F ) M=(Q,\Sigma,\delta,q_0,F) M=(Q,Σ,δ,q0,F)
- Q = { q 0 , q 1 , q 2 , ⋯ , q n } Q = \{q_0,q_1,q_2,\cdots,q_n\} Q={ q0,q1,q2,⋯,qn} 是非空有穷状态集,每个 q ∈ Q q\in Q q∈Q 称为 M M M 的一个状态;
- Σ = { a , b , c , ⋯ } \Sigma = \{a,b,c,\cdots\} Σ={ a,b,c,⋯} 是输入字母表;
- q 0 ∈ Q q_0\in Q q0∈Q 是 M M M 的初始状态(Initial State),也称开始状态或者启动状态;
- δ : Q × Σ → Q \delta:Q\times\Sigma\rightarrow Q δ:Q×Σ→Q 称为状态迁移函数(Transition Function),有时候又称为状态转换函数或者移动函数,对 ∀ ( q , a ) ∈ Q × Σ \forall (q,a)\in Q\times\Sigma ∀(q,a)∈Q×Σ, δ ( q , a ) = p \delta(q,a)=p δ(q,a)=p 表示:自动机 M M M 在状态 q q q 读入字符 a a a,将状态变成 p p p;
- F ⊆ Q F\subseteq Q F⊆Q 是 M M M 的终止状态集。 ∀ q ∈ F \forall q\in F ∀q∈F, q q q 称为 M M M 的终止状态,又称为接受状态(Accept State);
有穷状态系统具有以下几个主要特点:
(1)系统具有有限个状态,不同的状态代表不同的意义。按照实际的需要,系统可以在不同的状态下完成规定的任务。
(2)将输入字符串中出现的字符汇集在一起构成一个字母表。系统处理的所有字符串都是由字母表上的字符组成的字符串。
(3)系统在任何一个状态下,从输入字符串中读入一个字符,根据当前状态和读入的这个字符转到新的状态。
(4)系统中包含一个初始状态。
(5)系统中还有一些状态表示它到目前为止所读入的字符构成的字符串是语言的一个句子。
Büchi 自动机(Büchi Automaton)
有穷自动机主要讨论有穷状态系统的输入是有限长度字符串的情形,但是某些系统的运行往往是不可终止的,需要考虑输入时无限长度字符串的情况,因此要关注无穷字符串上的有穷自动机。
设 Σ \Sigma Σ 是有穷字母表,由 Σ \Sigma Σ 中的字母组成的无穷序列,称为 Σ \Sigma Σ 上的 ω − \omega^- ω−串。用 Σ ω \Sigma^{\omega} Σω 表示 Σ \Sigma Σ 上的所有 ω − \omega^- ω−串组成的集合。 Σ ω \Sigma^{\omega} Σω 的任意子集称为 Σ \Sigma Σ 上的 ω − \omega^- ω−语言。作为一种 ω − \omega^- ω−语言的识别模型, ω − \omega^- ω−有穷自动机最早是 J. R. Büchi 于 1960 年提出的,是一种在无穷串上执行的有穷自动机。与有穷自动机不同, ω − \omega^- ω−有穷自动机的输入是一个无穷字符序列。 ω − \omega^- ω−自动机提供了一种有穷的方式来表示去穷的志雄,并且拥有一个用穷的结构。
Büchi 自动机是最简单的一类 ω − \omega^- ω−自动机,是有穷自动机在输入状态无限时的一种扩充。
Büchi 自动机是一个五元组 M = ( Q , Σ , Δ , S , F ) M = (Q, \Sigma, \Delta, S, F) M=(Q,Σ,Δ,S,F)
- Q Q Q:状态的非空有穷集合;
- Σ \Sigma Σ:为有穷字母表;
- Δ ⊆ Q × Σ × Q \Delta \subseteq Q \times \Sigma \times Q Δ⊆Q×Σ×Q,是状态迁移关系;
- S ⊆ Q S \subseteq Q S⊆Q 是初始状态集合;
- F ⊆ Q F \subseteq Q F⊆Q 是接受状态集合。
形式规约
这里主要介绍时序逻辑(Temporal Logic)
模态逻辑作为一种非经典逻辑,通过引入“必然”和“可能”两个模态算子,对经典一阶逻辑进行了扩充。而时序逻辑则是在模态逻辑的基础上,巧妙地融入了时间因素,将“必然”解释为“将来永远”,“可能”解释为“将来会”,做了进一步补充。
常见的时序逻辑有以下三种:线性时序逻辑、分支时序逻辑、信号时序逻辑。
线性时序逻辑(Linear Temporal Logic, LTL)
线性时序逻辑(LTL)将时间视为一条线性的、离散的序列 δ : s 0 , s 1 , s 2 ,