В теории формального языка, компьютер науки и лингвистики, иерархия Хомского (иногда называемая иерархией Хомского – Шютценбергера ) является иерархией сдерживания классы формальных грамматик.
Эта иерархия грамматик была описана Ноамом Хомским в 1956 году. Она также названа в честь Марселя-Пауля Шютценбергера, сыгравшего решающую роль в развитие теории формальных языков.
Формальные грамматики этого типа состоят из конечного набора производственных правил (левая часть → правая часть), где каждая сторона состоит из конечной последовательности следующих символов:
A формальная грамматика предоставляет схему аксиомы для (или генерирует) формальный язык, который представляет собой (обычно бесконечное) множество последовательностей символов конечной длины, которые могут быть построены путем применения производственных правил к другой последовательности символов (которая изначально содержит только начальный символ). Правило можно применить, заменив вхождение символов в его левой части на те, которые появляются в его правой части. Последовательность применения правил называется производной. Такая грамматика определяет формальный язык: все слова, состоящие исключительно из терминальных символов, которые могут быть получены путем производных от начального символа.
Нетерминалы часто представлены прописными буквами, терминалы - строчными буквами, а начальный символ буквой S. Например, грамматика с терминалами {a, b}, нетерминалами {S, A, B}, производственными правилами
и начальный символ S, определяет язык всех слов в форме (т.е. n копий a, за которыми следуют n копий b).
Ниже приводится более простая грамматика, которая определяет тот же язык:
Терминалы {a, b}, Нетерминалы {S}, Начальный символ S, Производственные правила
В качестве другого примера, грамматика для подмножества игрушек английского языка задается:
и начальный символ SENTENCE. Пример вывода:
Другие последовательности, которые могут быть получены из этой грамматики: : «идеи ненавидят великих лингвистов», а «идеи порождают». Хотя эти предложения бессмысленны, они синтаксически правильны. Синтаксически неверное предложение (например, «идеи идеи большой ненависти») не может быть получено из этой грамматики. См. «Бесцветные зеленые идеи яростно спят », где есть аналогичный пример, приведенный Хомским в 1957 году; см. грамматику структуры фраз и правила структуры фраз для получения дополнительных примеров естественного языка и проблем формальной грамматики в этой области.
В следующей таблице приведены все четыре типа грамматик Хомского, класс языка, который он генерирует, тип автомата, который его распознает, и форма должна иметь его правила.
Грамматика | Языки | Автомат | Производственные правила (ограничения) * | Примеры |
---|---|---|---|---|
Тип-0 | Рекурсивно перечисляемый | Машина Тьюринга | . (без ограничений) | описывает завершающую машину Тьюринга |
Тип-1 | Контекстно-зависимый | Линейный- ограниченная недетерминированная машина Тьюринга | ||
Тип 2 | Контекстно-свободный | Без -детерминированный автомат выталкивания | ||
Тип 3 | Обычный | Конечный автомат | . и. | |
* Значение символов:.
|
Обратите внимание, что набор грамматик, соответствующий рекурсивным языкам, не является членом этой иерархии; они должны быть правильно между Типом-0 и Типом-1.
Каждый регулярный язык является контекстно-независимым, каждый контекстно-свободный язык является контекстно-зависимым, каждый контекстно-зависимый язык является рекурсивным, и каждый рекурсивный язык рекурсивно перечислим. Все это правильные включения, означающие, что существуют языки с рекурсивным перечислением, которые не являются контекстно-зависимыми, контекстно-зависимыми языками, которые не являются контекстно-независимыми, и контекстно-независимыми языками, которые не являются регулярными.
Грамматики типа 0 включают все формальные грамматики. Они генерируют в точности все языки, которые может распознать машина Тьюринга. Эти языки также известны как рекурсивно перечислимые или языки, распознаваемые по Тьюрингу. Обратите внимание, что это отличается от рекурсивных языков, которые могут быть решены с помощью постоянно останавливающейся машины Тьюринга.
грамматик типа 1 генерируют контекстно-зависимые языки. Эти грамматики имеют правила вида с нетерминал и , и строки терминалов и / или нетерминалов. Строки и могут быть пустыми, но не должно быть пустым. Правило разрешено, если не отображается справа от любого правило. Языки, описываемые этими грамматиками, - это в точности все языки, которые могут быть распознаны линейным ограниченным автоматом (недетерминированной машиной Тьюринга, лента которой ограничена константой, умноженной на длину ввода)
грамматики типа 2 генерируют контекстно-свободные языки. Они определяются правилами формы , где является нетерминалом и - строка терминалов и / или нетерминалов. Эти языки - это в точности все языки, которые могут быть распознаны недетерминированным автоматом выталкивания. Контекстно-свободные языки - или, скорее, его подмножество детерминированного контекстно-свободного языка - являются теоретической основой фразовой структуры большинства языков программирования, хотя их синтаксис также включает контекстно-зависимый разрешение имени из-за объявлений и области действия. Часто для упрощения синтаксического анализа используется подмножество грамматик, например, LL-анализатор.
грамматики типа 3 генерируют обычные языки. Такая грамматика ограничивает свои правила одним нетерминалом в левой части и правой частью, состоящей из одного терминала, за которым, возможно, следует один нетерминал (правый регулярный). В качестве альтернативы, правая часть грамматики может состоять из одного терминала, которому, возможно, предшествует единственный нетерминал (левый регулярный). Они генерируют одни и те же языки. Однако если объединить правила левого регулярного и правого регулярного, язык больше не должен быть регулярным. Правило также разрешено здесь, если не отображается справа любого правила. Эти языки являются в точности всеми языками, которые могут быть определены с помощью конечного автомата. Кроме того, это семейство формальных языков можно получить с помощью регулярных выражений. Обычные языки обычно используются для определения шаблонов поиска и лексической структуры языков программирования.