Jump to content

Перефокусировка (семантика)

В информатике используемое перефокусировка — это преобразование программы, для более эффективной реализации семантики сокращения — то есть небольшой операционной семантики с явным представлением контекста сокращения. Это шаг к реализации детерминированной семантики как детерминированной абстрактной машины .

Небольшая операционная семантика определяет смысл данной программы. как последовательность одношаговых сокращений, которая начинается с и продолжается последовательностью сокращений , где :

Сокращение на один шаг от к достигается за счет

  1. нахождение наименьшего потенциально сокращаемого термина ( потенциального редекса ) с использованием заданной стратегии сокращения , если этот потенциальный редекс существует в (в противном случае является неприводимым); и
  2. сокращение этого потенциального редекса с использованием заданных правил сжатия, если оно действительно (в противном случае застрял).

Семантика редукции — это операционная семантика небольших шагов с явным представлением контекста каждого потенциального редекса.

Письмо для такого контекста приведенная выше последовательность одношаговых сокращений гласит:

где

  1. сначала разлагается на контекст и потенциальный редекс ,
  2. это прописано в контракте ,
  3. затем перестраивается вокруг а затем разлагается на контекст и потенциальный редекс ,
  4. и т. д.

Эта последовательность разложений, сжатий и рекомпозиций изображается следующим образом:

         contract               contract               contract        
       o--------->o           o--------->o           o--------->o      
      /            \         /            \         /            \     
     /    recompose \       /    recompose \       /    recompose \    
    /                \     /                \     /                \   
   / decompose        \   / decompose        \   / decompose        \  
  /                    \ /                    \ /                    \ 
 o--------------------->o--------------------->o--------------------->o
          reduce                 reduce                 reduce        

Перефокусировка — это вырубка последовательных редукций: [1] [2]

         contract    refocus    contract    refocus    contract        
       o--------->o---------->o--------->o---------->o--------->o------
      /            \         /            \         /            \     
     /    recompose \       /    recompose \       /    recompose \    
    /                \     /                \     /                \   
   / decompose        \   / decompose        \   / decompose        \  
  /                    \ /                    \ /                    \ 
 o                      o                      o                      o

После первоначальной декомпозиции последовательность сокращений и перефокусировок имеет структуру детерминированной абстрактной машины .

Семантика определяет смысл языка программирования программ, написанных на этом языке программирования. представляет Плоткина Структурная операционная семантика собой семантику малых шагов , в которой смысл программы определяется шаг за шагом и где каждый шаг представляет собой элементарную операцию, выполняемую с помощью правил сокращения.

Рассмотрим следующий детерминированный язык арифметических выражений над целыми числами со сложениями и частными наподобие бритвы Хаттона. [3] [4]

В OCaml :

type operator = Add | Quo;;

type expression = Lit of int | Opr of expression * operator * expression;;

Так анализируется как Opr (Lit 1, Add, Lit 10) и анализируется как Opr (Lit 11, Quo, Lit 2).

type value = Int of int;;

let expression_of_value (v : value) : expression = match v with Int n -> Lit n;;

Наименьшие потенциально сокращаемые выражения ( потенциальные редексы ) представляют собой операции над значениями, и они выполняются с помощью функции сжатия, которая отображает фактический редекс в выражение и в противном случае выдает сообщение об ошибке:

type potential_redex = PR of value * operator * value;;

type contractum_or_error = Contractum of expression | Error of string;;

let contract (pr : potential_redex) : contractum_or_error =
  match pr with
    PR (Int n1, Add, Int n2) ->
     Contractum (Lit (n1 + n2))
  | PR (Int n1, Quo, Int n2) ->
     if n2 = 0
     then Error (string_of_int n1 ^ " / 0")
     else Contractum (Lit (n1 / n2));;

Сложение двух целых чисел представляет собой настоящий редекс, как и частное целого числа и ненулевого целого числа. Так, например, выражение Opr (Opr (Lit 1, Add, Lit 10), Add, Lit 100), то есть , сводится к Opr (Lit 11, Add, Lit 100), то есть , выражение Opr (Lit 11, Quo, Lit 2), то есть , сводится к Lit 5, то есть с , и выражение Opr (Opr (Lit 1, Quo, Lit 0), Add, Lit 100), то есть , сводится к Error "1 / 0".

Предположим, что стратегия сокращения — самая левая-внутренняя (т. е. сначала глубина и слева направо), как это фиксируется следующими правилами сравнения:

                    e1 -> e1'
     ---------------------------------------
     Opr (e1, opr, e2) -> Opr (e1', opr, e2)
 
                    e2 -> e2'
 -----------------------------------------------
 Opr (Lit n1, opr, e2) -> Opr (Lit n1, opr, e2')

Следующая функция одношагового сокращения реализует эту стратегию:

let rec reduce_d (e : expression) : value_or_expression_or_stuck =
  match e with
    Lit n ->
     Value (Int n)
  | Opr (e1, opr, e2) ->
     match reduce_d e1 with
       Value v1 ->
        (match reduce_d e2 with
           Value v2 ->
            (match contract (PR (v1, opr, v2)) with
               Contractum e ->
                Expression e
             | Error s ->
                Stuck s)
         | Expression e2' ->
            Expression (Opr (expression_of_value v1, opr, e2'))
         | Stuck s ->
            Stuck s)
     | Expression e1' ->
        Expression (Opr (e1', opr, e2))
     | Stuck s ->
        Stuck s;;

Словами:

  • литерал сводится к значению;
  • если выражение e1 застрял, то и выражение тоже Opr (e1, opr, e2), для любого выражения e2;
  • если выражение e1 сводится к выражению e1', то для любого выражения e2, Opr (e1, opr, e2) сводится к Opr (e1', opr, e2);
  • если выражение e1 сводится к значению v1, затем
    • если выражение e2 застрял, то и выражение тоже Opr (e1, opr, e2);
    • если выражение e2 сводится к выражению e2', затем Opr (e1, opr, e2) сводится к Opr (e1, opr, e2');
    • если выражение e2 сводится к значению v2, затем Opr (e1, opr, e2) это потенциальный редекс:
      • если этот потенциальный редекс является действительным, то его сжатие дает выражение; Opr (e1, opr, e2) сводится к этому выражению;
      • если этот потенциальный редекс не является реальным, то Opr (e1, opr, e2) застрял.

Оценка достигается путем итерационной редукции. Он возвращает либо значение, либо сообщение об ошибке:

type result = Normal_form of value | Wrong of string;;

let rec normalize_d (e : expression) : result =
  match reduce_d e with
    Value v ->
     Normal_form v
  | Expression e' ->
     normalize_d e'
  | Stuck s ->
     Wrong s;;

Эта одношаговая функция сокращения является структурно рекурсивной . Он реализует структурную операционную семантику для этого минималистичного языка арифметических выражений с ошибками.

Например, функция редукции неявно строит следующее дерево доказательства для выполнения шага редукции: :

                   ------------
                   5 + 5  -> 10
              ---------------------
              1 - (5 + 5) -> 1 - 10
 -----------------------------------------------
 (1 - (5 + 5)) - (2 - 20) -> (1 - 10) - (2 - 20)

Переформатирование этого дерева доказательств, чтобы подчеркнуть неявное разложение, дает:

                  -------------------------------------------------->
                ^                 contraction                         |
                |         -----------------------------               |
                |         5 + 5              ->      10               |
    implicit    |    ----------------------------------               | implicit
  decomposition |    1 - (5 + 5)             ->  1 - 10               | recomposition
                |   -----------------------------------------------   |
                |   (1 - (5 + 5)) - (2 - 20) -> (1 - 10) - (2 - 20)   v

Семантика редукции — это операционная семантика небольших шагов, в которой неявный контекст потенциального редекса становится явным. Таким образом, один шаг сокращения приводит к

  1. построение контекста редекса,
  2. стягивание этого редекса, и
  3. перекомпоновка контекста вокруг контракта для получения сокращения:
  (1 - (5 + 5)) - (2 - 20)  \
 [(1 - (5 + 5)) - (2 - 20)] | explicit
 [[1 - (5 + 5)] - (2 - 20)] | decomposition
 [[1 - [5 + 5]] - (2 - 20)] /
                              contraction
 [[1 - [ 10  ]] - (2 - 20)] \
 [[1 -   10   ] - (2 - 20)] | explicit
 [(1 -   10   ) - (2 - 20)] | recomposition
  (1 -   10   ) - (2 - 20)  /

Наглядно арифметическое выражение вычисляется поэтапно:

         contract               contract               contract        
       o--------->o           o--------->o           o--------->o      
      /            \         /            \         /            \     
     /    recompose \       /    recompose \       /    recompose \    
    /                \     /                \     /                \   
   / decompose        \   / decompose        \   / decompose        \  
  /                    \ /                    \ /                    \ 
 o--------------------->o--------------------->o--------------------->o
          reduce                 reduce                 reduce        

Преобразование функции одношагового сокращения в Continuation-Passing Style , разграничивающее продолжение от типа value_or_expression_or_stuck -> 'a печатать value_or_expression_or_stuck -> value_or_expression_or_stuck, и разбить это ограниченное продолжение на два (один для продолжения декомпозиции и один для повторного составления, используя изоморфизм типов между и ) упрощает реализацию соответствующей функции нормализации:

type value_or_decomposition_cc =
  Val_cc of value
| Dec_cc of potential_redex * (value -> value_or_decomposition_cc) * (expression -> expression);;

let rec decompose_expression_cc (e : expression) (kd : value -> value_or_decomposition_cc) (kr : expression -> expression) : value_or_decomposition_cc =
  match e with
    Lit n ->
     kd (Int n)
  | Opr (e1, opr, e2) ->
     decompose_expression_cc
       e1
       (fun v1 ->
         decompose_expression_cc
           e2
           (fun v2 ->
             Dec_cc (PR (v1, opr, v2), kd, kr))
           (fun e2' ->
             kr (Opr (expression_of_value v1, opr, e2'))))
       (fun e1' ->
         kr (Opr (e1', opr, e2)));;

let decompose_cc (e : expression) : value_or_decomposition_cc =
  decompose_expression_cc e (fun v -> Val_cc v) (fun e' -> e');;

let rec iterate_cc_rb (vod : value_or_decomposition_cc) : result =
  match vod with
    Val_cc v ->
     Normal_form v
  | Dec_cc (pr, kd, kr) ->
     (match contract pr with
        Contractum e ->
         iterate_cc_rb (decompose_cc (kr e))
      | Error s ->     (*^^^^^^^^^^^^^^^^^*)
         Wrong s);;

let normalize_cc_rb (e : expression) : result =
  iterate_cc_rb (decompose_cc e);;

В подчеркнутом коде контракт перекомпонуется, а результат декомпозируется. Говорят, что эта функция нормализации основана на редукции , поскольку она перечисляет все редукции в последовательности редукции.

Перефокусировка

[ редактировать ]

В более широком смысле тезис перефокусировки заключается в том, что нет необходимости реконструировать следующую редукцию, чтобы разложить ее на следующем этапе редукции. Другими словами, эти промежуточные редукты могут быть вырублены .

Наглядно:

         contract    refocus    contract    refocus    contract        
       o--------->o---------->o--------->o---------->o--------->o------
      /            \         /            \         /            \     
     /    recompose \       /    recompose \       /    recompose \    
    /                \     /                \     /                \   
   / decompose        \   / decompose        \   / decompose        \  
  /                    \ /                    \ /                    \ 
 o                      o                      o                      o

Интенционально , тезис перефокусировки заключается в том, что вырубка лесов достигается за счет продолжения разложения контрактума в текущем контексте. [1] [2]

let rec iterate_cc_rf (vod : value_or_decomposition_cc) : result =
  match vod with
    Val_cc v ->
     Normal_form v
  | Dec_cc (pr, kd, kr) ->
     (match contract pr with
        Contractum e ->
         iterate_cc_rf (decompose_expression_cc e kd kr)
      | Error s ->     (*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*)
         Wrong s);;

let normalize_cc_rf (e : expression) : result =
  iterate_cc_rf (decompose_cc e);;

В подчеркнутом коде декомпозиция продолжается. Говорят, что эта функция нормализации не содержит редукций , поскольку она не перечисляет ни одного из редуктов в последовательности редукции.

На практике два продолжения дефункциональны в традиционных контекстах первого порядка, вывернутых наизнанку, что дает реализацию Феляйзена и Хиба семантики редукции : [5] семантика малых шагов, разработанная независимо от продолжений и дефункционализации, но чье представление — как показано здесь — может быть получено путем CPS-преобразования и дефункционализации представления Структурной Операционной Семантики.

Набросанная выше конструкция полностью формализуется с помощью Coq Proof Assistant . [4]

Приложения

[ редактировать ]

На протяжении многих лет перефокусировка использовалась для взаимосвязи исчислений и абстрактных машин. [6] [7] Помимо машины CEK , машины Кривина и машины SECD , примеры также включают химическую абстрактную машину и абстрактные машины для JavaScript. [8] [9] [10] Бах Поулсен и Моссес также использовали перефокусировку для реализации структурной операционной семантики и модульной структурной операционной семантики. [11]

В более широком смысле, перефокусировка использовалась для создания систем типов и реализаций сопрограмм. [12] для перехода от проверки типа через сокращение к проверке типа через оценку, [13] для вывода классического секвентивного исчисления вызова по необходимости, [14] для получения интерпретаций постепенно типизированного лямбда-исчисления, [15] и для полного сокращения. [16] [17]

Корректность

[ редактировать ]

Дэнви и Нильсен сформулировали условия переориентации и неофициально доказали их. [2] Сечковский, Бернака и Бернацкий формализовали переориентацию с помощью Coq Proof Assistant . [18] Бах Поульсен доказал правильность перефокусировки для XSOS с помощью индукции правил. [19] Бернака, Харатоник и Зелинска обобщили перефокусировку с помощью Coq Proof Assistant . [20] Используя Agda , Свиестра доказал шаг перефокусировки как часть формализации синтаксического соответствия между исчисление со стратегией приведения нормального порядка и машиной Кривина . [21] Также используя Agda , Розовский доказал шаг перефокусировки как часть формализации синтаксического соответствия между исчисление с использованием стратегии сокращения аппликативного порядка и машины CEK . [22]

  1. ^ Jump up to: а б Дэнви, Оливье ; Нильсен, Лассе Р. (2001). Синтаксические теории на практике . Второй международный семинар по программированию на основе правил (RULE 2001). Том. 59. Электронные заметки по теоретической информатике. дои : 10.7146/brics.v9i4.21721 .
  2. ^ Jump up to: а б с Дэнви , Оливье; Нильсен, Лассе Р. (2004). Перефокусировка в семантике редукции (Технический отчет). БРИКС. дои : 10.7146/brics.v11i26.21851 . РС-04-26.
  3. ^ https://delimited-continuation.github.io/refocusing-arithmetic-expressions.ml
  4. ^ Jump up to: а б Дэнви , Оливье (2023). Вырубка лесов: переориентация (Технический отчет).
  5. ^ Феллизен, Матиас ; Хиб, Роберт (1992). «Пересмотренный отчет о синтаксических теориях последовательного управления и состояния». Теоретическая информатика . 103 (2): 235–271. дои : 10.1016/0304-3975(92)90014-7 .
  6. ^ Берначка, Малгожата; Дэнви, Оливье (2007). «Бетонная основа для экологических машин» . Транзакции ACM в вычислительной логике . 9 (1). Статья №6: 1–30. дои : 10.7146/brics.v13i3.21909 .
  7. ^ Берначка, Малгожата; Дэнви, Оливье (2007). «Синтаксическое соответствие между контекстно-зависимыми исчислениями и абстрактными машинами» . Теоретическая информатика . 375 (1–3): 76–108. дои : 10.7146/brics.v12i22.21888 .
  8. ^ Дэнви, Оливье ; Милликин, Кевин (2008). «Рациональная деконструкция машины SECD Ландина с оператором J». Логические методы в информатике . 4 (4): 1–67. arXiv : 0811.3231 . дои : 10.2168/LMCS-4(4:12)2008 . S2CID   7926360 .
  9. ^ Шербануц, Траян Флорин; Рошу, Григоре ; Месегер, Хосе (2009). «Переписывание логического подхода к операционной семантике» . Информация и вычисления . 207 (2): 305–340. дои : 10.1016/j.ic.2008.03.026 . hdl : 2142/11265 .
  10. ^ Ван Хорн, Дэвид; Возможно , Мэтью (2018). Аналитическая платформа для JavaScript (технический отчет).
  11. ^ Бах Поульсен, Каспер; Моссес, Питер Д. (2013). «Создание специализированных интерпретаторов модульной структурной операционной семантики». Логический синтез и преобразование программ . Конспекты лекций по информатике. Том. 8901. Синтез и преобразование логических программ, 23-й международный симпозиум, LOPSTR 2013. стр. 220–236. дои : 10.1007/978-3-319-14125-1_13 . ISBN  978-3-319-14124-4 .
  12. ^ Антон, Конрад; Тиманн, Питер (2010). Ввод сопрограмм . Том. 6546. Тенденции функционального программирования - 11-й Международный симпозиум (TFP). стр. 16–30.
  13. ^ Сергей, Илья (2012). Эксплуатационные аспекты систем типов: взаимовыводная семантика проверки типов и постепенные типы для владения объектом (Диссертация). КУ Левен.
  14. ^ Ариола, Зена М.; Даунен, Пол; Наката, Кейко; Саурин, Алексис; Хьюго, Гербелен (2012). Классические секвенциальные исчисления по требованию: единство семантических артефактов . Функциональное и логическое программирование, 11-й международный симпозиум, FLOPS 2012. Springer. стр. 32–46. дои : 10.1007/978-3-642-29822-6_6 .
  15. ^ Гарсиа-Перес, Альваро; Ногейра, Пабло; Сергей, Илья (2014). «Вывод интерпретаций постепенно типизированного лямбда-исчисления» . Материалы семинара ACM SIGPLAN 2014 по частичной оценке и управлению программами . Частичная оценка и манипулирование программами на основе семантики (PEPM 2014). стр. 157–168. дои : 10.1145/2543728.2543742 . ISBN  9781450326193 .
  16. ^ Мунк, Йохан (2007). Исследование синтаксических и семантических артефактов и его применение для определения лямбда-выражений, сильной нормализации и слабой нормализации при наличии состояния (Диссертация). Орхусский университет. дои : 10.7146/brics.v15i3.21938 .
  17. ^ Гарсиа-Перес, Альваро; Ногейра, Пабло (2014). «О синтаксическом и функциональном соответствии между гибридными (или многослойными) нормализаторами и абстрактными машинами» . Наука компьютерного программирования . 95 (2): 176–199. дои : 10.1016/j.scico.2014.05.011 .
  18. ^ Сечковский, Филип; Берначка, Малгожата; Бернацкий, Дариуш (2011). «Автоматизация вывода абстрактных машин из семантики редукции:: Общая формализация перефокусировки в Coq». Автоматизация вывода абстрактных машин из семантики редукции . Конспекты лекций по информатике. Том. 6647. Реализация и применение функциональных языков. стр. 72–88. дои : 10.1007/978-3-642-24276-2_5 . ISBN  978-3-642-24275-5 .
  19. ^ Бах Поульсен, Каспер (2015). Семантика расширяемой системы переходов (Диссертация). Университет Суонси.
  20. ^ Берначка, Малгожата; Харатоник, Витольд; Зелинская, Клара (2017). Генерализованная перефокусировка: от гибридных стратегий к абстрактным машинам . Том. 84. 2-я Международная конференция по формальным структурам вычислений и дедукции (FSCD 2017). стр. 1–17.
  21. ^ Свирстра, Воутер (2012). «От математики к абстрактной машине: формальный вывод исполняемой машины Кривина» . Электронные труды по теоретической информатике . 76 . Материалы четвертого семинара по математическо структурированному функциональному программированию (MSFP 2012): 163–177. arXiv : 1202.2924 . дои : 10.4204/EPTCS.76.10 . S2CID   14668530 .
  22. ^ Розовский, Войцех (2021). Формально проверенный вывод исполняемой и завершающей машины CEK из лямбда-p-hat-исчисления с вызовом по значению (PDF) (Диссертация). Университет Саутгемптона.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 80e3dfd1adf9dfe0dd268fe47a52a55c__1711843620
URL1:https://arc.ask3.ru/arc/aa/80/5c/80e3dfd1adf9dfe0dd268fe47a52a55c.html
Заголовок, (Title) документа по адресу, URL1:
Refocusing (semantics) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)