【PL理论深化】(15) 推理规则:变量的规则 E-Val, E-Let | 条件表达式定义 E-If-T, E-If-F, E-Zero-T | 运算环境 ρ = {x↦1, y↦2} 的程序

💬 写在前面:上一章我们讲解了环境的基本概念,本章我们将讲解推理规则。

目录

0x00 推理规则

0x01 变量的规则:E-Var 和 E-Let

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

0x05 在空环境中运行程序

0x06 运算环境 ρ = {x↦1, y↦2} 的程序


0x00 推理规则

给定环境 \rho,让我们定义表达式 E 的含义。

我们约定,在环境 \rho 中计算表达式 E 的结果为 v 可以如下表示:

\rho \vdash E\Rightarrow v

对于整数表达式,我们将语义定义为程序和值之间的二元关系 ( E\Rightarrow v ) 。

但现在程序的意义取决于环境,因此我们将语义定义为环境、程序和值之间的三元关系。

我们可以将这种三元关系表述为 \rho \vdash E\Rightarrow v,例如:

\varnothing \vdash 1\Rightarrow 1:在空环境中计算表达式 1 的结果为 1

\{x \mapsto 1\}\vdash x+1\Rightarrow 2:在环境 \{x \mapsto 1\} 中计算 x+1 的结果为 2

\{x \mapsto 1 \}\vdash \textrm{let}\, \, y=2\, \, \textrm{in}\, \, x+y\Rightarrow 3:在环境 \{x \mapsto 1\} 中,计算 let y = 2 in x + y 结果为 3。

推断规则,定义语义结构下所示:

前五条规则简单地将整数表达式语言的语义结构扩展为包括环境。

0x01 变量的规则:E-Var 和 E-Let

关于变量的新增规则是 \textrm{E-Var}\textrm{E-Let}

规则 \textrm{E-Var} 表示在给定环境 \rho 中,变量 x 的意义是环境中定义的 x 的值 \rho (x)

规则 \textrm{E-Var} 仅在变量 x 在当前环境中定义时才适用。

.

\big(x\in \textrm{Dom}(\rho )\big) 规则 \textrm{E-Let} 定义了 let 表达式的语义。

在环境 \rho 中,表达式 \textrm{let}\, \, x=E_1\, \, \textrm{in}\, \, E_2 被计算如下:

① 首先,在给定的环境 \rho 中计算表达式 E_1 的值,得到值 v_1

(\rho \vdash E_1\Rightarrow v_1)

② 接下来,在扩展了当前环境的基础上,让变量 x 意味着值 v_1

(\{x \mapsto v_1\}\rho )

③ 在扩展后的环境 \{x \mapsto v_1\}\rho 中计算表达式 E_2,得到值 v

④ 整个 \textrm{let}\, \, x=E_1\, \, \textrm{in}\, \, E_2 表达式的计算结果是值 v

.

关键在于在扩展了环境 (\{x \mapsto v_1 \}) 的情况下计算表达式 E_2

结果是,在 E_2 中使用变量 x 时,它意味着值 v_1

即使在 E_1 中定义了新的变量,也不会影响计算 E_2

0x02 条件表达式定义:E-If-T, E-If-F, E-Zero-T

条件表达式 \textrm{if}\,\, \, E_1\textrm{ then}\, \, E_2\, \, else \, \, E_3 的含义如下定义:

计算表达式 E_1 的结果,如果为 \top,则计算 E_2 (\textrm{E-If-T}),否则计算 E_3 (\textrm{E-If-F})。

\textrm{iszero}\, E 的值定义如下:如果 E 计算结果为 0,则为 \top (\textrm{E-Zero-T}),否则为 \perp (\textrm{E-Zero-F})。

.

在上述的含义定义中,n 表示整数值,v 表示任意值的符号。

例如,在算术运算规则中,将表达式 E_1 和  E_2 的计算结果表示为 n_1 和 n_2

这意味着 E_1 和 E_2 必须计算为整数值才有定义的含义。

因此,像 1+\top 这样的表达式根据上述含义结构将成为无意义的程序。

相反,在 let 表达式的含义结构定义中,将 E_1 和 E_2 的计算结果分别表示为 v_1 和 v

意味着可以计算出任意类型的值,今后,我们将继续使用表示值类型的符号,

如整数值为 n,真/假 值为 b,任意值为 v ,来定义含义结构。

.

根据我们到目前为止定义的语义结构,让我们来执行前面的示例程序。

在应用推理规则时,根据需要可以省略或简化公理规则,只展示主要过程。

.

0x03 例子:空环境中 let x = 1 in x + 2

在空环境中,执行 let x = 1 in x + 2 如下:

给定的程序是一个 let 表达式,因此首先应用执行规则 \textrm{E-Let}

根据规则 \textrm{E-Let},在当前空环境 \varnothing 中计算表达式 1 得到值 1 (规则 \textrm{E-Num}) 。

然后将当前环境扩展为包含变量 x 和值 1 的环境 ( \{x \mapsto 1\} ) ,接着计算表达式 x+2

为了计算 x+2,应用执行规则 \textrm{E-Plus},这将再次应用规则 \textrm{E-Var} 和 \textrm{E-Num} 来执行。

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

计算方式如下:

在计算表达式 x+3 时,注意到环境 ( \{x \mapsto 3\} ) 中缺少关于变量 y 的信息。

因此,如果在最后一行计算程序中,替换 x+3x+y,那么执行的含义将未定义。

根据语义的定义,变量 y 自然地只在定义 x 值的 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 时生成的环境 \{x \mapsto 2\} 只在计算 x+x 时使用,

而不会传播到计算最后的表达式 x+y 的时候,这一点非常重要。

因此,在 x+y 中,x 将指代第一行中定义的 x

0x06 运算环境 ρ = {x↦1, y↦2} 的程序

环境 \rho =\{x \mapsto 1,y \mapsto 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

  • 33
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平渊道人

喜欢的话可以支持下我的付费专栏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值