Zählen von Wörtern, die von einer normalen Grammatik akzeptiert werden


26

Wie kann bei einer vorgegebenen regulären Sprache (NFA, DFA, Grammatik oder Regex) die Anzahl der akzeptierten Wörter in einer bestimmten Sprache gezählt werden? Sowohl "mit genau n Buchstaben" als auch "mit höchstens n Buchstaben" sind von Interesse.

Margareta Ackerman hat zwei Artikel zum Thema der Aufzählung von Wörtern, die von einer NFA akzeptiert wurden, aber ich konnte sie nicht ändern, um effizient zu zählen.

Es scheint, dass die Einschränkung regulärer Sprachen das Zählen relativ einfach machen sollte - ich erwarte fast eine Formel mehr als einen Algorithmus. Leider haben meine Suchanfragen bisher nichts ergeben, daher muss ich die falschen Begriffe verwenden.


Ich nehme an, Sie meinen "Anzahl der akzeptierenden Wörter der Größe " oder so etwas? sonst, was die Anzahl der Wörter für die Annahme Σ *nΣ
Suresh Venkat

Antworten:


37

Für einen DFA, in dem der Anfangszustand ist der Zustand , die Anzahl der Worte der Länge k , die im Zustand am Ende i ist A k [ 0 , i ] , wobei A die Übertragungsmatrix des DFA ist (eine Matrix , in der die Zahl in Zeile i und Spalte j ist die Anzahl der verschiedenen Eingabesymbole, die einen Übergang vom Zustand i zum Zustand j bewirken . So können Sie zählen, Wörter mit einer Länge von genau k einfach zu akzeptieren , auch wenn k0kichEINk[0,ich]EINichjichjkk ist mäßig groß, indem nur eine Matrixleistung berechnet und die Einträge hinzugefügt werden, die den akzeptierenden Zuständen entsprechen.

Dasselbe gilt für die Annahme von Wörtern mit einer Länge von höchstens und einer geringfügig anderen Matrix. Fügen Sie eine zusätzliche Zeile und Spalte der Matrix hinzu, und zwar eine in der Zelle, die sowohl in der Zeile als auch in der Spalte enthalten ist, eine in der neuen Zeile und Spalte des Anfangszustands sowie eine Null in allen anderen Zellen. Diese Änderung der Matrix hat zur Folge, dass dem Ausgangszustand bei jeder Leistung ein weiterer Pfad hinzugefügt wird.k

Dies funktioniert nicht für NFAs. Ich vermute, das Beste ist, einfach in einen DFA zu konvertieren und dann den Matrix-Powering-Algorithmus anzuwenden.


2
Die perfekte Antwort: offensichtlich erst, wenn Sie es gelesen haben.
Charles

1
Dieser Ansatz weist eine exponentielle Worst-Case-Laufzeit auf, wenn Sie keine DFA-Eingabe haben. Ist das kein Problem für dich, @Charles? Sie scheinen reguläre Ausdrücke, NFA und Grammatiken in Ihre Fragen einzubeziehen und fragen auch nach einem effizienten Weg.
Raphael

17

Let mit Startzustand ein (nichtdeterministischen) finite Automatisierungs seine Q 1 , Q FQ und δ Q × Σ × Q .EIN=(Q.={q1,,qn},Σ,δ,Q.F)q1Q.FQ.δQ.×Σ×Q.

Sei die Erzeugungsfunktion für alle Wörter, die ab q i akzeptiert werden können , also der n- te Koeffizient seiner Reihenexpansion [ z n ] Q i = | { w | w | = n w  von q i } | akzeptiert .Q.ich(z)qichn[zn]Qi=|{w|w|=nw accepted from qi}|

Deutlich:

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

Lösen Sie das resultierende (lineare) Gleichungssystem für (mit Mathematica oder einem ähnlichen Werkzeug). Dann ist [ z n ] Q 1 die gewünschte Größe.Q1[zn]Q1

Dies geht auf eine von Chomsky und Schützenberger (1963) für Grammatiken eingeführte Technik zurück; es kann leicht auf endliche Automaten übertragen werden.

Bearbeiten: Wenn Sie Übergänge berücksichtigen möchten , lassen Sie Faktor x in der Summe für den entsprechenden Übergang weg . Wenn Sie „komprimieren“ Kanten Similiarly haben, das heißt , statt dem Symbol a & Sigma; ein Wort w & Sigma; k auf einem Übergang, ersetzen x mit x k .εxaΣwΣkxxk


Ich schätze die historische Notiz!
Charles

1
Ähm, dies ist eine Methode, die unter vielen Umständen wirklich gut funktioniert (und einfach ist, sobald Sie sie erhalten haben). Beispielsweise können Sie CFGs auf genau dieselbe Weise ausführen.
Raphael

1
Ich verstehe, ich habe falsch verstanden. In diesem Fall empfehle ich Kuich (1970), das ich zugänglicher fand als die Arbeit von C & S. Darüber berichtet er auch in einem Buch, an das ich mich nicht erinnere.
Raphael

1
n

1
@joro Bei eindeutigen Grammatiken denke ich, dass das stimmt, ja.
Raphael

7

Ich denke, dass dies ein schwieriges Zählproblem ist, siehe dieses Papier: Das Zählen der Größe regulärer Sequenzen mit der angegebenen Länge ist # P-vollständig: S. Kannan, Z. Sweedyk und SR Mahaney. Zählen und zufälliges Erzeugen von Strings in regulären Sprachen. In ACM-SIAM Symposium on Discrete Algorithms (SODA), S. 551–557, 1995.


1
Der obige Beitrag setzt voraus, dass die angegebene Länge unär ist. Wenn die Länge stattdessen binär ist, ist das Problem PSPACE-schwer. Ich sage dies auf der Grundlage des Beweises, dass die Entscheidung über die Gleichwertigkeit zweier regulärer Ausdrücke PSPACE-schwer ist. In dieser Reduktion wurde ein Reg-Ex konstruiert, um alle Zeichenfolgen zu akzeptieren, und das andere, um alle Zeichenfolgen zu akzeptieren, die nicht gültig sind und Berechnungsverläufe der PSPACE-Maschine M bei Eingabe w ablehnen. Die Verwendung dieses zweiten regulären Ausdrucks und der Länge eines Berechnungsverlaufs von M on w als Eingaben für das fragliche Problem macht dieses andere Problem auch PSPACE-schwierig.
Mikhail Rudoy

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.