代数语义学
代数语义学是形式语义学的一个分支,是用代数方法研究计算机语言的语义。始于对抽象数据类型的研究,数据类型是计算机语言中的重要组成部分。用代数结构描述数据类型的语法,用公理体系描述数据类型的语义,就形成了完整的抽象数据类型,并出现了研究这种结构的代数语义学。
简介
形式语义学的一个分支,用代数方法研究计算机语言的语义。它把计算机语言形式地定义为满足某种公理体系的抽象代数结构,然后利用这种代数结构的性质来证明用该语言编写的程序的正确性。
代数语义学始于对抽象数据类型的研究。数据类型是计算机语言中的重要组成部分。但在60年代中期以前一直缺少科学的定义。它被认为仅仅是一些数据的集合,这种观点不能反映数据类型的内在数学特性,因而不能用来检验程序的正确性。1967年问世的SIMULA67语言,第一次提出类程的概念,把数据和被允许施行于这些数据之上的运算结合起来,它是现代抽象数据类型的开始,但当时未引起足够重视。70年代初,软件危机促使人们去研究编写和验证正确的程序的理论和技术。在当时出现的一些新语言中,进一步把数据类型的特性与它的具体表示及实现方式分开来,提高了它的抽象程度。在这种思想指导下,用代数结构描述数据类型的语法,用公理体系描述数据类型的语义,就形成了完整的抽象数据类型,并出现了研究这种结构的代数语义学。
基调和Σ代数
用 表示由一组称为类子的元素构成的集合,用表示由一组运算符构成的集合,则中每一元素均可表示为: 1×2×…×k─→k+1
其中i∈(1≤≤+1),箭头左边是运算的变元,右边是运算的结果。变元可以为空集,此时它是零元运算符。对偶Σ=(,)称为基调,它确定数据类型的基本语法结构。
给中的每个类子 i赋以一个元素集合捴,给中的每个元运算符i赋以一个函数i(1,2,…,k),其中j∈捿,1≤≤,i(1,2,…,k)∈+1。令={捴},={i},则对偶ΣA,F={,}称为以Σ为基调的一个Σ代数。捴称为Σ代数的载体。
Σ代数是一种非齐性代数。非齐性代数是比克霍夫和李普森在1970年作为对以前的齐性代数的推广而提出的。在这种代数里,元素集被分成几个互不相交的子集。每个代数运算均以特定的子集为其定义域和值域。非齐性代数是代数语义学的主要工具。
例如,为了定义数据类型“整数堆”,需要三种类子:1=bag,2=int,3=bool和四个运算符 empty: ─→bag
insert: bag×integer ─→bag
remove: bag×integer ─→bag
element: bag×integer ─→bool
其中empty是零元运算符,又是载体S1中的元素。S1={empty,…},S2={…,-2,-1,0,1,2,…},={True,False}。S1中的其他元素通过反复执行上述运算而得。
Σ代数的层次结构
Σ和Σ是两个具有相同基调的Σ代数。如果存在单值映射,把1映为2,1映为2,且对任意的 ɑ1,ɑ2,…,ɑn∈1及1∈1有(1(ɑ1,…,ɑn))=2((ɑ1),…,(ɑn)), 其中2∈2,(1)=2。则称为Σ到Σ的一个同态映射, 如果把它看成态射,则对应于同一基调的所有Σ代数构成一个范畴。
如果存在一个Σ代数,表为Σ1,它属于以某个Σ为基调的范畴,使得对中的每个Σ代数Σi都存在一个唯一的同态映射i:Σ1─→Σi,则称Σ1为中的初始代数。如果存在另一个Σ代数Σ2,使得对中每个Σj,都存在一个唯一的同态映射j:Σj─→Σ2,则称Σ2为 中的终结代数。初始代数和终结代数在同构意义下都是唯一的。
在上面所说的情况下,这两种代数都是存在的。若载体集 中的任何元素彼此都不等价,即可得初始代数,又称项代数。如果每个类子i只对应一个元素ɑi,即可得终结代数。
数据类型的语义
对中的每个类子i,取一组自由变量i与之对应,={i}。设i()表示在函数集对变量集 的作用下,所得到的全部属于类子i的表达式集合,()={i()},则Σ代数Σ称为上的自由Σ代数。对任意的和任意的1,2∈i(),公式1=2称为一个公理。令 为由任意一组无矛盾的公理构成的集合,对偶{Σ,}称为一个抽象数据类型。