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 0≤m<2n. Secn+⋯+c2n−1>0quindi la lingua accettata dal DFA è infinita. Altrimenti, il numero di parole nella lingua èc0+⋯+cn−1.

(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=0∞1FMn1q0zn, che semplifica P(z)=1F(I−zM)−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:

e∈Re:=x∈Σ∣e0 e1∣e0+e1∣e∗

Considera la seguente traduzione [[⋅]]:Re→C(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 (a∗b)∗, che definisce il linguaggio delle corse di a delimitato da b. Ora, questa espressione regolare è inequivocabile, quindi possiamo eseguire il nostro trucco di traduzione:

[[(a∗b)∗]]=11−[[a∗b]]=11−([[a∗]]×[[b]])=11−(11−[[a]]×z)=11−z1−z=12+12−4z

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

[zn][[(a∗b)∗]]=2n−1+δ(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)+C0z−q0∗+⋯+Cnz−qn∗
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]Cz−q∗=C×q∗−n

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.