Skip to content

PPL HW4

:material-circle-edit-outline: 约 999 个字 :material-clock-time-two-outline: 预计阅读时间 3 分钟

[!ABSTRACT]

3220104929 241126 book.pdf ppl-assignment-4(1).pdf

静态语义和动态语义

[!QUESTION]

Question 1 (2 pts)  代码的编译包括词法分析(将代码分割成若 ⼲ 单词)、语法分析(按照语法,将单词组合成树)、语义分析(表达式中进 ⾏ 类型推断和类型检查等)等步骤,请问其中哪些步骤属于静态阶段?

三者均在代码运行前即可完成,所以均属于静态阶段

[!QUESTION]

Question 2 (2 pts)  E 的语法表共 10 ⾏,在这 10 ⾏ 中,哪些是 operator?(你可以使⽤⾏号来回答)

image-20241126213455496

6,7,8,9

let 是变量替换,并非运算

[!QUESTION]

Question 3 (2 pts)  课本通过规则 (4.1) 定义了 E 的静态语义,这⾥需要你简要解释规则 (4.1h) 的含义。

image-20241126213444004

在上下文 Γ 中,变量 x 的类型并没被声明

如果在上下文 Γ 下,表达式 \(e_1\) 的类型是 \(\tau_1\),且已知 \(x\) 的类型也是 \(\tau_1\) 的情况下可以确定表达式 \(e_2\) 的类型为 \(\tau_2\)

则我们可以推断,在上下文 Γ 下,将表达式 \(e_2\) 中的变量 \(x\) 替换为表达式 \(e_1\),新的表达式类型不变

就是将一个表达式里的变量替换为与变量同类型的表达式,整个表达式类型不变

[!QUESTION]

Question 4 (2 pts) 请简要解释规则 (5.4h) 的含义。请注意规则中含有的⽅括号,这也是需要解释的主要部分。

image-20241126215511248

方括号表示条件,用于限制规则的适用性,只有当 \(e_1\) 已经是值时,才能直接应用此规则

如果 \(e_1\) 还未求值,需要先对 \(e_1\) 进行求值,例如 let(2 + 3; x. x + 1) 需要先计算 2 + 3 的结果 5,然后再应用规则

\(e_1\) val 的含义是 \(e_1\) 是一个值

如果 \(e_1\) 已经是一个值(即满足 [\(e_1\) val]),那么 let(\(e_1\); \(x.e_2\)) 的求值过程可以转化为用 \(e_1\) 替换 \(e_2\) 中的所有 x

[!QUESTION]

Question 5 (3 pts) 证明......

image-20241126221917970

image-20241127102725332

延续( continuation )

[!QUESTION]

Question 6 (2 pts) 写出延续

墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图

[!QUESTION]

Question 7 (6 pts) 规约步骤

image-20241127103942984

image-20241127105444538

[!QUESTION]

Question 8 (5 pts) 规约步骤

image-20241127111319344

全函数与 Gödel's System T

[!QUESTION]

Question 9 (2 pts) 阅读规则 (8.2),解释

image-20241126230124297

在形如 \(apply{f}(e′)\) 的函数应用中才会出现函数名 \(f\)

\(e_1\) 可能会调用 \(f\),如果直接用 \(e_1\) 可能会导致结果依然出现 \(f\),所以需要先将 \(e_1\) 里的 \(f\) 做代换

[!QUESTION]

Question 10 (4 pts)

  1. 根据语⾔ ED 按值调⽤解释下的结构化动态语义,写出这段代码的运 ⾏ 过程, 在每⼀步注明使⽤的规则
  2. ED 语⾔是静态作⽤域的还是动态作⽤域的?
  1. image-20241127195717914
  2. 静态作⽤域

[!QUESTION]

Question 11 (2 pts) “急切解释” 和 “惰性解释” 与我们之前讨论的 “按值调 ⽤” 和 “按名调 ⽤” 有何异同?

image-20241127114500710

[!NOTE]

急切解释(Eager Evaluation)

  • 在急切解释中,e 会被立即计算并简化到一个值
  • 因此,s(e) 只有在 e 已经计算为值的情况下才能被认为是值

惰性解释(Lazy Evaluation)

  • 在惰性解释中,e 并不会立即被计算,只有在实际需要时才会被求值
  • 由于 e 未必需要是值,s(e) 的值判断并不依赖于 e 的立即计算

按值解释(by-value interpretation):先求值(保留方括号中内容)

按名解释(by-name interpretation):不求值直接绑定

  • 相同之处
    • 两类概念都在确定 前提是否需要先计算结果以进行判断
  • 不同之处
    • 解释适用于讨论所有表达式,调用仅限于讨论函数调用时的参数传递

[!QUESTION]

Question 12 (3 pts) 解释递归式含义

如果 \(e=z\) ,那么结果为 \(e_0\)

否则记 \(e=s(e^\prime)\),调用 \(x.y.e_1\)\(e^\prime\) 绑定至 \(x\),以 \(e^\prime\) 为操作数递归,将结果绑定至 \(y\)

[!question]

Question 13 (5 pts) 

  1. 逐步规约
  2. 给出两个整数的加法函数
  1. image-20241127202326525image-20241127202355383
  2. 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图 墨迹绘图