Яка різниця між терміном переписування та відповідності шаблону?


25

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

Відповіді:


26

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

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

(л,r)С[лσ]С[rσ]С[.]σ), тоді як відповідність шаблонів у сучасних мовах, таких як 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, версія 98", розділ 4.2 , або просто фактор приклад у "Learn you a Haskell" ).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.