Динамическое тестирование выставочных кассов, как объяснено в Tapl

cs.stackexchange https://cs.stackexchange.com/questions/118970

Вопрос

на странице 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? Почему, если включает в себя insyntax?

Это было полезно?

Решение

Первое правило T-Tipetest - это правило проверки типа. Давайте прочитаем это вместе. Во-первых, $ \ gamma $ не важно (по крайней мере, на первом чтении). У нас есть следующие помещения:

  1. $ t_1 $ имеет тип $ S $
  2. Если $ x $ имеет тип $ T $ Тогда $ T_2 $ имеет тип $ u $
  3. $ t_3 $ имеет тип $ u $
  4. Выводы в том, что мы получаем выражение типа $ u $ (я думаю, что ваша транскрипция должна иметь " $ : U $ "вместо $ \ to t_3 $ Заключение): $$ \ mathrm {Если} \; t_1 \; \ mathrm {in} \; T \; \ mathrm {затем} \; x \ to t_2 \; \ mathrm {else} \; T_3 \ Tag {1} $$ Значение этого выражения может быть недружено, глядя на два других правила, которые являются небольшими операционными семантиками. Вот неверное объяснение, которое мы сделаем правильно в на мгновение:

    1. Если $ 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 $ . Это «по умолчанию», которое мы используем, когда наверху невозможно.

    2. Вышеуказанное объяснение неверно, потому что мы должны использовать $ v_1 $ вместо $ t_1 $ , Какой автор говорит вам: сначала оценивайте $ t_1 $ на $ v_1 $ , а затем выполнить удровку ,

      в воображаемом языке oO То же самое можно было написано несколько так:

      S t1 = ...;
      ...
      if (t1 instanceof T) {
        T x = (T)t1;
        t2;
      } else {
        t3;
      }
      
      .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top