《形式语义学引论(第二版)》:
亦写作
这里(L→R)表示南集合L至集合R的全体函数组成的函数空问。在语义学中,通常采用花体字表示语言成分的语义函数,而将语言成分用双重括号括起,故给定一个布尔表达式B,有
对给定的状态s,又有
即对给定的布尔表达式B和状态s,由可得到B在状态s下所取的布尔值。
以上这些记号法在《形式语义学引论(第二版)》中将不断使用,不再一一说明。使用语义函数历及上述记号布尔表达式求值的转移规则可定义如下:
即抽象机按照对给定B及s求出布尔值,并将其存入栈区。
由于FLOW语言中没有算术表达式,故算术表达式的求值规则不必在此讨论。
C.执行
下列各规则中或者(表示空序列,在不致引起混淆时,《形式语义学引论(第二版)》中亦用来表示空集合)。
(1)
即执行skip不导致st和s的改变,但导致抽象机转向执行其后继部分c’。当c中内容非空时,c应以顺序算子“;”为起始跟以后继部分c’,故;当c中内容为空时,其后继部分亦为空,故。
(2)
这里。名代表原子语句的语义函数,如一样,此处作为预先假定的。原子语句设想为赋值语句,它按照程序变元的当前值求出表达式值,再改变被赋程序变元的值。故假定其语义为状态空间至状态空间的一个函数,即
(3)
(4)
这两条规则是说,在求出布尔表达式值后条件语句的执行导致抽象机选择相应的分语句,并转向执行该分语句。对于循环语句亦有两条类似的规则。
(5)
(6)
其中,S2为skip,S1为S;(while B do S)。
至此,我们定义了解释执行FLOW程序的一个抽象机,也就给出了FLOW语言的一种操作语义。而以AFLOW中的一个程序为例,在假定,和通常理解一致的前提下,看其操作语义是否与通常理解亦一致。
例 计算x!的程序FAC。
FAC中只有程序变元x,y和z,设State为非负整数二元组的集合。在x,y和z的初始值分别为2,0,0时解释执行FAC程序形成的大状态转移序列如下,其中转移号上标以此转移所依据的规则号,而用到的函数假设为:
这里为非负减,即
上述转移序列表明,只要符合通常的理解,在x的初值为2时执行FAC,程序可以终止,终止时变元y处存有所求的阶乘值2。
……
展开