Динамическое тестирование выставочных кассов, как объяснено в Tapl
-
28-09-2020 - |
Вопрос
на странице 195 из книги Tapl Pierce, он утверждает, что можно заменить неподходящего литого оператора в какой-то тесте динамического типа. Затем он дает следующие правила:
T-T-Typeetest:
$ \ dfrac {\ gamma \ vdash t_1: s \; \; \ Gamma, x: t \ vdash t_2: u \; \; \ Gamma \ vdash t_3: u} {\ gamma \ vdash \ text {Если} t_1 \ text {} t \ text {затем} x} t_2 \ text {else} t_3 \ to t_3: u} $
e-typeetest1:
$ \ dfrac {\ vdash v_1: t} {\ text {Если} v_1 \ text {in} t \ text {затем} x} t_2 \ text {elt} t_3 \ to [x \ mapsto v_1] t_2} $
e-typeetest2:
$ \ dfrac {\ nvdash v_1: t} {\ text {Если} v_1 \ text {} t \ text {Тогда} x} t_2 \ text {else} t_3 \ to t_3} $
Нет дальнейшего объяснения, и я не знаю о том, как интерпретировать эти правила. Просмотр их, я понимаю, что первое - это правило набора текста, а вторая и треть - это правила оценки. Однако синтаксис немного странно. Какие стрелки в каждой ветке IF? Почему, если включает в себя in
syntax?
Решение
Первое правило T-Tipetest - это правило проверки типа. Давайте прочитаем это вместе. Во-первых, $ \ gamma $ не важно (по крайней мере, на первом чтении). У нас есть следующие помещения:
- $ t_1 $ имеет тип $ S $
- Если $ x $ имеет тип $ T $ Тогда $ T_2 $ имеет тип $ u $
- $ t_3 $ имеет тип $ u $
-
Если $ t_1 $ имеет тип $ t $ затем (1) оценивает < SPAN CLASS= «Математический контейнер»> $ t_2 $ с $ x $ Замена $ t_1 $ < / span>. Это случай «удвоить», то есть $ T_1 $ Downcast с $ S $ Spaness Class= «Математический контейнер»> $ T $ T $ , значение SPEASTACT связано с $ x $ а затем $ t_2 $ не имеет типа $ t $ затем (1) оценивает на $ t_3 $ . Это «по умолчанию», которое мы используем, когда наверху невозможно.
Выводы в том, что мы получаем выражение типа $ u $ (я думаю, что ваша транскрипция должна иметь " $ : U $ "вместо $ \ to t_3 $ Заключение): $$ \ mathrm {Если} \; t_1 \; \ mathrm {in} \; T \; \ mathrm {затем} \; x \ to t_2 \; \ mathrm {else} \; T_3 \ Tag {1} $$ Значение этого выражения может быть недружено, глядя на два других правила, которые являются небольшими операционными семантиками. Вот неверное объяснение, которое мы сделаем правильно в на мгновение:
Вышеуказанное объяснение неверно, потому что мы должны использовать $ v_1 $ вместо $ t_1 $ , Какой автор говорит вам: сначала оценивайте $ t_1 $ на $ v_1 $ , а затем выполнить удровку ,
в воображаемом языке oO То же самое можно было написано несколько так:
S t1 = ...;
...
if (t1 instanceof T) {
T x = (T)t1;
t2;
} else {
t3;
}
.