В чем разница между переписыванием терминов и сопоставлением с образцом?

25

Поскольку в Lambda the Ultimate не было ответа, я пробую это снова: системы переписывания терминов используются, например, в автоматизированной теореме, доказывающей символьные вычисления, и, конечно, для определения формальных грамматик. Есть некоторые языки программирования, основанные на переписывании терминов, но, насколько я понимаю, концепция больше известна как сопоставление с образцом . Сопоставление с образцом часто используется в функциональных языках. Барри Джей создал целую теорию, называемую шаблонным исчислением , но он только кратко упоминает переписывание терминов. У меня такое ощущение, что все они ссылаются на одну и ту же основную идею, так что вы можете использовать синоним переписывания терминов и сопоставления с образцом ?

Jakob
источник

Ответы:

26

Один из способов взглянуть на эти две концепции состоит в том, чтобы сказать, что сопоставление с образцом - это особенность языков программирования, позволяющая комбинировать различение в конструкторах и уничтожать термины (одновременно выбирая и локально именуя фрагменты терминов) безопасно, компактно и эффективно. Исследования по сопоставлению с образцом обычно фокусируются на эффективности реализации, например, на том, как минимизировать количество сравнений, которые должен выполнять механизм сопоставления.

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

(l,r)C[lσ]C[rσ]C[.]σ), в то время как сопоставление с образцом в современных языках, таких как Haskell, OCaml или Scala, предусматривает только переписывание «вверху» термина. Это ограничение также, я думаю, наложено в исчислении паттернов Джея. Позвольте мне объяснить, что я имею в виду под этим ограничением. С сопоставлением с образцом в смысле OCaml, Haskell, Scala вы не можете сказать что-то вроде

match M with
   | C[ x :: _ ]  -> printf "%i ...\n" x
   | C[ [] ] -> printf "[]"

Что C[.]здесь? Предполагается, что это переменная, охватывающая контексты с одним отверстием. Но языки, такие как OCaml, Haskell или Scala, не предоставляют программистам переменные, которые находятся в произвольном (однопроходном) контексте, а только переменные, которые находятся в разных значениях. Другими словами, в таких языках вы не можете сопоставить шаблон в произвольной позиции в термине. Вы всегда должны указывать путь от корня шаблона к интересующим его частям. Я предполагаю, что основной причиной наложения этого ограничения является то, что в противном случае сопоставление с образцом будет недетерминированным, поскольку термин может соответствовать шаблону в более чем один способ. Например, термин (true, [9,7,4], "hello", 7)соответствует шаблону C[7]двумя способами, предполагая, что он C[.] ранжируется по таким контекстам.

Мартин Бергер
источник
11

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

Сопоставление с образцом в общем случае имеет дело со следующей проблемой: у вас есть какая-то структура (дерево, список или мультимножество), и вы хотите проверить, соответствует ли структура образцу (или одному из множества шаблонов). Этот вопрос, безусловно, относится к переписыванию терминов, потому что в системах переписывания терминов тот факт, что термин соответствует шаблону, означает, что термин может быть переписан на другой термин, но это не синонимическое переписывание терминов. (Может быть формулировка сопоставления с шаблоном как переписывание: «Учитывая термин, можете ли вы переписать его для соответствия шаблону?», Но я никогда не видел этого.)

Сопоставление с образцом в функциональном языке программирования имеет логическую интерпретацию с точки зрения фокусировки (см. , Например , «Сосредоточение внимания на сопоставлении с образцом» Кришнасвами ). Системы переписывания терминов, с другой стороны, часто сопоставляют по модулю некоторые эквалайзерные свойства, которых нет в большинстве функциональных языков программирования (вы не можете сравнить с мультимножеством в ML или Haskell). Однако не существует фундаментальной причины, по которой соответствующие функциональные свойства не должны присутствовать в функциональных языках.

Роб Симмонс
источник
1
Спасибо за Ваш ответ. Я согласен, что сопоставление с образцом в целом не является синонимом переписывания терминов, но является более основательным. Но если кто-то скажет, что системы с вычислительной мощью основаны на сопоставлении с образцом, я не вижу разницы с системой переписывания терминов с вычислительной мощностью. Можете ли вы далее проиллюстрировать разницу между «имеет логическую интерпретацию» и «некоторые эквалайзерные свойства»?
Якоб
«Я не вижу разницы с системой переписывания терминов с вычислительной мощностью» - я не уверен, что это значит. Как говорит Мартин, переписывание терминов - это общая модель вычислений, а сопоставление с образцом - это особенность, а не модель вычислений.
Роб Симмонс
Можете ли вы далее проиллюстрировать разницу между «имеет логическую интерпретацию» и «некоторые эквалайзерные свойства»? - Никакой мелкой разницы нет - это просто разные свойства, яблоки и апельсины. Я думаю, что любая реальная связь между этими двумя может оказаться довольно глубоким исследовательским вопросом! Пан с глубоким умозаключением - см. Alessio.guglielmi.name/res/cos - вероятно, предназначен.
Роб Симмонс
1

(Я бы лучше написал это как комментарий, но я не могу в настоящее время.)

Поправьте меня, если я ошибаюсь, но, насколько я понимаю, еще одно различие между сопоставлением с образцом и переписыванием терминов, помимо того, что Мартин Бергер сказал в своем превосходном ответе , состоит в том, что правила сопоставления с образцом идут с фиксированным порядком (в реализациях, подобных Haskell's), тогда как с правилами переписывания терминов это не обязательно так. Эта функция, как и следовало ожидать, может иметь большое значение при рассмотрении поведения (в частности, прекращения) правил (см., Например, «Нежное введение в Haskell, версия 98», раздел 4.2 , или просто факториал). пример на "Изучи тебя на Haskell" ).

Люди, более знающие в теории переписывания, могли бы сказать больше об этом (например, как типизация точно соответствует такому сравнению?), Но, мне кажется, справедливо согласиться с Мартином Бергером, в этом смысле можно сказать, что переписывание охватывает сопоставление с образцом (по крайней мере, так как это реализовано в таких языках, как Haskell), в той степени, в которой оба могут (довольно сухо) рассматриваться как устройства, которые просто используют правила, относящиеся к терминам.

Бэзил
источник