Что такое лемма о накачке в терминах непрофессионала?

Я видел этот вопрос , и мне было любопытно, что это была за лемма о перекачке (Википедия не не очень помогает).

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

Кто-нибудь хочет попытаться объяснить это на довольно детальном уровне так, чтобы это было понятно не математикам / докторантам?


person shsteimer    schedule 20.01.2009    source источник
comment
Я твердо уверен, что к математике / TCS нет короткого пути: простые термины не помогут вам понять. Тем не менее, мы, конечно, подробно рассмотрели этот вопрос в информатике; см. здесь, здесь и здесь.   -  person Raphael    schedule 07.04.2015
comment
Обратите внимание, что от студентов-первокурсников обычно ожидается понимание теоремы и ее доказательства и их применение, поэтому просьбу о чем-то, понятном [...] не докторантам, легко выполнить, заглянув в любой учебник по формальным языкам.   -  person Raphael    schedule 07.04.2015
comment
Лемма о перекачке не является доказательством: как следует из названия, это лемма.   -  person nbro    schedule 15.11.2015


Ответы (9)


Лемма о накачке - это простое доказательство того, что язык не является регулярным, а это означает, что для него нельзя построить конечный автомат. Канонический пример - язык (a^n)(b^n). Это простой язык, который представляет собой любое количество a, за которым следует такое же количество b. Итак, струны

ab
aabb
aaabbb
aaaabbbb

и т. д. на языке, но

aab
bab
aaabbbbbb

и т. д. нет.

Для этих примеров достаточно просто построить конечный автомат:

FSM

Этот будет работать до n = 4. Проблема в том, что наш язык не накладывал никаких ограничений на n, а конечные автоматы должны быть, ну, конечными. Независимо от того, сколько состояний я добавлю к этой машине, кто-нибудь может дать мне ввод, где n равно количеству состояний плюс один, и моя машина выйдет из строя. Поэтому, если может быть создана машина для чтения этого языка, где-то внутри должен быть цикл, чтобы количество состояний оставалось конечным. С этими добавленными петлями:

FSM 2

все строки на нашем языке будут приняты, но есть проблема. После первых четырех as машина теряет счет введенного as, потому что остается в том же состоянии. Это означает, что после четырех я могу добавить к строке столько a, сколько захочу, без добавления каких-либо b, и все равно получить то же возвращаемое значение. Это означает, что строки:

aaaa(a*)bbbb

с (a*), представляющим любое количество a, все будут приняты машиной, даже если они явно не все на языке. В этом контексте мы бы сказали, что часть строки (a*) может быть накачана. Тот факт, что конечный автомат конечен, а n не ограничено, гарантирует, что любая машина, которая принимает все строки на языке, ДОЛЖНА обладать этим свойством. В какой-то момент машина должна зацикливаться, и в той точке, в которой она зацикливается, язык можно прокачать. Следовательно, для этого языка невозможно построить конечный автомат, и язык не является регулярным.

Помните, что регулярные выражения и конечные автоматы эквивалентны, затем замените a и b открывающим и закрывающим HTML теги, которые можно встраивать друг в друга, и вы поймете, почему это невозможно использовать регулярные выражения для синтаксического анализа HTML

person Graphics Noob    schedule 19.12.2009
comment
Ваша вторая диаграмма также неверна, поскольку может дать baaaabbbb. - person James; 04.05.2010
comment
@James, это правда, это можно исправить довольно просто, добавив еще одно состояние приема, но для простоты я оставлю его как есть. - person Graphics Noob; 05.05.2010
comment
Хороший ответ, но не упоминается, что лемма о перекачке может быть использована для доказательства того, что язык ЯВЛЯЕТСЯ контекстно-свободным, а не только для опровержения регулярности. - person MobileMon; 10.12.2013
comment
Это даже не доказывает окончательно, что a^n b^n нерегулярно, и не предлагает большой части интуиции относительно леммы о накачке. - person Raphael; 07.04.2015
comment
@GraphicsNoob Лемма о накачке - это НЕ доказательство, это лемма, как следует из названия. Утверждение было доказано. Лемму можно рассматривать как меньшую, не столь важную теорему, которая обычно используется для доказательства или демонстрации других предложений или утверждений. Я не верю, что ответ, который начинает говорить, что лемма о накачке является доказательством, в настоящее время набирает 114 голосов, поэтому вопросы и ответы должны быть одобрены с описанием или объяснением. - person nbro; 28.12.2015
comment
@Nuncameesquecideti, или вы можете сказать, что есть масса людей, которым нужно понимать вещи более простыми словами, почему такие вещи, как теоретические системы координат, могут быть спортом только для математиков? - person CodeYogi; 22.08.2016
comment
@GraphicsNoob есть ли похожая интуиция для CFG? - person CodeYogi; 20.09.2016

Это устройство, предназначенное для доказательства того, что данный язык не может принадлежать к определенному классу.

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

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

LFSR Consulting предоставила хорошее описание. Мы можем изобразить синтаксический анализатор для обычного языка в виде конечного набора прямоугольников и стрелок, где стрелки представляют символы, а прямоугольники их соединяют (действуя как «состояния»). (Если это сложнее, то это не обычный язык.) Если мы можем получить строку длиннее, чем количество ящиков, это означает, что мы прошли через одну ячейку более одного раза. Это означает, что у нас есть цикл, и мы можем повторять его столько раз, сколько захотим.

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

Итак, в нашем сбалансированном языке мы можем начать с написания любого количества левых скобок. В частности, для любого данного парсера мы можем написать больше левых скобок, чем прямоугольников, и поэтому парсер не может определить, сколько там левых скобок. Следовательно, x - это некоторое количество левых скобок, и это фиксировано. y - это также некоторое количество левых пар, и оно может увеличиваться бесконечно. Можно сказать, что z - некоторое количество правильных парных скобок.

Это означает, что у нас может быть строка из 43 левых и 43 правых скобок, распознаваемых нашим анализатором, но парсер не может определить это из строки из 44 левых скобок и 43 правых скобок, чего нет в нашем языке, поэтому парсер не может разобрать наш язык.

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

person David Thornley    schedule 30.04.2009
comment
Отличный ответ и чтение для тех, кто хочет фиксировать сбалансированные строки с помощью регулярных выражений. - person Justin Johnson; 12.02.2011

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

На практике перекачивания лемм недостаточно, чтобы ДОКАЗАТЬ, что язык правильный. ), показав, что лемма о накачке для него не работает.

person alexwood    schedule 20.01.2009
comment
Что вы имеете в виду, недостаточно, чтобы ДОКАЗАТЬ, что язык правильный? Под правильным, я полагаю, вы имели в виду регулярный. В самом деле, регулярный язык демонстрирует свойство перекачивания, но если язык демонстрирует свойство перекачивания, это не обязательно означает, что он регулярный. С другой стороны, если язык не демонстрирует свойство перекачивания, то мы уверены, что это не обычный язык. По сути, свойство накачки необходимо, но недостаточно, чтобы показать, что язык является регулярным. - person nbro; 15.11.2015

По сути, у вас есть определение языка (например, XML), с помощью которого можно определить, является ли данная строка символов («слово») членом этого языка или нет.

Лемма о перекачке устанавливает метод, с помощью которого вы можете выбрать «слово» из языка, а затем применить к нему некоторые изменения. Теорема утверждает, что если язык является регулярным, эти изменения должны дать «слово», которое все еще принадлежит к тому же языку. Если слово, которое вы придумали, отсутствует в языке, значит, язык вообще не мог быть регулярным.

person Welbog    schedule 20.01.2009

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

Теперь предположим, что у вас есть строка, которую распознает конечный автомат и которая достаточно длинна, чтобы «превзойти» память автоматизации, т.е. в которой состояния должны повторяться. Затем есть подстрока, в которой состояние автомата в начале подстроки совпадает с состоянием в конце подстроки. Поскольку чтение подстроки не меняет состояния, она может быть удалена или продублирована произвольное количество раз без вмешательства автомата. Так что эти модифицированные строки также должны быть приняты.

Существует также несколько более сложная лемма о перекачке для контекстно-свободных языков, где вы можете удалить / вставить то, что интуитивно можно рассматривать как совпадающие круглые скобки в двух местах строки.

person starblue    schedule 20.01.2009
comment
Ваш второй абзац хорош, но первый немного плох: лемма о простой перекачке подходит для обычных языков. Для чего нужен тот, который предназначен для обычных языков? Зачем нужна лемма о накачке? Какая связь между леммой о накачке и регулярным языком? Вы должны ответить на все эти вопросы, ИМО. - person nbro; 28.12.2015
comment
@starblue: Не могли бы вы сказать, почему. Если язык - $ {a} $, минимальная длина перекачки составляет $ 2 $; если язык - $ {a ^ n: n∈ℕ} $, то минимальная длина перекачки составляет $ 1 $. подробнее здесь: (math.stackexchange.com/questions/1508471/minimum-pumping-length/). - person justin; 25.02.2016

По определению регулярные языки - это языки, распознаваемые конечным автоматом. Думайте об этом как о лабиринте: состояния - это комнаты, переходы - это коридоры с односторонним движением между комнатами, есть начальная комната и выходная (последняя) комната. Как следует из названия «конечный автомат», количество комнат ограничено. Каждый раз, когда вы путешествуете по коридору, вы записываете письмо, написанное на его стене. Слово можно распознать, если вы найдете путь от начальной до последней комнаты, проходя через коридоры, помеченные его буквами, в правильном порядке.

Лемма о перекачке говорит, что существует максимальная длина (длина перекачки), на которой вы можете бродить по лабиринту, никогда не возвращаясь в комнату, через которую вы прошли раньше. Идея состоит в том, что, поскольку существует очень много отдельных комнат, в которые вы можете пройти, пройдя определенную точку, вы должны либо выйти из лабиринта, либо пересечь свои пути. Если вам удастся пройти в лабиринте более длинный путь, чем эта длина прокачки, то вы выберете обходной путь: вы вставите (хотя бы один) цикл на свой путь, который можно убрать (если вы хотите, чтобы ваше пересечение лабиринта было распознавать меньшее слово) или повторяться (накачиваться) бесконечно (позволяя распознать сверхдлинное слово).

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

person Francois G    schedule 30.04.2009
comment
@ Ищу такой ответ. Могут ли начальная и последняя комнаты быть одинаковыми? Я застрял на этом комментарии: Если язык - $ {a} $, минимальная длина перекачки составляет $ 2 $; если язык - $ {a ^ n: n∈N} $, то минимальная длина перекачки составляет $ 1 $. Не могли бы вы мне помочь. подробнее здесь: (math.stackexchange.com/questions/1508471/minimum-pumping-length/). - person justin; 29.02.2016

С точки зрения непрофессионала, я думаю, вы почти правы. Это метод доказательства (на самом деле два) для доказательства того, что язык НЕ принадлежит определенному классу.

Например, рассмотрим обычный язык (регулярное выражение, автоматы и т. Д.) С бесконечным количеством строк в нем. В определенный момент, как сказал starblue, у вас заканчивается память, потому что строка слишком длинная для автомата. Это означает, что должен быть кусок строки, который автомат не может определить, сколько у вас копий (вы находитесь в цикле). Итак, любое количество копий этой подстроки в середине строки, и вы все еще находитесь на языке.

Это означает, что если у вас есть язык, который НЕ имеет этого свойства, т. Е. Имеется достаточно длинная строка с подстрокой NO, которую вы можете повторять любое количество раз и при этом оставаться на языке, тогда язык не является регулярным.

person Brian Postow    schedule 30.04.2009
comment
По крайней мере, последнее предложение неверно. Язык, состоящий из строки a, обычный, но вы не можете его прокачать. Если вы можете накачать струну определенным образом, это не всегда. Например, язык с символами '(' и ')', состоящий из всех сбалансированных выражений (и без несбалансированных), не является регулярным, и вы доказываете это с помощью pumping (). - person David Thornley; 30.04.2009
comment
@ Дэвид, спасибо, поправил последнее предложение. Но я думаю, что вы ошибаетесь насчет сбалансированных родителей. Я не думаю, что вы можете доказать, что parens не является регулярным, с помощью леммы о перекачке. Я думаю, что Parens насосы. - person Brian Postow; 01.05.2009

Например, возьмите этот язык L = a n b n.

Теперь попробуйте визуализировать конечный автомат для вышеуказанного языка для некоторых 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. Now we have to be clear about y:
    • case a: y may contain 'a' only
    • case b: y может содержать только 'b'
    • case c: y может содержать комбинацию 'a' и 'b'

Таким образом, состояния конечного автомата для этапа y должны иметь возможность принимать входные данные 'a' и 'b', а также не должны принимать больше значений a и b, которые нельзя подсчитать.

  1. Если этап y принимает только один 'a' и один 'b', тогда требуются два состояния
  2. Если он принимает два 'a' и один 'b', требуются три состояния без циклов и так далее ....

Так что дизайн stage y абсолютно бесконечен. Мы можем сделать его конечным, только поместив несколько циклов, и если мы поместим циклы, конечный автомат сможет принимать языки за пределами L = a n b n < / sup>. Итак, для этого языка мы не можем построить конечный автомат. Следовательно, это не регулярно.

person Sajeev Ramakrishnan    schedule 26.10.2010

Это не объяснение как таковое, но оно простое. Для a ^ n b ^ n наш автомат должен быть построен таким образом, чтобы b должен знать количество уже проанализированных a и принимать такое же n количество b. Автомат просто не может делать такие вещи.

person SMUsamaShah    schedule 07.03.2012