如TAPL中所述的击败力的动态测试
-
28-09-2020 - |
题
在Pierce的Tapl书中,他指出,通过某种动态类型测试,可以更换一个下铸造的操作员。然后他给出了以下规则:
t-typeTest:
$ \ dfrac {\ gamma \ vdash t_1:s \; \ gamma,x:t \ vdash t_2:u \; \; \ gamma \ vdash t_3:u} {\ gamma \ vdash \ text {if} t_1 \ text {in} t \ text {the} x \ to t_2 \ text {else} t_3 \ to t_3:u} $
e-typeTest1:
$ \ dfrac {\ vdash v_1:t} {\ text {if} v_1 \ text {in} t \ text {den} x \ to t_2 \ text {else} t_3 \ to [x \ mapsto v_1] t_2} $
e-typeTest2:
$ \ dfrac {\ nvdash v_1:t} {\ text {if} v_1 \ text {in} t \ text {den} x \ to t_2 \ text {else} t_3 \ to t_3} $
没有进一步的解释,我没有意识到如何解释这些规则。审查它们,我意识到第一个是打字规则,第二个和第三是评估规则。但是,语法有点奇怪。 IF的每个分支中的箭头是什么?为什么如果包括in
syntax?
解决方案
第一个规则t-typeTest是一种类型检查规则。让我们一起读它。首先, $ \ gamma $ 并不重要(至少在第一次读数上)。我们有以下场所:
- $ t_1 $ 具有类型 $ s $
- 如果 $ x $ 具有类型 $ t $ 那么 $ t_2 $ 有类型 $ u $
- $ t_3 $ 具有类型 $ u $
-
如果 $ t_1 $ 类型 $ t $ 那么(1)评估<跨越类=“math-container”> $ t_2 $ 使用 $ x $ 替换为 $ t_1 $ < / span>。这就是“触觉”的情况,即 $ t_1 $ 从 $ s $ 到<跨越类=“math-container”> $ t $ ,触觉值绑定到 $ x $ ,然后 $ t_2 $ 执行。
-
如果 $ t_2 $ 没有类型 $ t $ 那么(1)评估到 $ t_3 $ 。这是我们在无法触觉时使用的“默认”。
得出的结论是,我们得到了类型 $ u $ (我认为转录应该具有“ $ :U $ “而不是 $ \ to t_3 $ 结论): $$ \ mathrm {if} \; t_1 \; \ mathrm {in} \; t \; \ mathrm {然后} \; x \ to t_2 \; \ mathrm {else} \; t_3 \ tag {1} $$ 这种表达式的含义可以通过观察其他两个规则来透露,这是小型操作语义。这是一个错误的解释,我们将在瞬间做出正确:
以上解释是不正确的,因为我们应该使用 $ v_1 $ 而不是 $ t_1 $ ,by哪个作者正在告诉您:首先评估 $ t_1 $ to $ v_1 $ ,然后执行悲伤。
在虚构的OO语言中,同样的事情可能是一个如此:S t1 = ...;
...
if (t1 instanceof T) {
T x = (T)t1;
t2;
} else {
t3;
}
.