Підрахунок слів, прийнятих звичайною граматикою


26

З огляду на звичайну мову (NFA, DFA, граматику чи регулярний вираз), як можна підрахувати кількість прийнятих слів на даній мові? Представляють інтерес як «з рівно n літерами», так і «з максимум n літерами».

У Маргарети Акерман є дві статті на відповідну тему перерахування слів, прийнятих у НФА, але я не зміг їх змінити, щоб ефективно підрахувати.

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


Я припускаю, що ви маєте на увазі "кількість прийнятих слів розміром ", чи щось подібне? інше, яка кількість прийнятих слів дляΣ nΣ
Suresh Venkat

Відповіді:


37

Для DFA, в якому початковим станом є стан , кількість слів довжиною які закінчуються у стані є , де - матриця передачі DFA (матриця, в якій число в рядку та стовпці - це кількість різних вхідних символів, які спричиняють перехід від стану до стану ). Таким чином, ви можете порахувати прийняття слів довжиною точно легко, навіть коли є помірно великим, просто обчисливши потужність матриці та додавши записи, відповідні станам приймання.k i A k [ 0 , i ] A i j i j k k0kiAk[0,i]Aijijkk

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

Це не працює для НФА. Я підозрюю, що найкраще зробити це просто перетворити на DFA, а потім застосувати алгоритм живлення матриці.


2
Ідеальна відповідь: очевидно лише раз, коли ви її прочитали.
Чарльз

1
Цей підхід має експоненціальний найгірший час виконання, якщо у вас є вхід, окрім DFA. Це для вас не проблема, @Charles? Ви, здається, включаєте в себе запитання регулярних виразів, NFA та граматик, а також запитуєте про ефективний спосіб.
Рафаель

17

Нехай = ( Q = { д 1 , ... , д п } , Σ , & delta ; , Q F ) бути (недетермінірованного) кінцевий автомат з початком стану д 1 , Q FQ і & delta ; Q × Σ × Q .A=(Q={q1,,qn},Σ,δ,QF)q1QFQδQ×Σ×Q

Нехай генеруюча функція для всіх слів, які можна прийняти, починаючи з q i , тобто n- й коефіцієнт розширення її рядів [ z n ] Q i = | { w | w | = n w  прийнято від  q i } | .Qi(z)qin[zn]Qi=|{w|w|=nw accepted from qi}|

Ясно:

Qi(z)=[qiQF]+(qi,a,qj)δxQj(z)

Розв’яжіть отриману (лінійну) систему рівнянь для (використовуючи Mathematica або подібний інструмент). Тоді [ z n ] Q 1 - бажана величина.Q1[zn]Q1

Це сходить до техніки, введеної для граматик Хомським та Шютценбергером (1963); він легко передається на кінцеві автомати.

Редагувати: Якщо ви хочете врахувати -переходи, просто залиште коефіцієнт x у сумі за відповідний перехід. Подібно, якщо у вас є "стиснуті" ребра, тобто замість символу a Σ слово w Σ k на переході, замініть x на x k .εxaΣwΣkxxk


Я ціную історичну ноту!
Чарльз

1
Е, це насправді метод, який працює дуже добре (і простий, як тільки ви його отримаєте) за багатьох обставин. Наприклад, ви можете робити CFG точно таким же чином.
Рафаель

1
Бачу, я неправильно зрозумів. У такому випадку, якщо ви хочете прочитати це, я рекомендую Kuich (1970), який я вважав більш доступним, ніж робота C&S. Він також висвітлює це у своїй книзі, яку я не пам’ятаю.
Рафаель

1
Ви хочете сказати, що ви можете рахувати слова довжиною звичайною мовою в поліноміальний час і не будувати DFA? На питання про складність цього питання на MO: mathoverflow.net/questions/162186/…n
joro

1
@joro У разі однозначних граматик, я думаю, що це правда, так.
Рафаель

7

Я думаю, що це складна проблема підрахунку, див. Цей документ: Підрахунок розміру регулярних послідовностей заданої довжини дорівнює # P: S. Kannan, Z. Sweedyk та SR Mahaney. Підрахунок та випадкове генерування рядків у звичайних мовах. У симпозіумі ACM-SIAM з дискретних алгоритмів (SODA), стор. 551–557, 1995.


1
Повідомлення вище передбачає, що вказана довжина не є одинаковою. Якщо натомість довжина є двійковою, проблема складно PSPACE. Я говорю це, ґрунтуючись на доказі того, що вирішувати еквівалентність двох регулярних виразів важко PSPACE. У цьому зменшенні один reg-ex був побудований для прийняття всіх рядків, а інший для прийняття всіх рядків, які не відповідають дійсності відхилення історії обчислень машини PSPACE M на вході w. Використання цього другого регулярного виразу та тривалості історії обчислень M на w як вхід до проблеми, про яку йдеться, також робить цю іншу проблему PSPACE важкою.
Михайло Рудой

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