Warum ist es nicht einfach, die Anzahl der Wörter in einer regulären Sprache zu zählen?


8

Bei einem DFA A bezeichne L (A) die Anzahl der Wörter, die A akzeptiert. Ich denke, es ist einfach, L (A) zu berechnen: Übersetzen Sie die Codierung von A in einen regulären Ausdruck. Wenn der Kleene-Stern irgendwo im Ausdruck erscheint, ist die Sprache unendlich. Sonst: Gehen Sie alle Wortkombinationen durch, die mit dem Ausdruck möglich sind (wenn der Ausdruck einen + -Operator enthält, multiplizieren Sie die Anzahl der zulässigen Wörter mit der Anzahl der durch das + verbundenen Zeichenfolgen).

Ist das falsch? Danke im Voraus


3
ε ist keine unendliche Sprache.
David Richerby

Antworten:


12

Ja, das ist falsch, wegen der Mehrdeutigkeit.

Betrachten Sie die folgende Sprache: (ein+einein)+ein(ein+ϵ) .

Mit Ihrer Methode sehen wir 4 Wörter, . Aber wir haben Duplikate! Es gibt mehrere Möglichkeiten, dasselbe Wort innerhalb des angegebenen regulären Ausdrucks zu bilden.ein,einein,einein,ein

Eine bessere Methode ist die Verwendung der dynamischen Programmierung auf einem minimalen DFA für Ihre Sprache ohne "tote" Zustände. Wenn der minimale DFA zyklisch ist, ist die Sprache unendlich, sodass wir davon ausgehen können, dass es keine Zyklen gibt. Die Verwendung eines DFA ist der Schlüssel, da der Determinismus bedeutet, dass für jedes Wort genau ein Pfad durch den DFA vorhanden ist.

Sie erstellen eine Wiederholung für die Anzahl der Wörter, die in einem bestimmten Zustand enden:

  • 1 Wort endet im Startzustand: ϵ
  • Für jeden Zustand ist die Anzahl der Wörter, die dort enden, die Summe der Anzahl der Wörter, die an jedem Zustand mit einem Übergang in q enden .qq

Die Gesamtzahl der Wörter ist dann die Summe der Anzahl der Wörter, die an jedem Endzustand enden.


2
Es ist zu beachten, dass diese Wiederholungen immer durch Computeralgebra gelöst werden können, z. B. für die Erzeugungsfunktionen. Ja, normale Sprache ist eigentlich leicht zu zählen.
Raphael

9

Ergänzend zur Antwort von jmite ist es nicht allzu schwierig, die Anzahl der Wörter in einer regulären Sprache mit der Methode "Übertragungsmatrix" zu berechnen. Dies ist dasselbe wie die dynamische Programmierung von jmite, aber die Technik hat weitere Anwendungen wie die asymptotische Aufzählung.

Konstruieren Sie bei einem gegebenen DFA eine Matrix M (wobei Q die Menge von Zuständen ist), in der M ( i , j ) die Anzahl der Buchstaben ist, die bewirken, dass sich der DFA von Zustand j zu Zustand i bewegt . Sei 1 q 0 und 1 F die Indikatoren für den Anfangszustand bzw. für die akzeptierenden Zustände. Schließlich sei n = | Q | .Q×QMQM(i,j)ji1q01Fn=|Q|

Die Anzahl der Wörter der Länge beträgt c m : = 1 F M m 1 q 0 . Berechnen Sie c m für 0 m < 2 n . Wenn c n + + c 2 n - 1 > 0 ist, ist die vom DFA akzeptierte Sprache unendlich. Andernfalls beträgt die Anzahl der Wörter in der Sprache c 0 + + c n - 1 .mcm:=1FMm1q0cm0m<2ncn++c2n1>0c0++cn1

(Bei der Berechnung der Potenzen von muss auf die Größe der Einträge geachtet werden, die in m exponentiell ist . Da ihre Größe nur polynomisch ist, wird der resultierende Algorithmus in Polynomzeit ausgeführt.)Mm


2
Ich liebe diesen Ansatz. Ich habe auch festgestellt, dass die Berechnung der Eigenwerte von tatsächlich den Wurzeln des Nenners im Ansatz der Erzeugungsfunktion entspricht und dass diese Eigenwerte, vielleicht nicht überraschend, für die DFA-Minimierung unveränderlich sind. Ich habe jedoch absolut keine Ahnung, wie ich das richtig interpretieren soll. M.
Lee

1
Dies ist nicht so überraschend, da die Erzeugungsfunktion , die vereinfacht sich zu P ( z ) = 1 F ( I - Z M ) - 1 1 q 0 . Sie können ein noch expliziteres Ergebnis erzielen, indem Sie diese Berechnung mit der Jordan-Form von M wiederholen , die die Eigenwerte enthält. P(z)=n=01FMn1q0znP(z)=1F(IzM)11q0M
Yuval Filmus

7

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:

eR.e: =xΣe0 e1e0+e1e

Betrachten Sie die folgende Übersetzung ,einen regulären Ausdruck übernimmt und sie in eine komplexwertige rationale Funktion übersetzt:[[]]]]::R.eC.(z)

[[xΣ]]]]=z[[e0 e1]]]]=[[e0]]]]×[[e1]]]][[e0+e1]]]]=[[e0]]]]+[[e1]]]][[e]]]]=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:(einb)einb

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

As it turns out, given the above generating function, its coefficient extraction will be

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

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)+C0zq0++Cnzqn
where qk 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]Czq=C×qn

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 as and m bs?"

Unfortunately, the extent to which this method will be useful ends when you have an ambiguous expression.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.