Регулярные языки против нерегулярных [закрыто]
может ли кто-нибудь любезно помочь мне различать регулярные языки (т. е. те, которые могут быть описаны регулярными выражениями) и другие языки, которые не являются регулярными с точки зрения формального определения регулярных языков? Кроме того, можете ли вы привести несколько примеров с обеих сторон?
2 ответов
регулярные языки определяются рекурсивно над алфавитом A следующим образом:
- пустой набор \null является регулярным.
- набор { \eps } является регулярным, где \eps-пустая строка.
- множество { a } является регулярным для всех a \in a
- Если X и Y являются регулярными, то множество { xy / x \in X, y \in Y } также является регулярным.
- Если X и Y являются регулярными, то X \union Y также является регулярным.
- Если X является регулярным, то и { x^n | x \в X и n >= 0 }
в 6 определение x^n связано с самим собой n раз, а x^0 = \eps.
из всех этих шагов, кроме 6, следует, что каждый конечный набор строк над A является регулярным. Все интересное происходит, когда мы рассматриваем бесконечные множества.
регулярные выражения-это просто "язык программирования" для представления регулярных языков. Они так работают. Я буду использовать "regex" в качестве аббревиатуры для регулярных выражение.
- regex \NULL означает набор null.
- регулярное выражение \EPS означает { \eps }.
- регулярное выражение a обозначает множество { a }. Примечание жирным шрифтом a обозначает регулярное выражение, а не символ a, который оно представляет.
- Если регулярное выражение x означает язык X и y означает Y, затем regex xy обозначает язык { xy / x \in X, y \in Y }.
- Если регулярное выражение x означает язык X и y означает Y, затем regex x / y обозначает язык X \union Y.
- Если регулярное выражение x означает язык X, затем регулярное выражение x* обозначает язык { x^n / x \in X, n >= 0 }.
это прямо подразумевается определением, что каждое регулярное выражение описывает регулярный язык. Это не трудно сделать. другой способ и показать, что каждый регулярный язык должен иметь соответствующее регулярное выражение.
Так что примеры регулярных языков вы просили все те, что некоторые регулярные выражения стоит. Пример: ab* - это язык всех строк, начинающихся с a, за которым следует любое число b и так далее.
есть некоторые довольно прохладные языки, которые кажутся слишком сложными, чтобы быть постоянным, но на самом деле. Мой любимый набор S_k двоичных представлений (алфавит {0, 1}) для всех чисел N, таких как N==0 mod k. Вы можете выбрать любое положительное целое число k, которое вам нравится.
существует замечательная теорема из-за Kleene, которая идет дальше. Это показывает, что языки, распознаваемые Детерминированные Конечные Автоматы - простые государственные машины - и недетерминированные конечные автоматы-государственные машины с переходами на пустой строке и допускающие несколько переходов на каждом символе - это именно регулярные языки. Они все обладают такой же выразительной силой. То есть, если вы дадите мне любой из { regex, DFA, NFA}, я смогу конвертировать в два других каждый раз.
регулярное выражение для любого набора S_k, выберите k, как вы хотите, описанное выше, является дьявольски сложным, но DFA, который распознает его, довольно прост. Теорема клина позволяет вам использовать лучший инструмент.
конечные автоматы эффективно имеют конечную память, поэтому вы ожидаете - и Вы были бы правы - что языки с каким-то бесконечным структура не будет регулярной. Самый простой такой язык, вероятно, { a^n b^n | n >= 0 }. Это множество всех строк a, за которыми следует равное число b. Любой конечный автомат (следовательно, regex или NFA) должен не "хранить" значение N, записанное при просмотре a, если n достаточно велико. Поэтому он должен потерпеть неудачу при поиске равного количества b, которые появляются позже во входных данных.
другое утверждение той же идеи: если вы утверждаете, что у вас есть DFA из N состояний это распознает { a^n b^n / n >= 0 }, я дам вам строки { a^k b^k | k > N}, где он должен будет потерпеть неудачу, потому что он должен "цикл", т. е. повторить хотя бы одно состояние. В этот момент is потерял счет того, сколько он прочитал до сих пор. Он обречен получить неправильный ответ на некоторые из этих длинных строк.
Лемма накачки использует этот факт. Он обеспечивает математически строгий способ доказательства (в противоречии с Леммой), что языки не являются регулярными. Каждый хороший компьютер студент-естествоиспытатель учится " качать его вверх (или вниз)" способом, необходимым PL для доказательства того, что множества нерегулярны.
примеры нерегулярных языков включают вышеупомянутые { a^n b^n | n >= 0 } наряду с аналогичными языками, которые требуют "балансировки" различных видов: { a^n b^m | n > m}, {a^n b a^n} и бесконечность подобных.
нерегулярные языки могут быть далее подразделены на наборы возрастающей сложности: контекстные свободные языки, контекстно-зависимые, рекурсивные множества, рекурсивно перечисляемые множества и неразрешимые множества. Но это только начало бесконечной иерархии все более сложных наборов строк. Эта бесконечность множеств бесконечно сложна! Наслаждаться этим.
выражение является регулярным, если его можно разложить на четыре основных языковых понятия:
- один символ. Например,
a
,b
,c
- связь между двумя регулярными выражениями. Например,
ab
,abc
- разрыв между двумя регулярными выражениями. Например,
a|b
- a Клин-стар, например:
(ab)*
другие аспекты регулярные выражения-это просто синтаксический сахар. Например,(ab)+
сокращенно (ab)(ab)*
и [A-F]
сокращенно A|B|C|D|E|F
.
можно доказать, что некоторый язык( набор строк) не может быть выражен регулярным выражением с помощью насосные Лемма. Например, язык {ab,aabb,aaabbb,...}
где их столько a
осталось как b
's не может быть выражено с помощью регулярного выражения.
есть иерархия определяется Хомский о том, как такие языки могут быть распознаны (например, с помощью контекстные свободные грамматики (CFG), контекстно-зависимые грамматики (CSG), машины Тьюринга и Машины Oracle.