本文主要是介绍程序验证(八):形式语义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
程序验证(八):形式语义
语义描述方法
如下:
- 操作语义:用抽象机描述程序执行引起的状态改变,关心状态改变是怎样产生的,与语言的实现关系紧密。
- 指称语义:使程序执行的效果对应数学对象,只关心程序执行的效果,不关心其是怎样产生的。
- 公理语义:将程序的语义性质表示为命题,采用数理逻辑的方法研究。
引入玩具语言Imp
语法范畴
如下:
- 数字集 N u m Num Num,用 n n n表示数字
- 变元集 V a r Var Var,用 x x x表示变元
- 算术表达式集 A e x p Aexp Aexp,用 a a a表示算术表达式
- 布尔表达式集 B e x p Bexp Bexp,用 b b b表示布尔表达式
- 语句集 C o m Com Com,用 c c c表示语句
语法
如下:
a ∈ A E x p : : = n ∈ Z ∣ x ∈ V a r ∣ a 1 + a 2 ∣ a 1 ∗ a 2 ∣ a 1 − a 2 a\in AExp::=n\in \mathbb{Z} |x\in Var|a_1+a_2|a_1*a_2|a_1-a_2 a∈AExp::=n∈Z∣x∈Var∣a1+a2∣a1∗a2∣a1−a2
b ∈ B E x p : : = t r u e ∣ f a l s e ∣ a 1 = a 2 ∣ a 1 ≤ a 2 ∣ ¬ b ∣ b 1 ∧ b 2 b\in BExp::=\mathbf{true}|\mathbf{false}|a_1=a_2|a_1\le a_2|\neg b|b_1\wedge b_2 b∈BExp::=true∣false∣a1=a2∣a1≤a2∣¬b∣b1∧b2
c ∈ C o m : : = s k i p ∣ x : = a ∣ c 1 ; c 2 ∣ i f b t h e n c 1 e l s e c 2 ∣ w h i l e b d o c c\in Com::=\mathbf{skip}|x:=a|c_1;c_2|\mathbf{if}~b~\mathbf{then}~c_1~\mathbf{else}~c_2|\mathbf{while}~b~\mathbf{do}~c c∈Com::=skip∣x:=a∣c1;c2∣if b then c1 else c2∣while b do c
表达式语义
表达式的语义
采用二进制 n : : = 0 ∣ 1 ∣ n 0 ∣ n 1 n::=0|1|n0|n1 n::=0∣1∣n0∣n1
语义函数 N : N u m → Z N: Num\to\mathbb{Z} N:Num→Z
- N [ 0 ] = 0 N[0]=0 N[0]=0
- N [ 1 ] = 1 N[1]=1 N[1]=1
- N [ n 0 ] = 2 ∗ N [ 0 ] N[n0]=2*N[0] N[n0]=2∗N[0]
- N [ n 1 ] = 2 ∗ N [ n ] + 1 N[n1]=2*N[n]+1 N[n1]=2∗N[n]+1
状态
环境是从变元集到整数集的函数 E n v = V a r → Z Env=Var\to \mathbb{Z} Env=Var→Z
- 如 σ = [ x ↦ 5 , y ↦ 7 , z ↦ 0 ] \sigma = [x\mapsto 5,y\mapsto 7,z\mapsto 0] σ=[x↦5,y↦7,z↦0],即 σ x = 5 , σ y = 7 , σ z = 0 \sigma x=5,\sigma y=7,\sigma z=0 σx=5,σy=7,σz=0
- 设 σ ′ = σ [ x ↦ 7 ] \sigma' =\sigma [x\mapsto 7] σ′=σ[x↦7],则 σ ′ x = 7 \sigma' x=7 σ′x=7,对于不同于 x x x的变元 y y y, σ ′ y = σ y \sigma' y=\sigma y σ′y=σy
状态是一个二元组 ⟨ c , σ ⟩ \langle c,\sigma\rangle ⟨c,σ⟩,其中 σ \sigma σ是当前变量的赋值, c c c为下一条被执行的语句。
算术表达式的语义
语义函数 A : A e x p → ( E n v → Z ) A: Aexp\to (Env\to \mathbb{Z}) A:Aexp→(Env→Z):
- A [ n ] σ = N [ n ] A[n]\sigma = N[n] A[n]σ=N[n]
- A [ x ] σ = σ x A[x]\sigma = \sigma x A[x]σ=σx
- A [ a 1 + a 2 ] σ = A [ a 1 ] σ + A [ a 2 ] σ A[a_1+a_2]\sigma = A[a_1]\sigma +A[a_2]\sigma A[a1+a2]σ=A[a1]σ+A[a2]σ
- A [ a 1 ∗ a 2 ] σ = A [ a 1 ] σ ∗ A [ a 2 ] σ A[a_1*a_2]\sigma = A[a_1]\sigma *A[a_2]\sigma A[a1∗a2]σ=A[a1]σ∗A[a2]σ
- A [ a 1 − a 2 ] σ = A [ a 1 ] σ − A [ a 2 ] σ A[a_1-a_2]\sigma = A[a_1]\sigma -A[a_2]\sigma A[a1−a2]σ=A[a1]σ−A[a2]σ
布尔表达式的语义
语义函数 B : B e x p → ( E n v → T ) B:Bexp\to (Env\to T) B:Bexp→(Env→T):
- B [ t r u e ] σ = t r u e B[true]\sigma = \mathbf{true} B[true]σ=true
- B [ f a l s e ] σ = f a l s e B[false]\sigma = \mathbf{false} B[false]σ=false
- B [ a 1 = a 2 ] σ = A [ a 1 ] σ = A [ a 2 ] σ B[a_1=a_2]\sigma = A[a_1]\sigma = A[a_2]\sigma B[a1=a2]σ=A[a1]σ=A[a2]σ
- B [ a 1 ≤ a 2 ] σ = A [ a 1 ] σ ≤ A [ a 2 ] σ B[a_1\le a_2]\sigma = A[a_1]\sigma\le A[a_2]\sigma B[a1≤a2]σ=A[a1]σ≤A[a2]σ
- B [ ¬ b ] σ = ¬ B [ b ] σ B[\neg b]\sigma = \neg B[b]\sigma B[¬b]σ=¬B[b]σ
- B [ b 1 ∧ b 2 ] σ = B [ b 1 ] σ ∧ B [ b 2 ] σ B[b_1\wedge b_2]\sigma = B[b_1]\sigma\wedge B[b_2]\sigma B[b1∧b2]σ=B[b1]σ∧B[b2]σ
举例
在环境 σ = [ x ↦ 1 , y ↦ 3 ] \sigma = [x\mapsto 1,y\mapsto 3] σ=[x↦1,y↦3]下计算表达式 ( x + 2 ) ∗ y (x+2)*y (x+2)∗y的值
A [ ( x + 2 ) ∗ y ] σ = A [ ( x + 2 ) ] σ ∗ A [ y ] σ = ( A [ x ] σ + A [ 2 ] σ ) ∗ A [ y ] σ = ( 1 + 2 ) ∗ 3 = 9 A[(x+2)*y]\sigma =A[(x+2)]\sigma * A[y]\sigma = (A[x]\sigma +A[2]\sigma) * A[y]\sigma =(1+2)* 3 = 9 A[(x+2)∗y]σ=A[(x+2)]σ∗A[y]σ=(A[x]σ+A[2]σ)∗A[y]σ=(1+2)∗3=9
代入
用算术表达式 a 0 a_0 a0替换算术表达式 a a a中变元 y y y的所有出现得到的算术表达式记为 a [ y ↦ a 0 ] a[y\mapsto a_0] a[y↦a0]
A [ a [ y ↦ a 0 ] ] σ = A [ a ] ( σ [ y ↦ A [ a 0 ] σ ] ) A[a[y\mapsto a_0]]\sigma = A[a](\sigma [y\mapsto A[a_0]\sigma ]) A[a[y↦a0]]σ=A[a](σ[y↦A[a0]σ])
用算术表达式 a 0 a_0 a0替换布尔表达式 b b b中变元 y y y的所有出现得到的布尔表达式记为 b [ y ↦ a 0 ] b[y\mapsto a_0] b[y↦a0]
B [ b [ y ↦ a 0 ] ] σ = B [ b ] ( σ [ y ↦ A [ a 0 ] σ ] ) B[b[y\mapsto a_0]]\sigma = B[b](\sigma [y\mapsto A[a_0]\sigma]) B[b[y↦a0]]σ=B[b](σ[y↦A[a0]σ])
操作语义
概念
包括以下两种:
- 结构操作语义(小步操作语义):描述执行语句的各步计算如何发生
- 自然语义(大步操作语义):描述如何得到语句执行终止的最终状态
结构操作语义
结构操作语义强调计算的具体步骤,基于状态之间的迁移关系 → \to →来定义,即
⟨ c , σ ⟩ → ⟨ c ′ , σ ′ ⟩ \langle c,\sigma\rangle\to\langle c',\sigma'\rangle ⟨c,σ⟩→⟨c′,σ′⟩
意义:语句 c c c从环境 σ \sigma σ执行到中途,这时环境为 σ ′ \sigma' σ′,待执行的语句为 c ′ c' c′
反复应用上面的迁移关系,直至程序终止状态 ⟨ s k i p , σ ⟩ \langle \mathbf{skip},\sigma\rangle ⟨skip,σ⟩
若无状态 ⟨ c ′ , σ ′ ⟩ \langle c',\sigma'\rangle ⟨c′,σ′⟩使得 ⟨ c , σ ⟩ → ⟨ c ′ , σ ′ ⟩ \langle c,\sigma\rangle \to\langle c',\sigma'\rangle ⟨c,σ⟩→⟨c′,σ′⟩,则称 ⟨ c , σ ⟩ \langle c,\sigma\rangle ⟨c,σ⟩是呆滞的(stuck)
Imp的结构操作语义
A s g n : ⟨ x : = a , σ ⟩ → ⟨ s k i p , σ [ x ↦ A [ a ] σ ] ⟩ Asgn:\frac{}{\langle x:=a,\sigma\rangle\to\langle \mathbf{skip},\sigma [x\mapsto A[a]\sigma]\rangle} Asgn:⟨x:=a,σ⟩→⟨skip,σ[x↦A[a]σ]⟩
S k i p : n o r u l e Skip:no~rule Skip:no rule
S e q 1 : ⟨ c 1 , σ ⟩ → ⟨ c 1 ′ , σ 1 ′ ⟩ ⟨ c 1 ; c 2 , σ ⟩ → ⟨ c 1 ′ ; c 2 , σ ′ ⟩ Seq1:\frac{\langle c_1,\sigma\rangle\to\langle c'_1,\sigma'_1\rangle}{\langle c_1;c_2,\sigma\rangle\to\langle c'_1;c_2,\sigma'\rangle} Seq1:⟨c1;c2,σ⟩→⟨c1′;c2,σ′⟩⟨c1,σ⟩→⟨c1′,σ1′⟩
S e q 2 : ⟨ s k i p ; c , σ ⟩ → ⟨ c , σ ⟩ Seq2:\frac{}{\langle \mathbf{skip};c,\sigma\rangle\to\langle c,\sigma\rangle} Seq2:⟨skip;c,σ⟩→⟨c,σ⟩
I f T r u e : ⟨ i f b t h e n c 1 e l s e c 2 , σ ⟩ → ⟨ c 1 , σ ⟩ IfTrue:\frac{}{\langle\mathbf{if}~b~\mathbf{then}~c_1~\mathbf{else}~c_2,\sigma\rangle\to\langle c_1,\sigma\rangle} IfTrue:⟨if b then c1 else c2,σ⟩→⟨c1,σ⟩
I f F a l s e : ⟨ i f b t h e n c 1 e l s e c 2 , σ ⟩ → ⟨ c 2 , σ ⟩ IfFalse:\frac{}{\langle \mathbf{if}~b~\mathbf{then}~c_1~\mathbf{else}~c_2,\sigma\rangle\to \langle c_2,\sigma\rangle} IfFalse:⟨if b then c1 else c2,σ⟩→⟨c2,σ⟩
W h i l e : ⟨ w h i l e b d o c , σ ⟩ → ⟨ i f b t h e n ( c ; w h i l e b d o c ) e l s e s k i p , σ While:\frac{}{\langle \mathbf{while}~b~\mathbf{do}~c,\sigma\rangle\to\langle\mathbf{if}~b~\mathbf{then}(c;\mathbf{while}~b~\mathbf{do}~c)\mathbf{else}~\mathbf{skip},\sigma} While:⟨while b do c,σ⟩→⟨if b then(c;while b do c)else skip,σ
推导序列
语句 c c c从环境 σ \sigma σ开始的推导序列有以下两种形式(记 γ 0 = ⟨ c , σ ⟩ \gamma_0=\langle c,\sigma\rangle γ0=⟨c,σ⟩):
- 有限状态序列 γ 0 , γ 1 , … , γ k \gamma_0,\gamma_1,\dots ,\gamma_k γ0,γ1,…,γk,其中 γ 0 → γ 1 , … , γ k − 1 → γ k \gamma_0\to \gamma_1,\dots,\gamma_{k-1}\to \gamma_k γ0→γ1,…,γk−1→γk可以推导得出。 γ k \gamma_k γk的形式为 ⟨ s k i p , σ ′ ⟩ \langle\mathbf{skip},\sigma' \rangle ⟨skip,σ′⟩或者 γ k \gamma_k γk是呆滞的。
- 无限状态序列 γ 0 , γ 1 , … \gamma_0,\gamma_1,\dots γ0,γ1,…,其中 γ 0 → γ 1 \gamma_0\to \gamma_1 γ0→γ1, γ 1 → γ 2 \gamma_1\to\gamma_2 γ1→γ2等可以推导得到。
- 将 γ 0 → γ 1 → ⋯ → γ k \gamma_0\to \gamma_1\to\dots\to\gamma_k γ0→γ1→⋯→γk简记为 γ 0 → ∗ γ k \gamma_0 \to ^{*}\gamma_k γ0→∗γk
确定性
结构操作语义具有确定性:对于任意语句 c c c,从任意环境 σ \sigma σ出发,只要 ⟨ c , σ ⟩ → ⟨ c ′ , σ ′ ⟩ \langle c,\sigma\rangle\to\langle c',\sigma'\rangle ⟨c,σ⟩→⟨c′,σ′⟩且 ⟨ c , σ ⟩ → ⟨ c ′ ′ , σ ′ ′ ⟩ \langle c,\sigma\rangle\to\langle c'',\sigma''\rangle ⟨c,σ⟩→⟨c′′,σ′′⟩,就有 c ′ = c ′ ′ , σ ′ = σ ′ ′ c'=c'',\sigma'=\sigma'' c′=c′′,σ′=σ′′
终止和循环
若存在从状态 ⟨ c , σ ⟩ \langle c,\sigma\rangle ⟨c,σ⟩开始的有限推导序列,则称语句 c c c从环境 σ \sigma σ执行是终止的。
若存在从状态 ⟨ c , σ ⟩ \langle c,\sigma\rangle ⟨c,σ⟩开始的无限推导序列,则称语句 c c c从环境 σ \sigma σ执行是循环的。
若语句 c c c从每个环境执行都是终止的,则称语句 c c c总是终止的。
若语句 c c c从每个环境执行都是循环的,则称语句 c c c总是循环的。
语义等价
如果对于任意状态 σ \sigma σ,满足下列条件:
- 对于任意终止或呆滞格局 ⟨ c ′ , σ ′ ⟩ \langle c',\sigma'\rangle ⟨c′,σ′⟩, ⟨ c 1 , σ ⟩ → ∗ ⟨ c ′ , σ ′ ⟩ \langle c_1,\sigma\rangle\to^{*}\langle c',\sigma'\rangle ⟨c1,σ⟩→∗⟨c′,σ′⟩,当且仅当 ⟨ c 2 , σ ⟩ → ∗ ⟨ c ′ , σ ′ ⟩ \langle c_2,\sigma\rangle\to^{*}\langle c',\sigma'\rangle ⟨c2,σ⟩→∗⟨c′,σ′⟩
- 存在从 ⟨ c 1 , σ ⟩ \langle c_1,\sigma\rangle ⟨c1,σ⟩开始的无限推导序列当且仅当存在从 ⟨ c 2 , σ ⟩ \langle c_2,\sigma\rangle ⟨c2,σ⟩开始的无限推导序列
则称语句 c 1 c_1 c1和 c 2 c_2 c2是语义等价的,如语句 c 1 ; ( c 2 ; c 3 ) c_1;(c_2;c_3) c1;(c2;c3)和语句 ( c 1 ; c 2 ) ; c 3 (c_1;c_2);c_3 (c1;c2);c3是语义等价的。
语义函数
可将语句 c c c的意义概括为从 E n v Env Env到 E n v Env Env的部分函数:
S S O S : C m d → ( E n v ↪ E n v ) S_{SOS} : Cmd\to(Env\hookrightarrow Env) SSOS:Cmd→(Env↪Env)
定义 S S O S [ c ] σ = { σ ′ i f ⟨ c , σ ⟩ → ∗ ⟨ s k i p , σ ′ ⟩ u n d e f o t h e r w i s e S_{SOS}[c]\sigma = \begin{cases}\sigma' &if~\langle c,\sigma\rangle\to ^{*}\langle\mathbf{skip}, \sigma'\rangle \\ undef & otherwise \end{cases} SSOS[c]σ={σ′undefif ⟨c,σ⟩→∗⟨skip,σ′⟩otherwise
例如, S S O S [ w h i l e t r u e d o s k i p ] σ = u n d e f S_{SOS}[\mathbf{while}~\mathbf{true}~\mathbf{do}~\mathbf{skip}]\sigma = undef SSOS[while true do skip]σ=undef
自然语义
自然语义关心语句执行对环境的改变。
从环境 σ \sigma σ执行语句 c c c将终止于环境 σ ′ \sigma' σ′:
⟨ c , σ ⟩ ⇓ σ ′ \langle c,\sigma\rangle\Downarrow \sigma' ⟨c,σ⟩⇓σ′
规则的一般形式:
⟨ c 1 , σ 1 ⟩ ⇓ σ ′ , … , ⟨ c n , σ n ⟩ ⇓ σ n ′ ⟨ c , σ ⟩ ⇓ σ ′ i f … \frac{\langle c_1,\sigma_1\rangle \Downarrow \sigma',\dots ,\langle c_n,\sigma_n\rangle\Downarrow \sigma'_n}{\langle c,\sigma\rangle \Downarrow \sigma'}if\dots ⟨c,σ⟩⇓σ′⟨c1,σ1⟩⇓σ′,…,⟨cn,σn⟩⇓σn′if…
Imp的自然语义
B i g A s g n : ⟨ x : = a , σ ⟩ ⇓ σ [ x → A [ a ] σ ] BigAsgn: \frac{}{\langle x:=a,\sigma\rangle \Downarrow \sigma [x\to A[a]\sigma]} BigAsgn:⟨x:=a,σ⟩⇓σ[x→A[a]σ]
B i g S k i p : ⟨ s k i p , σ ⟩ ⇓ σ BigSkip: \frac{}{\langle \mathbf{skip},\sigma\rangle\Downarrow \sigma} BigSkip:⟨skip,σ⟩⇓σ
B i g S e q : ⟨ c 1 , σ 1 ⟩ ⇓ σ 1 ′ ⟨ c 2 , σ 1 ′ ⟩ ⇓ σ 2 ⟨ c 1 ; c 2 , σ 1 ⟩ ⇓ σ 2 BigSeq: \frac{\langle c_1,\sigma_1\rangle\Downarrow \sigma'_1~\langle c_2,\sigma'_1\rangle\Downarrow \sigma_2}{\langle c_1;c_2,\sigma_1\rangle\Downarrow \sigma_2} BigSeq:⟨c1;c2,σ1⟩⇓σ2⟨c1,σ1⟩⇓σ1′ ⟨c2,σ1′⟩⇓σ2
B i g I f T : ⟨ c 1 , σ ⟩ ⇓ σ ′ ⟨ i f b t h e n c 1 e l s e c 2 , σ ⟩ ⇓ σ ′ i f B [ b ] σ = t r u e BigIfT: \frac{\langle c_1,\sigma\rangle \Downarrow \sigma'}{\langle \mathbf{if}~b~\mathbf{then}~c_1~\mathbf{else}~c_2, \sigma\rangle\Downarrow \sigma'} if~B[b]\sigma=\mathbf{true} BigIfT:⟨if b then c1 else c2,σ⟩⇓σ′⟨c1,σ⟩⇓σ′if B[b]σ=true
B i g I f F : ⟨ c 2 , σ ⟩ ⇓ σ ′ ⟨ i f b t h e n c 1 e l s e c 2 , σ ⟩ ⇓ σ ′ i f B [ b ] σ = f a l s e BigIfF: \frac{\langle c_2,\sigma\rangle \Downarrow\sigma'}{\langle\mathbf{if}~b~\mathbf{then}~c_1~\mathbf{else}~c_2,\sigma\rangle\Downarrow\sigma'} if~B[b]\sigma=\mathbf{false} BigIfF:⟨if b then c1 else c2,σ⟩⇓σ′⟨c2,σ⟩⇓σ′if B[b]σ=false
B i g W h i l e F a l s e : ⟨ w h i l e b d o c , σ ⟩ ⇓ σ i f B [ b ] σ = f a l s e BigWhileFalse: \frac{}{\langle\mathbf{while}~b~\mathbf{do}~c,\sigma\rangle\Downarrow\sigma} if~B[b]\sigma=\mathbf{false} BigWhileFalse:⟨while b do c,σ⟩⇓σif B[b]σ=false
B i g W h i l e T r u e ⟨ c , σ ⟩ ⇓ σ ′ ⟨ w h i l e b d o c , σ ′ ⟩ ⇓ σ ′ ′ ⟨ w h i l e b d o c , σ ⟩ ⇓ σ ′ ′ i f B [ b ] σ = t r u e BigWhileTrue \frac{\langle c,\sigma\rangle \Downarrow \sigma'~\langle\mathbf{while}~b~\mathbf{do}~c,\sigma'\rangle\Downarrow \sigma''}{\langle\mathbf{while}~b~\mathbf{do}~c,\sigma\rangle\Downarrow \sigma''} if~B[b]\sigma = \mathbf{true} BigWhileTrue⟨while b do c,σ⟩⇓σ′′⟨c,σ⟩⇓σ′ ⟨while b do c,σ′⟩⇓σ′′if B[b]σ=true
每个规则有若干前提和一个结论。称有0个前提的规则为公理,如BigAsgn, BigSkip, BigWhileFalse是公理。
当使用公理和规则得出 ⟨ c , σ ⟩ ⇓ σ ′ \langle c,\sigma\rangle\Downarrow \sigma' ⟨c,σ⟩⇓σ′时,就得到一推导树,树根是 ⟨ c , σ ⟩ ⇓ σ ′ \langle c,\sigma\rangle\Downarrow \sigma' ⟨c,σ⟩⇓σ′,树叶是公理,每个分支点是某规则的结论,而它的儿子是该规则的前提。
终止和循环
若存在环境 σ ′ \sigma' σ′使得 ⟨ c , σ ⟩ ⇓ σ ′ \langle c,\sigma\rangle\Downarrow\sigma' ⟨c,σ⟩⇓σ′,则称语句 c c c从环境 σ \sigma σ执行是终止的。
若不存在环境 σ ′ \sigma' σ′使得 ⟨ c , σ ⟩ ⇓ σ ′ \langle c,\sigma\rangle\Downarrow \sigma' ⟨c,σ⟩⇓σ′,则称语句 c c c从环境 σ \sigma σ执行是循环的。
若语句 c c c从每个环境执行都是终止的,则称语句 c c c总是终止的。
若语句 c c c从每个环境执行都是循环的,则称语句 c c c总是循环的。
语义等价
如果对于任意环境 σ \sigma σ和 σ ′ \sigma' σ′:
⟨ c 0 , σ ⟩ ⇓ σ ′ ⇔ ⟨ c 1 , σ ⟩ ⇓ σ ′ \langle c_0,\sigma\rangle\Downarrow\sigma' \Leftrightarrow \langle c_1,\sigma\rangle\Downarrow \sigma' ⟨c0,σ⟩⇓σ′⇔⟨c1,σ⟩⇓σ′
则称语句 c 0 c_0 c0和 c 1 c_1 c1是语义等价的。
确定性
自然语义具有确定性:对于任意语句 c c c,和任意环境 σ 1 , σ 2 , σ \sigma_1,\sigma_2,\sigma σ1,σ2,σ,只要 ⟨ c , σ ⟩ ⇓ σ 1 \langle c,\sigma \rangle\Downarrow \sigma_1 ⟨c,σ⟩⇓σ1且 ⟨ c , σ ⟩ ⇓ σ 2 \langle c,\sigma\rangle\Downarrow \sigma_2 ⟨c,σ⟩⇓σ2,就有 σ 1 = σ 2 \sigma_1=\sigma_2 σ1=σ2,即
∀ σ , σ 1 , σ 2 , c . ( ⟨ c , σ ⟩ ⇓ σ 1 ∧ ⟨ c , σ ⟩ ⇓ σ 2 ) → ( σ 1 = σ 2 ) \forall \sigma,\sigma_1,\sigma_2,c.(\langle c,\sigma\rangle\Downarrow\sigma_1\wedge\langle c,\sigma\rangle\Downarrow\sigma_2)\to (\sigma_1 =\sigma_2) ∀σ,σ1,σ2,c.(⟨c,σ⟩⇓σ1∧⟨c,σ⟩⇓σ2)→(σ1=σ2)
语义函数
可将语句 c c c的意义概括为从 F n v Fnv Fnv到 E n v Env Env的部分函数:
S n s : C m d → ( E n v ↪ E n v ) S_{ns}: Cmd\to (Env\hookrightarrow Env) Sns:Cmd→(Env↪Env)
定义 S n s [ c ] σ = { σ ′ i f ⟨ c , σ ⟩ ⇓ σ ′ u n d e f o t h e r w i s e S_{ns}[c]\sigma =\begin{cases} \sigma' &if~\langle c,\sigma\rangle\Downarrow\sigma'\\undef & otherwise\end{cases} Sns[c]σ={σ′undefif ⟨c,σ⟩⇓σ′otherwise
两种语义的对比
等价性
对于语言Imp的每个语句 c c c,任意环境 σ \sigma σ和 σ ′ \sigma' σ′,若 ⟨ c , σ ⟩ ⇓ σ ′ \langle c,\sigma\rangle\Downarrow \sigma' ⟨c,σ⟩⇓σ′,则 ⟨ c , σ ⟩ → ∗ ⟨ s k i p , σ ′ ⟩ \langle c,\sigma\rangle\to^{*}\langle\mathbf{skip},\sigma'\rangle ⟨c,σ⟩→∗⟨skip,σ′⟩
对于语言Imp的每个语句 c c c,任意环境 σ \sigma σ和 σ ′ \sigma' σ′,若 ⟨ c , σ ⟩ → k ⟨ s k i p , σ ′ ⟩ \langle c,\sigma\rangle\to^k\langle\mathbf{skip},\sigma'\rangle ⟨c,σ⟩→k⟨skip,σ′⟩,则 ⟨ c , σ ⟩ ⇓ σ ′ \langle c,\sigma\rangle\Downarrow\sigma' ⟨c,σ⟩⇓σ′
对于语言Imp的每个语句 c c c,
S n s [ c ] = S S O S [ c ] S_{ns}[c]=S_{SOS}[c] Sns[c]=SSOS[c]
这篇关于程序验证(八):形式语义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!