Conteggio delle parole accettate da una grammatica regolare


26

Data una lingua normale (NFA, DFA, grammatica o regex), come si può contare il numero di parole accettate in una determinata lingua? Entrambi "con esattamente n lettere" e "con al massimo n lettere" sono interessanti.

Margareta Ackerman ha due articoli sull'argomento correlato dell'enumerazione delle parole accettate da un NFA, ma non sono stato in grado di modificarle per contare in modo efficiente.

Sembra che la natura ristretta delle lingue normali dovrebbe rendere il conteggio relativamente semplice: mi aspetto quasi una formula più che un algoritmo Sfortunatamente le mie ricerche finora non hanno prodotto nulla, quindi devo usare termini sbagliati.


Presumo che intendi "numero di parole accettabili di dimensione " o qualcosa del genere? altrimenti, qual è il numero di parole accettate perΣ nΣ
Suresh Venkat,

Risposte:


38

Per un DFA, in cui lo stato iniziale è lo stato , il numero di parole di lunghezza k che finiscono nello stato i è A k [ 0 , i ] , dove A è la matrice di trasferimento del DFA (una matrice in cui il il numero nella riga i e nella colonna j è il numero di simboli di input diversi che causano una transizione dallo stato i allo stato j ). Quindi puoi contare accettando parole di lunghezza esattamente k facilmente, anche quando k0kiAk[0,i]Aijijkk è moderatamente grande, semplicemente calcolando una potenza di matrice e aggiungendo le voci corrispondenti agli stati di accettazione.

La stessa cosa funziona per accettare parole di lunghezza al massimo , con una matrice leggermente diversa. Aggiungi una riga e una colonna aggiuntive della matrice, con una nella cella che sia sia nella riga che nella colonna, una nella nuova riga e la colonna dello stato iniziale e uno zero in tutte le altre celle. L'effetto di questa modifica alla matrice è di aggiungere un altro percorso allo stato iniziale ad ogni potenza.k

Questo non funziona per gli NFA. Ho il sospetto che la cosa migliore da fare sia semplicemente convertire in un DFA e quindi applicare l'algoritmo di alimentazione della matrice.


2
La risposta perfetta: ovvia solo dopo averlo letto.
Charles,

1
Questo approccio ha un'autonomia esponenziale nel caso peggiore se hai input diversi da un DFA. Non è un problema per te, @Charles? Sembri includere espressioni regolari, NFA e grammatiche nelle tue domande e anche chiedere un modo efficiente.
Raffaello,

17

Let sia una (non deterministico) Automazione finiti con iniziare stato q 1 , Q FQ e δ Q × Σ × Q .A=(Q={q1,,qn},Σ,δ,QF)q1QFQδQ×Σ×Q

Sia la funzione generatrice per tutte le parole che possono essere accettati partire q i , che è il n ° coefficiente della sua espansione serie [ z n ] Q i = | { w | w | = n w  accettato da  q i } | .Qi(z)qin[zn]Qi=|{w|w|=nw accepted from qi}|

Chiaramente:

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

Q1[zn]Q1

Questo risale a una tecnica introdotta per le grammatiche da Chomsky e Schützenberger (1963); si trasferisce facilmente su automi finiti.

εxaΣwΣkxxk


Apprezzo la nota storica!
Charles,

1
Ehm, questo è in realtà un metodo che funziona davvero bene (ed è semplice, una volta ottenuto) in molte circostanze. Ad esempio, puoi fare CFG esattamente allo stesso modo.
Raffaello,

1
Vedo, ho frainteso. In tal caso, se vuoi leggere questo, raccomando Kuich (1970) che ho trovato più accessibile del lavoro di C&S. Lo copre anche in un suo libro che non ricordo.
Raffaello,

1
n

1
@joro In caso di grammatiche non ambigue, penso che sia vero, sì.
Raffaello,

7

Penso che questo sia un problema di conteggio difficile, vedi questo documento: Contare la dimensione delle sequenze regolari di una determinata lunghezza è # P-completo: S. Kannan, Z. Sweedyk e SR Mahaney. Conteggio e generazione casuale di stringhe in lingue regolari. Nel simposio ACM-SIAM sugli algoritmi discreti (SODA), pagine 551–557, 1995.


1
Il post sopra presuppone che la lunghezza data sia unaria. Se invece la lunghezza è in binario, il problema è PSPACE-hard. Lo dico sulla base della prova che decidere l'equivalenza di due espressioni regolari è difficile per PSPACE. In quella riduzione, un reg-ex è stato costruito per accettare tutte le stringhe e l'altro per accettare tutte le stringhe che non sono valide rifiutando le storie di calcolo della macchina M PSPACE sull'input w. L'uso di quella seconda espressione regolare e la lunghezza di una cronologia di calcolo di M su w come input per il problema in questione rendono difficile anche questo altro problema di PSPACE.
Mikhail Rudoy,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.