Що таке лема про накачування в термінах неспеціалістів?


82

Я побачив це запитання і мені було цікаво, що таке лема про накачування ( Вікіпедія не дуже допомогла).

Я розумію, що це в основному теоретичний доказ, який повинен бути істинним, щоб мова могла бути в певному класі, але крім того, я насправді цього не розумію.

Хтось намагається пояснити це на досить детальному рівні зрозумілим способом не математикам / докторантам?


2
Я твердо впевнений, що не існує комбінації клавіш на математику / TCS: "терміни неспеціалістів" не змусять вас зрозуміти. Тим не менш, ми, звичайно, широко обговорили це питання з інформатики ; дивись тут , тут і тут .
Рафаель

1
Зверніть увагу, що від студентів першого курсу зазвичай очікують, що вони розуміють теорему та її доведення та застосовують її, тому запит на щось „зрозуміле не [...] докторським ступіням” легко виконувати, переглядаючи будь-який підручник з офіційних мов.
Рафаель

Лемма про накачування не є доказом: як випливає з назви, це лема .
nbro

Відповіді:


157

Лемма про накачування - це простий доказ того, що мова не є регулярною, що означає, що для неї неможливо створити машину скінченного стану. Канонічним прикладом є мова (a^n)(b^n). Це проста мова, яка має просто будь-яку кількість as, за якою слідує така ж кількістьb s. Тож струни

ab
aabb
aaabbb
aaaabbbb

тощо знаходяться в мові, але

aab
bab
aaabbbbbb

тощо не є.

Досить просто побудувати FSM для таких прикладів:

FSM

Цей буде працювати аж до n = 4. Проблема полягає в тому, що наша мова не обмежувала російську мову, і кінцеві державні машини повинні бути, ну, кінцевими. Незалежно від того, скільки станів я додаю до цієї машини, хтось може дати мені дані, де n дорівнює кількості станів плюс один, і моя машина вийде з ладу. Отже, якщо існує машина, побудована для читання цієї мови, там десь повинен бути цикл, щоб зберегти кількість станів кінцевою. Додавши ці цикли:

FSM 2

всі рядки нашої мови будуть прийняті, але є проблема. Після перших чотирьох aс машина втрачає рахунок того, скільки aс було введено, оскільки вона залишається в тому ж стані. Це означає, що після чотирьох я можу додати в aрядок стільки s, скільки хочу, не додаючи жодного bs, і все одно отримати те саме повернене значення. Це означає, що рядки:

aaaa(a*)bbbb

з (a*)поданням будь-якої кількості as, машина прийме всі, хоча вони, очевидно, не всі на мові. У цьому контексті ми сказали б, що частина рядка (a*)може бути прокачана. Той факт, що машина скінченного стану є скінченною і n не обмежена, гарантує, що будь-яка машина, яка приймає всі рядки мовою, ПОВИННА мати цю властивість. Машина повинна в певний момент зациклюватись, і в той момент, коли вона зациклює мову, можна перекачувати мову. Тому для цієї мови неможливо створити жодну машину кінцевого стану, і мова не є звичайною.

Пам’ятайте, що регулярні вирази та кінцеві автомати еквівалентні , то замінюйте aта bвідкривайте та закривайте теги Html, які можуть бути вбудовані один в одного, і ви можете зрозуміти, чому не можна використовувати регулярні вирази для синтаксичного аналізу Html


2
Ваша друга діаграма також є неправильною, оскільки може створювати baaaabbbb.
Джеймс,

3
@James, що правда, це можна було б виправити досить просто, додавши ще один стан прийняття, але просто для простоти я залишу це як є.
Графіка Noob

1
Хороша відповідь, але не згадується, що
лемму

1
Це навіть остаточно не свідчить про a^n b^nнерегулярність, а також не пропонує багато інтуїції щодо леми про накачування.
Рафаель

1
@GraphicsNoob Лемма про накачування - це НЕ доказ, це лема, як випливає з назви. Лемма є твердження , що було доведено. Лему можна розглядати як меншу, не настільки важливу теорему, яка зазвичай використовується для доведення чи показування інших положень чи тверджень. Я не вірю, що відповідь, яка починає стверджувати, що "лемма про накачування - це доказ", наразі має 114 голосів "за", тому питання та відповіді слід голосувати за допомогою опису чи пояснення.
nbro

15

Це пристрій, призначений для доведення того, що дана мова не може належати до певного класу.

Давайте розглянемо мову збалансованих дужок (що означає символи '(' та ')', включаючи всі рядки, які збалансовані у звичайному значенні, і жоден, який не є). Ми можемо використовувати лему про накачування, щоб показати, що це не є регулярним.

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

LFSR Consulting надала хороший опис. Ми можемо намалювати синтаксичний аналізатор для звичайної мови як кінцеву сукупність вікон та стрілок, причому стрілки представляють символи та поля, що їх з’єднують (виконуючи роль «стану»). (Якщо це складніше цього, це не звичайна мова.) Якщо ми можемо отримати рядок, довший за кількість вікон, це означає, що ми проходили через одне поле більше одного разу. Це означає, що у нас був цикл, і ми можемо пройти через нього стільки разів, скільки хочемо.

Отже, для звичайної мови, якщо ми можемо створити довільно довгий рядок, ми можемо розділити його на xyz, де x - символи, які нам потрібні, щоб дістатись до початку циклу, y - фактичний цикл, а z - все, що ми потрібно зробити рядок дійсним після циклу. Важливим є те, що загальна довжина x та y обмежена. Зрештою, якщо довжина більша за кількість ящиків, ми, очевидно, пройшли інший ящик, роблячи це, і тому є цикл.

Отже, нашою збалансованою мовою ми можемо почати з написання будь-якої кількості лівих дужок. Зокрема, для будь-якого даного синтаксичного аналізатора ми можемо записати більше лівих парен, ніж є полів, тому аналізатор не може визначити, скільки лівих парен є. Отже, x - це деяка кількість залишених парен, і це виправлено. y - це також деяка кількість лівих парен, і це може збільшуватися необмежено довго. Можна сказати, що z - це деяка кількість правильних парен.

Це означає, що у нас може бути рядок з 43 лівих та 43 правих панелей, розпізнаних нашим синтаксичним аналізатором, але синтаксичний аналізатор не може визначити це із рядка з 44 лівих та 43 правих панелей, який не є нашою мовою, тому синтаксичний аналізатор не може проаналізувати нашу мову.

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


Відмінна відповідь і читання для тих, хто прагне вловити збалансовані рядки за допомогою регулярних виразів.
Джастін Джонсон,

9

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

На практиці лемми про накачування недостатньо, щоб ДОКАЗАТИ правильність мови, а скоріше як спосіб довести протиріччя і показати, що мова не входить до класу мов (звичайна або без контексту), показуючи лемму про накачування не працювати на це.


Що ви маєте на увазі " недостатньо, щоб ДОКАЗАТИ правильність мови"? Під "правильним", мабуть, ви мали на увазі регулярне. Дійсно, звичайна мова проявляє властивість накачування, але якщо мова проявляє властивість накачування, це не означає, що вона обов’язково є регулярною. З іншого боку, якщо мова не має властивості накачування, то ми впевнені, що це не регулярно. В основному властивість накачування необхідна, але недостатня, щоб показати, що мова є регулярною.
nbro

4

В основному, у вас є визначення мови (наприклад, XML), що дозволяє визначити, чи є даний рядок символів ("слово") членом цієї мови чи ні.

Лемма про накачування встановлює метод, за допомогою якого ви можете вибрати "слово" з мови, а потім застосувати до нього деякі зміни. Теорема стверджує, що якщо мова є регулярною, ці зміни повинні дати "слово", яке все ще є з тієї ж мови. Якщо слово, яке ви придумали, не є мовою, тоді мова не могла бути звичайною.


3

Проста лемма про накачування - це та для звичайних мов, які є наборами рядків, описаних, крім іншого, кінцевими автоматами. Основною характеристикою кінцевої автоматизації є те, що вона має лише кінцевий обсяг пам'яті, що описується її станами.

Тепер припустимо, у вас є рядок, який розпізнається кінцевим автоматом і який достатньо довгий, щоб "перевищити" пам'ять автоматизації, тобто в яких станах потрібно повторити. Потім є підрядок, де стан автомата на початку підрядка такий самий, як стан у кінці підрядка. Оскільки читання підрядка не змінює стан, його можна видаляти або дублювати довільну кількість разів, не будучи при цьому розумним автомат. Отже, ці змінені рядки також повинні бути прийняті.

Існує також дещо складніша лемма про накачування для контекстно-вільних мов, де ви можете видалити / вставити те, що інтуїтивно може розглядатися як відповідні дужки в двох місцях рядка.


Ваш другий абзац приємний, але перший трохи поганий: "Проста лемма про накачування - це та для звичайних мов". Що робити для звичайних мов? Навіщо нам потрібна лема про накачування? Яке відношення має лемма про накачування до звичайної мови? Вам слід відповісти на всі ці питання, ІМО.
nbro

@starblue: Не могли б ви сказати, чому якщо мова $ {a} $, мінімальна довжина накачування - $ 2 $; якщо мова $ {a ^ n: n∈ℕ} $, то мінімальна довжина перекачування становить $ 1 $. докладніше тут :( math.stackexchange.com/questions/1508471/minimum-pumping-length/… ).
Justin

0

За визначенням регулярними мовами називаються ті, що розпізнаються кінцевим автоматом стану. Подумайте про це як про лабіринт: держави - це кімнати, переходи - це односторонні коридори між кімнатами, є початкова кімната і вихідна (остання) кімната. Як говорить назва "скінченний автомат", існує кінцева кількість кімнат. Кожного разу, коли ви подорожуєте коридором, ви записуєте лист, написаний на його стіні. Слово можна розпізнати, якщо ви можете знайти шлях від початкової до останньої кімнати, проходячи коридорами, позначеними її буквами, у правильному порядку.

Лемма про накачування говорить, що існує максимальна довжина (довжина накачування), для якої ви можете блукати лабіринтом, ніколи не повертаючись до кімнати, через яку ви проходили раніше. Ідея полягає в тому, що, оскільки існує лише стільки окремих кімнат, у які можна пройти повз певну точку, тобі доведеться або вийти з лабіринту, або перетнути свої колії. Якщо вам вдається пройти довший шлях, ніж ця довжина накачування в лабіринті, тоді ви їдете в об’їзд: ви вставляєте на свій шлях (принаймні один) цикл, який можна було б видалити (якщо ви хочете, щоб перетин лабіринту розпізнати менше слово) або повторювати (накачувати) нескінченно довго (дозволяючи розпізнавати наддовге слово).

Існує подібна лема для контекстно-вільних мов. Ці мови можуть бути представлені як слово, прийняте автоматами, що висуваються вниз - це автомати з кінцевим станом, які можуть використовувати стек для вирішення, які переходи виконувати. Тим не менше, оскільки існує ще обмежена кількість станів, пояснена вище інтуїція переноситься, навіть завдяки формальному вираженню властивості може бути дещо складнішою .


@ Шукаю таку відповідь. Чи може початковий і кінцевий номер бути однаковим? Я застряг у цьому коментарі: Якщо мова $ {a} $, мінімальна довжина накачування - $ 2 $; якщо мова $ {a ^ n: n∈N} $, то мінімальна довжина накачування - $ 1 $. Чи можете ви мені допомогти. докладніше тут :( math.stackexchange.com/questions/1508471/minimum-pumping-length /… ).
Justin

0

Якщо говорити неспеціалістами, я думаю, у вас це майже правильно. Це метод доказу (насправді два) для доведення того, що мова НЕ є у певному класі.

Для прикладу розглянемо звичайну мову (регулярний вираз, автомати тощо) з нескінченною кількістю рядків. У певний момент, як сказав starblue, у вас закінчується пам’ять, оскільки рядок занадто довгий для автомата. Це означає, що повинен бути фрагмент рядка, який автомат не може визначити, скільки його копій у вас є (ви в циклі). Отже, будь-яка кількість копій цього підрядка в середині рядка, і ви все ще перебуваєте на мові.

Це означає, що якщо у вас є мова, яка НЕ ​​володіє цією властивістю, тобто існує досить довгий рядок із НІЯким підрядком, який ви можете повторити будь-яку кількість разів і все одно бути в мові, тоді мова не є звичайною.


Останнє речення, принаймні, хибне. Мова, що складається з рядка "а", є звичайною, але ви не можете її прокачати. Якщо ви можете накачати рядок певним чином, це не регулярно. Наприклад, мова із символами '(' і ')', складена з усіх збалансованих виразів (і не має незбалансованих), не є регулярною, і ви це доводите, накачуючи "()".
Девід Торнлі,

@David, дякую, виправлене останнє речення. Але я думаю, що ви помиляєтесь щодо збалансованих парен. Я не думаю, що ви можете довести, що паренс не є регулярним за допомогою накачування леми. Я думаю, parens насоси.
Брайан Постов

0

Для прикладу візьмемо цю мову L = a n b n .

Тепер спробуйте візуалізувати скінченний автомат для вищевказаної мови для деяких російських .

якщо n = 1, рядок w = ab . Тут ми можемо створити скінченний автомат без петлі, якщо n = 2, рядок w = a 2 b 2 . Тут ми можемо зробити кінцевий автомат без петель

якщо n = p , рядок w = a p b p . По суті, скінченний автомат можна припустити з 3 етапами. Перший етап, він займає ряд входів і переходить на другий етап. Подібно від етапу 2 до етапу 3. Назвемо ці етапи як x , y та z .

Є кілька спостережень

  1. Безумовно, x міститиме "a" та z міститиме "b".
  2. Тепер нам слід чітко визначити y :
    • регістр a : y може містити лише "a"
    • випадок b : y може містити лише "b"
    • випадок c : y може містити комбінацію "a" і "b"

Отже, кінцеві стани автоматів для етапу y повинні мати можливість приймати входи 'a' і 'b', а також не повинні приймати більше a та b, які неможливо злічити.

  1. Якщо стадія y приймає лише одне "a" і одне "b", тоді потрібно два стани
  2. Якщо потрібно два "a" і один "b", потрібні три стани без петель і так далі ....

Отже, дизайн етапу у суто нескінченний. Ми можемо зробити його кінцевим, лише поставивши певні цикли, і якщо ми ставимо цикли, кінцевий автомат може приймати мови за межами L = a n b n . Отже, для цієї мови ми не можемо побудувати кінцевий автомат. Отже, це не регулярно.


-1

Це не пояснення як таке, але воно просте. Для a ^ nb ^ n наш FSM повинен бути побудований таким чином, що b повинен знати кількість а, що вже проаналізовано, і прийматиме таку ж кількість b. FSM не може просто робити подібні речі.

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