Які моделі обчислення можна виразити через граматики?


18

Це переформулювання програми граматики? попередній запитував Ваг і з багатьма пропозиціями від коментаторів.

Яким чином граматика може розглядатися як зазначена модель обчислення? Якщо, наприклад, ми візьмемо просту без контексту граматику, таку як

G ::= '1' -> '0' '+' '1'
      '1' -> '1' '+' '0'
      '2' -> '2' '+' '0'
      '2' -> '1' '+' '1'
      '2' -> '0' '+' '2'
      '3' -> '3' '+' '0'
      '3' -> '2' '+' '1'
      '3' -> '1' '+' '2'
      '3' -> '1' '+' '2'

Якщо припустити, що аналізатор не розмежовує термінальні та нетермінальні символи, як я продемонстрував тут, то можна виконати просту арифметику для чисел до 3.

Наприклад, візьміть рядок

"2 + 0 + 1"

Запуск аналізатора LR (1) для цього рядка повинен дати нам таке конкретне дерево синтаксису, де результат обчислення зберігається в корені дерева:

           '3'
         /  |  \
        /   |   \
      '2'  '+'  '1'
     / | \
    /  |  \
  '2' '+' '0' 

Таким чином, якщо ми візьмемо граматику як програму, а генератор парсера - компілятор , чи можемо ми розглянути мову специфікації граматики як мову програмування ?

Крім того, чи могли б ми створити програми, повністю завершені Тьюрінгом, вказавши граматики, подібні до того, як ви могли б створювати цілісні програми за допомогою клітинних автоматів або обчислення лямбда ?

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

Крім того, як щодо менш відомих підкласів граматик, таких як

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

G ::= S -> R0 '$'
      S -> R1 '$'
      S -> R2 '$'
      R0 -> '0'
      R0 -> R0 '+' '0'
      R1 -> '1'
      R1 -> R0 '+' '1'
      R1 -> '1' '+' R0
      R1 -> R0 '+' '1' '+' R0
      R2 -> '2'
      R2 -> R0 '+' '2'
      R2 -> '2' '+' R0
      R2 -> R0 '+' '2' '+' R0
      R2 -> R1 '+' '1'
      R2 -> R1 '+' '1' '+' R0

... не те, що насправді щось змінює, але я подумав, що слід це згадати.

EDIT: Ще щось, що мені прийшло в голову, коли я читав відповідь Gasche, - це те, що кожна гілка дерева в моєму прикладі являє собою підрахунок. Якщо розглядати кожне правило виробництва як функцію, де LHS представляє результат, а RHS представляє його аргументи, то структура граматики визначає, як складаються функції.

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

Принаймні, я здогадуюсь, ви могли б поглянути на це так однозначно CFG, що стосується інших граматик, то розумова гімнастика зараз для мене трохи занадто.


3
Ви забули згадати про Видимо Pushdown Automaton (Вкладені слова), такий чудовий і перспективний прилад! Це важливо, оскільки, здається, є мінімальне поліпшення в порівнянні з регулярними виразками, щоб мати можливість аналізувати програми, написані популярними мовами програмування. ( cis.upenn.edu/~alur/nw.html )
Ваг

1
Дякую, це дуже цікаво, я не шукав цього! Є ще декілька інших, які я пропустив, як детермінований контекст, не примикаючи до дерев, індексується і так далі, я просто подумав, що це може бути трохи для одного питання ... Але, можливо, я додам їх
Rehno Lindeque

1
@imz Я маю на увазі граматики, оскільки вони формально визначені в ієрархії Хомського (тобто як набори виробництв). Оскільки я стверджую саме те, що ви говорите: що граматики є програмами, це просто означає клас програм, представлений граматиками (в чому питання).
Rehno Lindeque

1
@imz Якщо чесно, я справді не знайомий з індексованими граматиками, я додав їх лише як задум.
Рехно Ліндеке

1
Я починаю вважати, що, можливо, було б гарною ідеєю розмістити це питання на форумі LtU, а не дивитися на круті дискусії: P. Btw @imz, можливо, найкраще було б прочитати питання як "яким класам граматик відповідають, яким класам програм у" функціональному "сенсі описано Юкка у відповіді Марка Хаммана". Можливо, я повинен зробити це більш зрозумілим ...
Рехно Ліндеке

Відповіді:


10

Між граматиками Чомського типу-0 та машинами Тюрінга існує відповідність один на один .

Це використовується в мові програмування Thue, яка дозволяє писати програми, завершені Тьюрінгом, визначені початковою строкою та набором правил перезапису рядків ( граматика напів-Thue , що еквівалентно граматиці типу-0).

ОНОВЛЕННЯ:

Окрім езотеричних мов "Turing tar-pit", таких як Чт, різні мови загального призначення, що дозволяють програмісту розширити власний синтаксис, можуть використовуватися для виконання повної обчислення Тьюрінга на етапі розбору-компіляції.

Мови в родині Лісп , зокрема звичайний Lisp , є, мабуть, найбільш очевидними прикладами, але, широко кажучи, мови зі статичним перевіркою типу, які не завжди потрібно зупиняти, наприклад, C ++ із шаблонами , Scala та Qi .


Але питання стосується речей, які працюють навпаки: до результату слід дійти не шляхом переписання початкової послідовності символів за правилами, а "результат" обчислення, визначений граматикою в цьому питанні, є початковим символ, який може виробляти послідовність "введення" відповідно до правил граматики.
imz - Іван Захарящев

2
cонcат(qуоте(iн),оут)ТМ(iн)=оут

Я погоджуюся, що відповідність між граматиками Type0 і TM є вагомою відповіддю на питання (особливо, якщо обмежується обчисленням функцій так / ні). Подальша пропозиція моделювати довільну ТМ з граматикою, вводячи певну умову про те, як представити вхідно-вихідні пари, мені здається, не відповідає задуманому інтересу вихідного питання: (продовжувати)
імз - Іван Захарящев

Я розумію це як питання щодо використання саме існуючих рамок граматики та відповідних аналізаторів для виконання обчислень, тобто дозволена форма перекладу між функцією f і граматикою може бути лише: вхід, який я розбирав, як S означає f ( I) = S.
imz - Іван Захарящев

1
На перший погляд, мова програмування Thue, схоже, не підпадає під таке використання граматичного фрейму: хоча він має правила переписування, як граматика, обчислення результату від введення йде в напрямку правил, а не в зворотному порядку. напрямок, як хоче Рехно. (Але, можливо, справа лише в зміні напрямку стрілок у виробництвах: перевести граматику "обчислення як аналізатор" у значенні цього Q у Чт могло б лише змінити напрямки правил, тоді програма Thue прийде до початкових символів, як результати справді, чи не так? ..)
imz - Іван Захарящев

6

Моя відповідь не має наміру бути формальною, точною та абсолютно тематичною. Я думаю, що відповідь Марка Хаммана є досить твердою, але ваше запитання змусило мене подумати про пов'язану тему.

Граматики можна вважати особливими випадками дедуктивних систем: вхід є судженням, а дерево розбору - виведенням судження або доказом того, що судження є дійсним згідно (граматичних) правил.

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

Зауваження: перечитуючи мою відповідь, я думаю, що думка про те, що «розбір дерев - це пошук доказів», є дещо надуманою тут. Пошук доказів швидше протікає в іншому напрямку: один починається з заданого, досить складного судження і, шляхом багаторазового використання правил висновків, що працюють над структурою доказу, можна сподіватися на отримання більш простих аксіом, які не потрібно доводити далі. Тож було б природніше бачити в граматичному плані складні судження як нетермінали, атоми як термінали, а пошук доказів як проблему генерації слів або тест на порожнечу.


Хоча дуже цікаві зауваження. Мій мозок трохи надто стомлений, щоб дати хорошу відповідь зараз, проте в моєму прикладі гілки дерева по суті представляють підрахунки, складені разом за правилами розбору ...
Rehno Lindeque,

6

Крім того, чи могли б ми побудувати програми, повністю завершені Тьюрінгом, задавши граматики…

Я не впевнений, чи правильно я зрозумів ваше запитання, але якщо ви шукаєте мову програмування, засновану на певній системі перезапису рядків, ви, ймовірно, будете втручатися в Refal , який базується на формалізмі алгоритму Маркова (Turing- завершений формалізм, який є також граматичною системою переписування рядків).


1
Я зрозумів питання наступним чином: Рехно зацікавлений у процесі розбору завантаження (визначеному граматикою), який слід розглядати як обчислення результату. Обчислення повинні будувати результат з частин, що йдуть у напрямку, протилежному правилам виробництва граматики. Правила переписування Рефала (IIUC, подібно до мови програмування Thue, згаданої вище) пішли б в іншому напрямку (від введення до результату).
imz - Іван Захарящев

Тепер, коли я замислююся над цим, граматики, що залежать від контексту, містять більше одного символу щодо LHS виробничих правил. Тому я думаю, що реальної практичної різниці немає. Аналізатором мови, що залежить від контексту, була б система переписування рядків, незалежно від того, як ви на це правильно дивитесь?
Rehno Lindeque

@imz дякую за роз’яснення щодо питання Рехно. @Rehno "Аналізатор контекстно-чутливої ​​мови був би системою переписування рядків, незалежно від того, як ви на це правильно дивитесь?" - це, мабуть, має сенс, так.
Артем Пеленицин

Але чи відносяться до правил переписування Рефала недетерміновано? (Або по-іншому: чи буде Refal робити зворотний трекінг у пошуку робочого шляху перезапису?) Якщо ми хочемо моделювати цей підхід "розбору як обчислення" з правилами переписування в зворотному напрямку, нам потрібні недетерміновані правила; розглянути граматику як S -> A a; S -> B b; A -> 0; B -> 0. Якщо ми запрограмуємо це шляхом реверсування правил, нам потрібно вибрати різні правила для обробки 0під час виконання, щоб оцінити "0a" або "0b" до S.
imz - Іван Захарящев

6

(Просто деякі дріб'язкові міркування. Може бути коментар, але занадто довгий.)

Насправді те, що ви описуєте, виглядає фактично як самий природний погляд на те, що таке мова (в розумінні людиною "мови", її призначення) та як граматика визначає мову.

Мова містить (нескінченно багато) правильних синтаксичних форм, які інтерпретуються, щоб дати смислові значення .

Якщо інтерпретація обчислюється, то синтаксичні форми мови можна розглядати як програми, що обчислюють смислові значення.

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

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

fГЯ f(Я)=SЯSГ

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


4

Просто додати:

Чиста логічна програма має декларативне читання та процедурне читання. У цьому звіті обговорюється думка, що їх можна доповнити граматичним читанням, де пункти вважаються переписаними правилами граматики. Мета полягає в тому, щоб показати, що ця точка зору полегшує передачу досвіду від логічного програмування до інших досліджень мов програмування та навпаки. Деякі приклади такої передачі обговорюються. З іншого боку, представлений граматичний погляд виправдовує деякі спеціальні розширення до чистого логічного програмування та полегшує розробку теоретичних основ для таких розширень.

Граматичний погляд на логічне програмування П'єра Дерансарта та Яна Малушинського.


Мабуть, Prolog виник із граматики атрибутів, тож ця думка і почала логічне програмування.
reinierpost

1

А як щодо чисел Peano:

S    -> int
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int

він розпізнає будь-який рядок (номер) цієї форми:

0   // zero
#0  // one
##0 // two

і вона повинна повернути вкладену структуру, глибина якої - число.

Але це починає ускладнюватися, коли потрібно реалізувати просто додаток:

S    -> int
int  -> sum
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int
sum  -> int "+" int

Це має абсолютно сенс у тому, що він буде розпізнавати лише добре сформовані вставки, як це:

#####0 + ####0

Але ця граматика вводить розкол у дереві розбору, коли є сума, тож замість того, щоб мати гарне однорозгалужене дерево, яке безпосередньо відображається на число, ми маємо структуру виразу, ще кілька обчислень від ефективного значення. Тож не проводиться обчислень, а лише розпізнавання. Проблема може бути не в граматиці, а в розборі. Можна замість цього використовувати щось інше, idk ... Ще один момент, який спадає на думку, - це адекватність граматичного формалізму для вираження обчислень. Якщо ви дивитеся на аксіому Пеано (у позначеннях Хаскелла):

1) Nat = Zero
2) Nat = Succ Nat
3) Sum ( Succ X ) ( Y ) = Succ ( X + Y )
4) Sum Zero X = X

Третє правило прямо говорить про перетворення. Невже хтось може уявити, що він має таку ж кількість значень у праві, що не стосується граматики. А якщо так, то як !?

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