Perché non è semplice contare il numero di parole in una lingua normale?


8

Dato un DFA, A, sia L (A) a indicare il numero di parole che A accetta. Penso che sia facile calcolare L (A): tradurre la codifica di A in un'espressione regolare. Se la stella di Kleene appare ovunque nell'espressione, la lingua è infinita. Altrimenti: scorrere e contare tutte le combinazioni di parole che è possibile creare utilizzando l'espressione (in pratica se sull'espressione è presente un operatore +, moltiplicare la quantità di parole legali per la quantità di stringhe collegate dal + ..)

È sbagliato? Grazie in anticipo


3
εnon è un linguaggio infinito.
David Richerby,

Risposte:


12

Sì, questo è sbagliato, a causa dell'ambiguità.

Considera la seguente lingua: (a+aa)+a(a+ϵ).

Con il tuo metodo, vediamo 4 parole, a,aa,aa,a. Ma abbiamo duplicati! Esistono diversi modi per creare la stessa parola nell'espressione regolare data.

Un metodo migliore è utilizzare la programmazione dinamica su un DFA minimo per la tua lingua, senza stati "morti". Se il DFA minimo è ciclico, la lingua è infta, quindi possiamo supporre che non ci siano cicli. L'uso di un DFA è la chiave, perché il determinismo significa che esiste esattamente un percorso attraverso il DFA per ogni parola.

Quello che fai è creare una ricorrenza per il numero di parole che terminano in un determinato stato:

  • 1 parole termina allo stato iniziale: ϵ
  • Per ogni stato q, il numero di parole che terminano lì è la somma del numero di parole che terminano in ogni stato con una transizione in q.

Il numero totale di parole è quindi la somma del numero di parole che terminano in ogni stato finale.


2
Vale la pena notare che queste ricorrenze possono sempre essere risolte dall'algebra del computer, ad esempio per le funzioni di generazione. Quindi sì, il linguaggio normale è in realtà facile da contare.
Raffaello

9

A complemento della risposta di jmite, non è troppo difficile calcolare il numero di parole in una lingua normale, usando il metodo "matrice di trasferimento". Questo è lo stesso della programmazione dinamica di jmite, ma la tecnica ha ulteriori applicazioni come l'enumerazione asintotica.

Dato un DFA, costruisci a Q×Q matrice M (dove Q è l'insieme di stati) in cui M(i,j) è il numero di lettere che causano lo spostamento di DFA dallo stato j dichiarare i. Permettere1q0 e 1Fessere gli indicatori per lo stato iniziale e per gli stati accettanti, rispettivamente. Infine, lascian=|Q|.

Il numero di parole di lunghezza m è cm:=1FMm1q0. Calcolarecm per 0m<2n. Secn++c2n1>0quindi la lingua accettata dal DFA è infinita. Altrimenti, il numero di parole nella lingua èc0++cn1.

(Quando si calcola la potenza di M, è necessario prestare attenzione alla grandezza delle voci, che è esponenziale in m. Poiché la loro dimensione è solo polinomiale, l'algoritmo risultante viene eseguito in un tempo polinomiale.)


2
Adoro questo approccio. Ho anche scoperto che calcolare gli autovalori diMin realtà corrispondono alle radici del denominatore nell'approccio della funzione generatrice e che, forse non sorprende, questi autovalori sono invarianti alla minimizzazione di DFA. Tuttavia, non ho assolutamente idea di come interpretarlo correttamente.
Lee

1
Ciò non è così sorprendente, dato che lo è la funzione generatrice P(z)=n=01FMn1q0zn, che semplifica P(z)=1F(IzM)11q0. È possibile ottenere un risultato ancora più esplicito ripetendo questo calcolo utilizzando la forma JordanM, che presenta gli autovalori.
Yuval Filmus,

7

In realtà, puoi ancora derivare formule di conteggio per espressioni regolari non ambigue con stelle di Kleene all'interno.

Data la definizione induttiva di un'espressione regolare come:

eRe:=xΣe0 e1e0+e1e

Considera la seguente traduzione [[]]:ReC(z) che prende un'espressione regolare e la traduce in una funzione razionale dal valore complesso:

[[xΣ]]=z[[e0 e1]]=[[e0]]×[[e1]][[e0+e1]]=[[e0]]+[[e1]][[e]]=11[[e]]

Possiamo dimostrare che questa traduzione restituisce un'espressione razionale facendo induzione strutturale ee notando che tutte le operazioni utilizzate sul lato destro preservano la razionalità.

Supponiamo che l'espressione regolare e che abbiamo inserito non è ambiguo, quindi troveremmo che la funzione razionale è indicata da [[e]]C(z) è in realtà la funzione generatrice della famiglia di parole accettate dalla lingua sottostante e, classificati in base alla loro lunghezza.

Ad esempio, considera la lingua (ab), che definisce il linguaggio delle corse di a delimitato da b. Ora, questa espressione regolare è inequivocabile, quindi possiamo eseguire il nostro trucco di traduzione:

[[(ab)]]=11[[ab]]=11([[a]]×[[b]])=11(11[[a]]×z)=11z1z=12+124z

A quanto pare, data la precedente funzione generatrice, sarà l'estrazione del suo coefficiente

[zn][[(ab)]]=2n1+δ(n)2
dove
δ(n)={1if n=00otherwise

In effetti, dalla nostra traduzione [[]] genera funzioni razionali, possiamo usare una decomposizione parziale della frazione per creare una formula di enumerazione per qualsiasi espressione regolare non ambigua.

Supponiamo di avere una funzione razionale irriducibile

r(z)+p(z)q(z)
dove r,p,q sono polinomi, quindi puoi scomporlo in
r(z)+C0zq0++Cnzqn
dove qk sono le radici di q(z). Esistono alcuni casi angolari tecnici (come la molteplicità delle radici, ecc.), Ma è relativamente facile eseguire l'estrazione dei coefficienti sull'espressione sopra:
[zn]Czq=C×qn

In effetti, la decomposizione della frazione parziale si generalizza in funzioni razionali multivariate, quindi puoi effettivamente costruire formule di conteggio per query come "Quante parole ci sono dove ci sono n as e m bS?"

Sfortunatamente, la misura in cui questo metodo sarà utile termina quando hai un'espressione ambigua.

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.