Tatsächlich können Sie immer noch Zählformeln für eindeutige reguläre Ausdrücke mit Kleene-Sternen ableiten .
In Anbetracht der induktiven Definition eines regulären Ausdrucks als:
e ∈ R e : = x ∈ & Sgr; | e0 e1∣e0+e1∣e∗
Betrachten Sie die folgende Übersetzung ,einen regulären Ausdruck übernimmt und sie in eine komplexwertige rationale Funktion übersetzt:[[ ⋅]] : R e → C (z)
[[ x ∈ Σ]]][[ e0 e1]]]][[ e0+ e1]]]][[e∗]]]]= z=[[e0]]] ×[[ e1]]]]=[[ e0]]] +[[ e1]]]]= 11 -[[ e]]]
Wir können zeigen, dass diese Übersetzung einen rationalen Ausdruck zurückgibt, indem wir eine strukturelle Induktion für und feststellen, dass alle auf der rechten Seite verwendeten Operationen die Rationalität bewahren.e
Angenommen, der reguläre Ausdruck , den wir eingeben, ist eindeutig, dann würden wir feststellen, dass die mit bezeichnete rationale Funktione ist tatsächlich die Erzeugungsfunktion für die Familie von Wörtern, die von der e zugrunde liegenden Sprache akzeptiert werden, geordnet nach ihrer Länge.[[ e]] ∈ C (z)e
Betrachten Sie zum Beispiel die Sprache , die die Sprache der Läufe eines durch b begrenzten Laufs definiert . Dieser reguläre Ausdruck ist eindeutig, sodass wir unseren Übersetzungstrick ausführen können:( a∗b )∗einb
[[(a∗b)∗]]=11−[[a∗b]]=11−([[a∗]]×[[b]])=11−(11−[[a]]×z)=11−z1−z=12+12−4z
As it turns out, given the above generating function, its coefficient extraction will be
[zn][[(a∗b)∗]]=2n−1+δ(n)2
where
δ(n)={10if n=0otherwise
In fact, since our translation [[⋅]] generates rational functions, we can use a partial fraction decomposition to create an enumeration formula for any unambiguous regular expression.
Suppose you have a irreducible rational function
r(z)+p(z)q(z)
where
r,p,q are polynomials, then you can decompose this into
r(z)+C0z−q∗0+⋯+Cnz−q∗n
where
q∗k are the roots of
q(z). There's a bit of technical corner-cases (like multiplicity of roots, etc), but it's relatively easy to do coefficient extraction on the expression above:
[zn]Cz−q∗=C×q∗−n
In fact, the partial fraction decomposition generalize to multivariate rational functions, so you can actually construct counting formulas for queries such as "How many words are there where there are n a
s and m b
s?"
Unfortunately, the extent to which this method will be useful ends when you have an ambiguous expression.