指称语义简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
1.2 函数定义的符号表示(续)
3. 多个参数与let ... in ...结构的嵌套(或组合)。
例:let triangle-area(a,b,c) = let s = 0.5*(a+b+c)in if s>0.0 then sqrt(s*(s-a)*(s-b)*(s-c)) else 0.0
in
...
15
本节主要内容
1 指称语义的基本概念:短语 → 指称
2 语义函数与指称语义的基本过程
① 语法(短语)
② 域(指称)
③ 语义函数(短语→指称)
④ 语义方程与辅助函数
回顾:odd=λn.true-value
b. 域D→D'上的一个偏(partial)函数是这样一个函数,它可以仅成功地作用于D中 的部分参数。经常用偏函数来规定语义。 例2 若除法函数的参数对中的第二个数值是0,就不能成功地应用除法函数。
假设每个域都包括一个特殊的元素fail,它可以用来作为偏函数的结果。
<1> 原子域(Primitive domains)
原子域是这样的域,它的元素是原子的值,而不是可以由更简单的值组合而来
的值。原子域包括:
• Character
- 元素来自字符集合
• Integer
- 元素是零、正整数、负整数
• Natural
- 元素是非负整数
• Truth-Value - 元素是真值false和true
valu[110] = 2×valu[11] = 2×(2×valu[1]+1) = 2×(2×1+1) =6
valu[110] = 10×valu[11] = 10×(10×valu[1]+1) = 10×(10×1+1) N::==i|1N1i0(i=0, 1, 2... base-1)
base进制:valu[i]= i
3. 形式化语义的应用 • 语义设计 • 程序验证 • 程序自动生成(编译器自动构造)
4. 形式化描述语义的方法 • 操作语义 • 公理语义 • 指称语义
1
指称语义
1. 赋予程序的每个短语(如每个表达式、命令、声明等)意义 ,即将语言的语 义结构强加给对应的语法结构;
2. 每个短语的意义由它的子短语来定义; 3. 每个短语的意义被称为指称,从而发展出指称语义 。
例2 构造一个money类型的元组: let pay = (payrate×hours,dollars) in ...
例3 将money类型分解为两个分量的乘积: let (amount,denom) = pay in amount×(if denom=dollars then 100 else 1)
语义方程:exec[E=]= eval E
(6.9)
eval[N]= valu N
(6.10a)
eval[E1+E2]= sum(eval E1, eval E2) (6.10b)
eval[E1-E2]= diff(eval E1, eval E2) (6.10c)
6
eval[E1*E2]= prod(eval E1, eval E2) (6.10d)
b. 异或域分解也用let ... in ...,但需多重函数分情况定义
例2 let sheet = rectangle(lgth,lgth/sqrt 2.0) in -- sheet:Shape
...
let
area(rectangle(w,d)) = w*d -- area:Shape→Real
area(circle r)
语义函数: execute : Command → int
(6.6)
evaluate : E
→ int
(6.7)
valuation : Numeral → Natural (6.8)
辅助函数:sum : int×int→ int
diff : int×int→ int
prod : int×int→ int
a. 迪卡尔积域D1×D2×...×Dn的元素是有序n元组,(x1, x2, ..., xn),其中 xi∈Di。当n=2时,域中元素是有序对。
例1 Money=Natural×Denomination的元素可以取: (1,dollars)、(2,cents)等。
b. 元组的构造与分解 用let x=(...) in ...构造元组; 用let (...)=x in ...分解元组。
12
<3> 异或域(Disjoint union domains)
1.3 域(Domains)(续2)
a. 异或域D1+D2+...+Dn的元素选自分量的域:x∈Di(i=1,2...n) 。 异或域的各分量域应被标记(命名),以明确取自的分量。
例1 异或域Shape=rectangle(Real×Real)+circle Real+point的元素: rectangle(0.3,0.4)、cirle 5.0或point(point Unit)
4
例2 二进制数的语法与语义
语法: 域: 语义函数: 语义方程:
计算:
Numeral ::= 0 | 1 | N0 | N1 Natural = { 0, 1, 2, 3, ... } valuation : N → Natural valu[0]= 0 valu[1]= 1 valu[N0]= 2×valu N+0 = 2×valu N valu[N1]= 2×valu N+1
将语言的意义施加于语言的结构语义函数与指称语义的基本过程语法短语域指称语义函数短语指称语义方程与辅助数语义方程与辅助函数函数定义的符号表示使用符号let
形式化语义(动态语义)
1. 语义的形式化描述(形式化语义)对程序设计语言的设计与实现均具有 重要意义;
2. 形式化语义从数学的角度(用数学的方法)研究程序设计语言的语义(最初 也被称为数学语义),使得: • 全面、准确了解(规定)程序设计语言的语义 • 预测程序的行为 • 对程序进行推理(如一程序与另一程序是否相等)
= prod(diff(valu[40], valu[3]), valu[9]) by(6.10a)
= prod(diff(40,3), 9)= 333
7
定义1.1
• 每个短语p的意义被规定为一个在某域中的值d。称d是短语p的指称。或者说短
语p由d来指称;
• 规定域D作为短语类P的指称,并且引入一个语义函数f,它把P中的每个短语映
eval[E1*E2]= prod(eval E1, eval E2) (6.10d)
执行命令“40-3*9=” ,其中减法优先级高于乘法:
exec[40-3*9=]
= eval[40-3*9]
by(6.9)
= prod(eval[40-3],eval[9])
by(6.10c)
= prod(diff(eval[40], eval[3]), eval[9]) by(6.10d)
语法与语义的关系: • 语义是依附于语法的; • 语义是独立于语法的,反映语言的真实含意; • 语法、语义是多对多的映射。
回顾属性文法: • 属性(如.type、.val等) • 语义规则
3
例1 语法与语义的关系
考虑二进制数,如"110"和"10101"。 • 数字"110"欲表示数值6, • 而数字"10101"欲表示数值21。 数字是一个语法实体,而数值是一个语义实体。数值是一个抽象概念,它不 依赖于任何特别的语法表示。 • 数字"110":数值:6、110等 • 数值6: 数字:"110"、"6"、"Ⅵ"、"六"、"陆"等 • 数值110: 数字:"110"、"6E"、"壹佰壹拾"等
• Unit
- 唯一元素是零元组,记为:0-tuple()
也可以用枚举的方法来定义原子域,例如:
Denomination = { dollars, cents }
或者:Denomination = { 元、角、分 }等
11
1.3 域(Domains)(续1)
<2> 迪卡尔积域(Cartesian product domains)
本章内容 1. 指称语义的基本概念; 2. 指称语义的基本技术:如何用指称语义描述程序设计语言的特性,如存贮、
环境、抽象与参数、原子类型与组合类型、以及失败等。
本节内容 指称语义的基本概念:短语、指称、域、语义函数、函数定义的符号表示等。
2
1.1 语义函数
语义函数: 1. 用适当的数学实体表示每个短语的意义。 2. 实体被称为短语的指称(denotation)。 3. 通过将短语映射到其指称的函数,来规定程序设计语言的语义。 4. 这些函数被称为语义函数(semantic functions)。 语义函数:短语→指称
= pi*(r*r)
area(point)
= 0.0
in
...
area(sheet)
area由三个独
立的公式定义
13
<4> 函数域(Function domains)
1.3 域(Domains)(续3)
a. 函数域的元素是函数或映射。每个函数域D→D'的元素是一个函数,它把D中的元 素映射到D'中的元素。 例1 域Integer→Truth-Value的元素,是把整型数映射到真值的函数,如odd,even, positive,negative,prime,composite等。
符串。例如:
nil
-- 习惯上写为“”
'a'.nil
-- 习惯上写为“a”
'S'. 'u'. 's'. 'y'.nil -- 习惯上写为“Susy”
b. 使用由两个序列定义的函数来分解序列。
例2
let length(nil) = 0
-- length : D*→Integer
length(x.s) = 1 + length s
in triangle-area(0.3, 0.4, 0.5)
函数triangle-area的域是real×real×real→real,可以将triangle-area看 作一个三元组的单一参数,a,b,c分别是它的三个分量。
10
1.3 域(Domains)
域是一个值的集合,这些值被称为域的元素。指称语义中所使用的域结构有下 述几种。

换句话说,每个短语的指称(仅)由它们子短语的指称定义,从而使得整个程序 的意义自下而上得以完整定义。
8
1.2 函数定义的符号表示
1. 使用符号“let ... in ...” 引入新的(数学意义的)变量或函数,其含意可 以非形式地解释为:“将…引入…”或“将…代入…”。
例:let s=0.5*(a+b+c) in sqrt(s*(s-a)*(s-b)*(s-c)) let succ n=n+1 in … succ m, … succ(succ i)) …
例3 一个计算器的语法与语义(续)
语义方程:
计算:
exec[E=]= eval E
(6.9)
eval[N]= valu N
(6.10a)
eval[E1+E2]= sum(eval E1, eval E2) (6.10b)
eval[E1-E2]= diff (eval E1, eval E2) (6.10c)
射到它在D中的域。记为:
f : P → D;
• 通过若干语义方程来定义语义函数,每个函数对应P中的一个可区分的短语。如
果P中的一个短语有子短语Q和R,则相应的语义方程式就类似如下表示:
f[...Q ...R ...]= ... f' Q ... f'' R ...
此处f'和f''分别是Q和R的语义函数。
14
<5> 序列域(Sequence domains)
1.3 域(Domains)(续4)
a. 序列域D*中的每个元素是从D中选出的零个或s∈D*加上前缀x∈D而得到。
例1 域String=Character*的元素是零个或若干个字符的序列,即任何长度的字
(i=0, 1, 2... base-1)
5
valu[Ni]= base×valu[N]+i
例3 一个计算器的语法与语义
文法: Command ::= Expr =
(6.4)
E
::= Numeral
(6.5a)
|E+E
(6.5b)
|E-E
(6.5c)
|E*E
(6.5d)
域: int = { ..., -3, -2, -1, 0, 1, 2, 3, ... }
其中的s是变量,而succ是函数。 2. 使用函数的匿名表示忽略函数名而仅关注其实际意义。用匿名函数λn.n+1表示
n→n+1,则下述均可表示为匿名函数:
succ = λn.n+1 pred = λn.n-1 odd = λn.true-value
于是succ可以表示为:let succ = λn.n+1 in ...
相关文档
最新文档