💬 写在前面:上一章我们讲解了环境的基本概念,本章我们将讲解推理规则。
目录
0x02 条件表达式定义:E-If-T, E-If-F, E-Zero-T
0x03 例子:空环境中 let x = 1 in x + 2
0x04 例子:在空环境中 let x = 1 in let y = 2 in x + y
0x00 推理规则
给定环境 ,让我们定义表达式
的含义。
我们约定,在环境 中计算表达式
的结果为
可以如下表示:
对于整数表达式,我们将语义定义为程序和值之间的二元关系 ( ) 。
但现在程序的意义取决于环境,因此我们将语义定义为环境、程序和值之间的三元关系。
我们可以将这种三元关系表述为 ,例如:
:在空环境中计算表达式 1 的结果为 1
:在环境
中计算
的结果为 2
:在环境
中,计算 let y = 2 in x + y 结果为 3。
推断规则,定义语义结构下所示:
前五条规则简单地将整数表达式语言的语义结构扩展为包括环境。
0x01 变量的规则:E-Var 和 E-Let
关于变量的新增规则是 和
。
规则 表示在给定环境
中,变量
的意义是环境中定义的
的值
。
规则 仅在变量
在当前环境中定义时才适用。
.
规则
定义了 let 表达式的语义。
在环境 中,表达式
被计算如下:
① 首先,在给定的环境 中计算表达式
的值,得到值
:
② 接下来,在扩展了当前环境的基础上,让变量 意味着值
:
③ 在扩展后的环境 中计算表达式
,得到值
。
④ 整个 表达式的计算结果是值
。
.
关键在于在扩展了环境 的情况下计算表达式
。
结果是,在 中使用变量
时,它意味着值
。
即使在 中定义了新的变量,也不会影响计算
。
0x02 条件表达式定义:E-If-T, E-If-F, E-Zero-T
条件表达式 的含义如下定义:
计算表达式 的结果,如果为
,则计算
(
),否则计算
(
)。
的值定义如下:如果
计算结果为 0,则为
(
),否则为
(
)。
.
在上述的含义定义中, 表示整数值,
表示任意值的符号。
例如,在算术运算规则中,将表达式 和
的计算结果表示为
和
,
这意味着 和
必须计算为整数值才有定义的含义。
因此,像 这样的表达式根据上述含义结构将成为无意义的程序。
相反,在 let 表达式的含义结构定义中,将 和
的计算结果分别表示为
和
,
意味着可以计算出任意类型的值,今后,我们将继续使用表示值类型的符号,
如整数值为 ,真/假 值为
,任意值为
,来定义含义结构。
.
根据我们到目前为止定义的语义结构,让我们来执行前面的示例程序。
在应用推理规则时,根据需要可以省略或简化公理规则,只展示主要过程。
.
0x03 例子:空环境中 let x = 1 in x + 2
在空环境中,执行 let x = 1 in x + 2 如下:
给定的程序是一个 let 表达式,因此首先应用执行规则 。
根据规则 ,在当前空环境
中计算表达式 1 得到值 1 (规则
) 。
然后将当前环境扩展为包含变量 和值 1 的环境 (
) ,接着计算表达式
。
为了计算 ,应用执行规则
,这将再次应用规则
和
来执行。
0x04 例子:在空环境中 let x = 1 in let y = 2 in x + y
在空环境中,程序 let x = 1 in let y = 2 in x + y 的含义如下计算:
0x05 在空环境中运行程序
在空环境中运行程序:
let x = let y = 2
in y + 1
in x + 3
计算方式如下:
在计算表达式 时,注意到环境 (
) 中缺少关于变量
的信息。
因此,如果在最后一行计算程序中,替换 为
,那么执行的含义将未定义。
根据语义的定义,变量 自然地只在定义
值的 let 表达式内部有效。
.
在空环境中运行程序:
let x = 1
in let y = 2
in let x = 3
in x + y
计算方式如下:
上面省略的部分 (A) 如下:
在上述过程中,重要的是理解每次通过 let 定义变量时,环境如何变化。
.
在空环境中运行程序:
let x = 1
in let y = let x = 2
in x + x
in x + y
计算方式如下:
理解在计算表达式 let x = 2 in x + x 时生成的环境 只在计算
时使用,
而不会传播到计算最后的表达式 的时候,这一点非常重要。
因此,在 中,
将指代第一行中定义的
。
0x06 运算环境 ρ = {x↦1, y↦2} 的程序
环境 的程序:
其执行过程如下所示:
📌 [ 笔者 ] 王亦优
📃 [ 更新 ] 2024.6.20
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!
📜 参考资料 - R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015. - T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。 - T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018. - J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005. - R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011 - S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。 - S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。 - E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993 - S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008. - A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974. - M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997. - A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. Hopcroft, and J. Ullman, Data Structures and Algorithms, Addison-Wesley, 1983. - E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997. - R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998 - R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002 |