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