Вашу проблему можна вирішити за многочлен.
Для початку перетворіть задану NFA в еквівалентну NFA з такими додатковими властивостями:
- Епсилонних переходів немає
- Всі стани доступні з початкового стану
Корисна підпрограма
Припустимо, у нас є NFA , стан і не порожній рядок . Наступна підпрограма дозволить оцінити значення істинності наступного твердження: "кожен шлях у від стану до стану прийняття відповідає рядку, який є префіксом рядка для деякого ". Крім того, ця підпрограма буде запущена в поліноміальний час.NqsNqsnn
Спочатку побудуйте NFA допомогою стан, який приймає всі рядки, які не є префіксамиS|s|+1snN ″ L ( N ″ ) L ( S ) ∩ L ( N ′ )n|s|sssss…N′NqN′′L(N′′)L(S)∩L(N′) використовуючи стандартну конструкцію перетину NFA. Зауважимо, що всі ці конструкції є поліномами за розміром вхідних даних.
Потім просто перевірте, чи мова порожня (що можна зробити в поліноміальний час за допомогою простого пошуку графіка). тоді і тільки тоді, коли , або іншими словами, кожен рядок у відсутній у . Іншими словами, мова порожня, якщо і лише тоді, коли приймає лише рядки, які є префіксами для деякого . Це можна перефразовувати як саме твердження, яке ми намагалися оцінити: "кожен шлях у від стану до стану прийняття відповідає рядку, який є префіксом рядка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( s m ) y - x = s m ( y - x ) t s n n r ( s m ) x t r ( s m ) y t - префікс . Але за результатами підпрограми ми знаємо, що не є префіксом для жодного . Таким чином, не може бути префіксом , і за бажанням набір рядків не містить префіксів.(sm)y−x=sm(y−x)tsnnr(sm)xtr(sm)yt
Таким чином, я показав, що якщо основний алгоритм виводить, що мова даної мови NFA містить нескінченну підмножину без префіксу, то це насправді так.
Коректність (друга половина)
Далі я покажу другу половину: якщо мова даної NFA містить нескінченну підмножину без префіксу, то основний алгоритм виведе цей факт.
Припустимо, мова даної NFA містить нескінченну підмножину без префіксів. Нехай - сукупність (прийнятих) обчислювальних шляхів, що відповідають цим рядкам. Зауважте, що A - це нескінченна сукупність прийняття контурів обчислень, відповідні рядки яких ніколи не є префіксами один одного.AA
Скажіть, що стан "циклічно" в NFA, якщо існує цикл в NFA через цей стан, а "не циклічно" в іншому випадку. Розглянемо всі шляхи від стартового стану до будь-якого циклічного стану, які проходять лише через нециклирующиеся стани (за винятком одного стану циклу, де вони опиняються). Нехай P - сукупність цих шляхів. Кожен шлях p∈P не може мати цикл, оскільки тоді стани в цьому циклі були б циклічними станами, і тому p проходив би через циклічний стан. Таким чином, довжини шляхів у P обмежуються вище числом станів у NFA, і тому P є кінцевим (наприклад, якщо стартовий стан є циклічним станом, єдиний такий шлях - порожній шлях).
Ми можемо розділити A на |P|+1 підмножина на основі того, як починаються ті обчислювальні шляхи в AЗокрема, для p∈P , нехай р безліч всіх шляхів обчислення в А , які починаються з шляхом р і нехай Б безліч всіх інших шляхів в A . Ясно, що все р з і В не перетинаються і їх об'єднання всього набору . Крім того, BApApBAApBABмістить лише контури, які ніколи не проходять через циклічний стан, і тому ніколи не циклічно; таким чином, B є кінцевим. Тоді ми можемо зробити висновок, що деякий Ap повинен бути нескінченним (інакше A було б об'єднанням кінцево багатьох кінцевих множин).
Оскільки Ap нескінченний, існує нескінченно багато контурів обчислень, жоден з яких рядків не є префіксами один одного, які приймають шляхи, починаючи з p . Нехай q - стан, досягнутий в кінці шляху p . Можна зробити висновок, що існує нескінченно багато приймаючих шляхів, називаємо цей набір A′ , починаючи з q всі відповідають рядкам, які не є префіксами один одного.
Під час основного алгоритму ми запускаємо підпрограму на стан q та деякі рядки s . Ця підпрограма повідомляє нам, чи відповідає кожен шлях, що починається з q рядок, який є префіксом sn для деякого n . Якби це було так, то всі нескінченно багато прийнятих шляхів в A′ були б префіксами sn для різних n , що означало б, що вони всі префікси один одного. Це не так, тому ми робимо висновок, що коли основний алгоритм виконує підпрограму на стан q, результат - інший можливий результат. Це, однак, призводить головний алгоритм до висновку, що мова NFA містить нескінченну підмножину без префіксу.
Це завершує доказ коректності.