Що таке звичайна мова?


80

Я намагаюся зрозуміти концепцію мовних рівнів (звичайний, контекстний, контекстний тощо).

Я можу це легко розглянути, але всі пояснення, які я знаходжу, - це набір символів і розмови про набори . У мене є два запитання:

  1. Чи можете ви описати словами, що таке звичайна мова, і чим мови відрізняються?

  2. Де люди вчаться розуміти ці речі? Як я розумію, це формальна математика? У мене було кілька курсів в університеті, які використовували його, і навряд чи хтось це розумів, оскільки викладачі просто припускали, що ми це знаємо. Де я можу це дізнатись і чому люди "очікують" знати це у стільки джерел? Це ніби розрив в освіті.

Ось приклад :

Будь-яка мова, що належить до цього набору, є звичайною мовою над алфавітом.

Як мова може бути над чим-небудь?


Насправді, Вікіпедія не надто погано пояснює все це. Можливо, ви захочете почати з en.wikipedia.org/wiki/Formal_language, а потім пройти шлях до тем. Наприклад, це було б запропоновано в курсі "теоретичної інформатики".
Барт,

4
Я б сказав, що такі запитання є тематичними для SO. Див. Де обговорювати інформатику? на мета.
hammar

Відповіді:


157

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

Тоді мова - це підмножина всіх можливих слів. Наприклад, ми можемо захотіти визначити мову, яка охоплює всі елітні агенти 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

Зауважте, що всі кінцеві мови є регулярними, але не всі регулярні мови є кінцевими; наша мова double-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 ) не є регулярною - вам потрібно більше постійного обсягу пам'яті (= постійна кількість станів ) для збереження кількості 1s, щоб вирішити, чи є в мові слово.

Це зазвичай слід пояснити в теоретичному курсі інформатики. На щастя, Вікіпедія цілком приємно пояснює як офіційні, так і звичайні мови .


Дякую, я зрозумів усі, крім останнього, нерегулярні мови. Вам потрібна пам’ять, щоб зберегти кількість 1s так, але у прикладі MI6 чи не потрібна пам’ять, щоб пам’ятати, що перші два символи дорівнюють 0?
FBryant87,

2
@ user666254 Завжди дозволяється постійний обсяг пам'яті, оскільки він може кодуватися у стани. Проблема полягає в тому, що вам потрібно більше, ніж будь-який постійний обсяг пам'яті, щоб перевірити на 1 ^ n2 ^ n, коли n наближається до нескінченності. Формально зазвичай ви використовуєте лему про накачування для звичайних мов, щоб показати, що мова не є регулярною.
phihag

1
Щоб бути більш конкретним, вам потрібно 3n + 1 стану, щоб вирішити, чи є рядок мовою 1n2n.
laike9m

4
Я особисто не думаю, що Вікіпедія робить хорошу роботу з пояснення звичайних мов, лише якщо людина не вивчала математичні позначення. Навіть коли вони пояснюють деякі символи та змінні, вони вкладають кілька додаткових матеріалів і не пояснюють їх. Стаття може бути читабельнішою для тих, кому вона не потрібна, але для решти з нас вона потребує роз’яснень.
Andrew S

1
@ P.Soutzikevich Ні, таким же чином за допомогою шкали можна визначити, чи вважається транспортний засіб легковим або вантажним (> 12 тонн), але масштаб не визначає автомобіль. Існує ряд інших способів довести, що мова не є регулярною . Ви маєте рацію в тому, що лемма про накачування регулярних мов дуже тісно пов'язана з визначенням регулярної мови. Це просто не визначає звичайну мову.
Фіхаг

5

Ось деякі еквівалентні визначення з Вікіпедії :

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

  • це може бути прийнято детермінованим кінцевим автоматом.
  • це може бути прийнято недетермінованим кінцевим автоматом
  • це можна описати формальним регулярним виразом.

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

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

Однією з найважливіших характеристик є те, що на відміну від контекстних мов , звичайна мова не підтримує довільне вкладання / рекурсію, але у вас є довільне повторення.

Мова завжди має базовий алфавіт, який є набором дозволених символів. Наприклад, алфавітом мови програмування зазвичай може бути ASCII або Unicode, але у формальній теорії мови також добре говорити про мови над іншими алфавітами, наприклад, двійковий алфавіт, де єдиними дозволеними символами є 0і 1.

У моєму університеті нас викладали деяку формальну теорію мови в класі «Укладачі», але це, мабуть, відрізняється в різних школах.

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