Ваша проблема может быть решена за полиномиальное время.
Для начала преобразуйте данный NFA в эквивалентный NFA со следующими дополнительными свойствами:
- Эпсилон-переходов нет
- Все состояния достижимы из начального состояния
Полезная подпрограмма
Предположим, у нас есть NFA N , состояние q и непустая строка s . Следующая подпрограмма позволит нам оценить значение истинности следующего утверждения: «каждый путь в N от состояния q до состояния принятия соответствует строке, которая является префиксом строки sn для некоторого n ». Кроме того, эта подпрограмма будет выполняться за полиномиальное время.
S|s|+1snn|s|sssss…N′NqN′′ L ( N ″ ) L ( S ) ∩ L ( N ′ )чей язык - используя стандартную конструкцию пересечения NFA. Обратите внимание, что все эти конструкции являются полиномиальными по размеру входных данных.L(N′′)L(S)∩L(N′)
Затем просто проверьте, является ли язык пустым (что можно сделать за полиномиальное время с помощью простого поиска в графе). тогда и только тогда, когда , или, другими словами, каждая строка в отсутствует в . Другими словами, язык пуст тогда и только тогда, когда принимает только строки, которые являются префиксами для некоторого . Это можно перефразировать так, как если бы мы пытались оценить следующее выражение: «каждый путь в от состояния до состояния принятия соответствует строке, которая является префиксом строкиN′′L(N′′)=∅L(S)∩L(N′)=∅L(N′)L(S)N′′N′snnNqsn nдля некоторого . "n
Основной алгоритм
Рассмотрим множество состояний в NFA, которые находятся в некотором цикле. Для каждого такого состояния выполните следующее:q
Пусть - любой простой цикл, содержащий . Пусть будет строкой, соответствующей циклу . Поскольку NFA не имеет эпсилон-переходов, не пусто. Затем примените подпрограмму к NFA, состоянию и строке . Если подпрограмма сообщает нам, что каждый путь, начинающийся с в NFA и заканчивающийся в состоянии принятия, соответствует префиксу для некоторого тогда переходите к следующему состоянию . В противном случае выведите, что данный язык NFA содержит бесконечное подмножество без префиксов.P2qsP2sqsqsnnq
Если мы попробуем каждое состояние которое находится в цикле, и алгоритм никогда не выведет, то выведем, что язык данного NFA не содержит бесконечного подмножества без привилегий.q
Правильность (первая половина)
Во-первых, предположим, что приведенный выше алгоритм утверждает, что данный язык NFA содержит бесконечное подмножество без префиксов. Допустим, этот вывод был выбран с учетом некоторого цикла и некоторого состояния . Как и прежде, - это строка, соответствующая . Тогда мы знаем в соответствии с подпрограммой, что не каждый путь, начинающийся с в NFA и заканчивающийся в состоянии принятия, соответствует префиксу для некоторого (поскольку это единственный выход подпрограммы, который приведет к основному алгоритм вывода при этом ).P2qsP2qsnnq
Пусть - путь, существование которого определяется подпрограммой: путь от до состояния принятия, такого, что соответствующая строка не является префиксом для любого .P3qtsnn
Пусть состоит из копий где достаточно велико, чтобы, Поскольку является циклом через , может рассматриваться как путь от до . Строка, соответствующая ,P′2mP2mm|s|>|t|P2qP′2qqP′2sm
Пусть будет путем от начального состояния до (который существует, поскольку каждое состояние достижимо с самого начала), и пусть будет строкой, соответствующей этому пути.P1qr
Тогда путь, состоящий из , копий и является приемлемым путем вычисления. Строка, соответствующая этому пути, имеет вид . Таким образом, NFA принимает каждую строку вида . Это бесконечный набор строк, принятый NFA, и я утверждаю, что этот набор строк не имеет префиксов. В частности, предположим, что является префиксом с . Другими словами, является префиксом . Поскольку имеет длинуэто означает, чтоP1xP′2P3r(sm)xtr(sm)xtr(sm)xtr(sm)yty>xt(sm)y−xt(sm)y−xm(y−x)|s|≥m|s|>|t|t является префиксом . Но мы знаем по выводу подпрограммы, что не является префиксом для любого . Таким образом, не может быть префиксом , и при желании набор строк не имеет префиксов.(sm)y−x=sm(y−x)tsnnr(sm)xtr(sm)yt
Таким образом, я показал, что если основной алгоритм выводит, что данный язык NFA содержит бесконечное подмножество без префиксов, то это действительно так.
Правильность (вторая половина)
Далее я покажу другую половину: если язык данного NFA содержит бесконечное подмножество без префиксов, то главный алгоритм выведет этот факт.
Предположим, что данный язык NFA содержит бесконечное подмножество без префиксов. Пусть будет множеством (принимающих) вычислительных путей, соответствующих этим строкам. Обратите внимание, что - это бесконечный набор принимающих вычислительных путей, соответствующие строки которых никогда не являются префиксами друг друга.AA
Скажем, что в NFA состояние «зацикливается», если в NFA существует петля, и в противном случае «зацикливается». Рассмотрим все пути от начального состояния до любого состояния зацикливания, которое проходит только через состояния без зацикливания (за исключением одного состояния зацикливания, в котором они заканчиваются). Пусть будет множеством этих путей. Каждый путь не может иметь цикл, так как тогда состояния в этом цикле были бы состояниями цикла, и поэтому проходил бы через состояние цикла. Таким образом, длины путей в ограничены сверху числом состояний в NFA, и поэтому конечно (например, если начальное состояние является состоянием цикла, то единственным таким путем является пустой путь).Pp∈PpPP
Мы можем разбить на подмножества, основываясь на том, как начинаются эти пути вычисления вВ частности, для , пусть множество всех путей вычисления в , которые начинаются с путем и пусть множество всех других путей в . Ясно, что все с и не пересекаются и их объединение всего набора . Кроме того, содержит только пути, которые никогда не проходят через состояние зацикливания и, следовательно, никогда не зацикливаются; таким образом, конечно. Мы можем заключить, что некоторыеA|P|+1Ap∈PApApBAApBABBApдолжно быть бесконечным (иначе будет объединением конечного числа конечных множеств).A
Поскольку бесконечен, существует бесконечно много вычислительных путей, ни одна из строк которых не является префиксами друг друга, которые принимают пути, начинающиеся с . Пусть будет состоянием, достигнутым в конце пути . Мы можем заключить, что существует бесконечно много принимающих путей, называем этот набор , начиная с все они соответствуют строкам, которые не являются префиксами друг друга.AppqpA′q
Во время основного алгоритма мы запускаем подпрограмму в состоянии и некоторой строке . Эта подпрограмма сообщает нам, соответствует ли каждый принимающий путь, начинающийся с , строке, которая является префиксом для некоторого . Если бы это было так, то все бесконечно много принимающих путей в были бы префиксами для различных , что означало бы, что все они являются префиксами друг друга. Это не так, поэтому мы заключаем, что когда основной алгоритм запускает подпрограмму в состоянииqsqsnnA′snnqРезультатом является другой возможный результат. Это, однако, приводит к тому, что основной алгоритм выводит, что язык NFA содержит бесконечное подмножество без префиксов.
Это завершает доказательство правильности.