程序验证(八):形式语义
语义描述方法
如下:
- 操作语义:用抽象机描述程序执行引起的状态改变,关心状态改变是怎样产生的,与语言的实现关系紧密。
- 指称语义:使程序执行的效果对应数学对象,只关心程序执行的效果,不关心其是怎样产生的。
- 公理语义:将程序的语义性质表示为命题,采用数理逻辑的方法研究。
引入玩具语言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}