Что такое обычный язык? - PullRequest
74 голосов
/ 16 июля 2011

Я пытаюсь понять концепцию уровней языков (обычный, контекстно-зависимый, контекстно-зависимый и т. Д.).

Я могу легко это найти, но все объяснения, которые я нахожу, - это набор символови говорить о комплектах .У меня два вопроса:

  1. Можете ли вы описать словами, что такое обычный язык и как эти языки различаются?

  2. Где люди учатсяпонять это?Как я понимаю, это формальная математика?У меня было несколько курсов в универе, которые использовали его, и почти никто не понимал этого, поскольку преподаватели просто предполагали, что мы это знали.Где я могу узнать это и почему люди «ожидают» знать это во многих источниках?Это как пробел в образовании.

Вот пример :

Любой язык, принадлежащий этому набору, является обычнымалфавит.

Как язык может быть "над" чем-либо?

Ответы [ 3 ]

142 голосов
/ 16 июля 2011

В контексте информатики слово - это конкатенация символов . Используемые символы называются алфавит . Например, некоторые слова, образованные из алфавита {0,1,2,3,4,5,6,7,8,9}, будут 1, 2, 12, 543, 1000 и 002.

A language - это подмножество всех возможных слов. Например, мы могли бы хотеть определить язык, который захватывает всех элитных агентов MI6. Все они начинаются с двойного 0, поэтому слова в языке будут 007, 001, 005 и 0012, но не 07 или 15. Для простоты мы говорим, что язык - это « над алфавитом» вместо «подмножества слов, образованных объединением символов в алфавите».

В информатике мы теперь хотим классифицировать языки. Мы называем язык обычным , если можно решить, находится ли слово в языке с помощью алгоритма / машины с постоянной (конечной) памятью, проверяя все символы в слове один за другим. Язык, состоящий только из слова 42, является регулярным, так как вы можете решить, находится ли слово в нем, не требуя произвольных объемов памяти; Вы просто проверяете, является ли первый символ 4, второй - 2, и следуют ли еще какие-либо числа.

Все языки с конечным числом слов являются регулярными, потому что мы можем (теоретически) просто построить дерево потока управления постоянного размера (вы можете представить его как набор вложенных if -статий, которые проверяют одну цифру после другой). Например, мы можем проверить, находится ли слово на языке «простых чисел от 10 до 99», с помощью следующей конструкции, не требующей памяти, кроме той, которая кодирует, в какой строке кода мы находимся в данный момент:

if word[0] == 1:
  if word[1] == 1: # 11
      return true # "accept" word, i.e. it's in the language
  if word[1] == 3: # 13
      return true
...
return false

Обратите внимание, что все конечные языки регулярны, но не все регулярные языки конечны; наш язык двойного 0 содержит бесконечное количество слов (007, 008, но также 004242 и 0012345), но может быть проверен с постоянной памятью: чтобы проверить, принадлежит ли ему слово, проверьте, первый символ - 0, а второй символ - 0. Если это так, примите это. Если слово короче трех или не начинается с 00, это не кодовое имя MI6.

Формально конструкция конечного автомата или регулярной грамматики используется для доказательства правильности языка. Они похожи на if -выступления выше, но допускают произвольно длинные слова. Если есть конечный автомат, есть и обычная грамматика, и наоборот, поэтому достаточно показать либо. Например, конечный автомат для нашего языка двойного 0:

start state:  if input = 0 then goto state 2
start state:  if input = 1 then fail
start state:  if input = 2 then fail
...
state 2: if input = 0 then accept
state 2: if input != 0 then fail
accept: for any input, accept

Эквивалентная регулярная грамматика:

start → 0 B
B → 0 accept
accept → 0 accept
accept → 1 accept
...

Эквивалентное регулярное выражение :

00[0-9]*

Некоторые языки не обычные. Например, язык любого числа 1, за которым следует то же число 2 (часто записывается как 1 n 2 n , для произвольного n ) не является регулярным - вам нужно больше, чем постоянный объем памяти (= постоянное количество состояний), чтобы сохранить число 1 s, чтобы решить, есть ли слово в языке.

Обычно это следует объяснять в курсе теоретической информатики. К счастью, Википедия довольно хорошо объясняет и формальные и обычные языки .

5 голосов
/ 16 июля 2011

Вот некоторые эквивалентные определения из Википедии :

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

  • это может быть принято детерминированным конечным автоматом.
  • может быть принят недетерминированным конечным автоматом
  • это можно описать формальным регулярным выражением.

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

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

Одной из наиболее важных характеристик является то, что в отличие от языков без контекста обычный язык не поддерживает произвольную вложенность / рекурсию, но у вас есть произвольное повторение.

Язык всегда имеет основной алфавит, который является набором разрешенных символов. Например, алфавит языка программирования обычно будет ASCII или Unicode, но в теории формального языка также неплохо говорить о языках поверх других алфавитов, например, двоичного алфавита, где единственными допустимыми символами являются 0 и * 1030. *.

В моем университете нам преподавали некоторую формальную теорию языка в классе компиляторов, но, вероятно, в разных школах они разные.

0 голосов
/ 16 июля 2011

Я узнал большинство подобных вещей из "Введение в теорию вычислений" Майкла Сипсера ;Я нашел это действительно полезным.

Вот содержание:

  • Введение
  • Часть 1: Автоматы и языки
    • 1.Обычные языки
    • 2.Языки без контекста
  • Часть 2: Теория вычислимости
    • 3.Церковно-тюринговый тезис
    • 4.Разрешимость
    • 5.Сводимость
    • 6.Дополнительные разделы теории вычислимости
  • Часть 3: Теория сложности
    • 7.Сложность времени
    • 8.Космическая сложность
    • 9.Непреодолимость
    • 10.Расширенные темы в теории сложности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...