Gibt es einen Algorithmus / ein systematisches Verfahren, um zu testen, ob eine Sprache regulär ist?
Mit anderen Worten, wenn eine Sprache in algebraischer Form angegeben ist (denken Sie an etwas wie ), testen Sie, ob die Sprache regulär ist oder nicht. Stellen Sie sich vor, wir schreiben einen Webdienst, der den Schülern bei all ihren Hausaufgaben hilft. Der Benutzer gibt die Sprache an und der Webdienst antwortet mit "normal", "nicht regulär" oder "Ich weiß nicht". (Wir möchten, dass der Webdienst so selten wie möglich mit "Ich weiß nicht" antwortet.) Gibt es einen guten Ansatz, um dies zu automatisieren? Ist das nachvollziehbar? Ist es entscheidbar (dh kann garantiert werden, dass wir niemals mit "Ich weiß nicht" antworten müssen)? Gibt es einigermaßen effiziente Algorithmen zur Lösung dieses Problems und die Möglichkeit, für viele / die meisten Sprachen, die in der Praxis wahrscheinlich auftreten, eine andere Antwort als "Weiß nicht" zu liefern?
Die klassische Methode, um zu beweisen, dass eine Sprache nicht regelmäßig ist, ist das Pump-Lemma. Es sieht jedoch so aus, als ob irgendwann manuelle Einsichten erforderlich sind (z. B. um das zu pumpende Wort auszuwählen), sodass mir nicht klar ist, ob dies in etwas Algorithmisches umgewandelt werden kann.
Eine klassische Methode, um zu beweisen, dass eine Sprache regulär ist, wäre die Verwendung des Myhill-Nerode-Theorems, um einen Automaten mit endlichen Zuständen abzuleiten. Dies scheint ein vielversprechender Ansatz zu sein, erfordert jedoch die Fähigkeit, grundlegende Operationen an Sprachen in algebraischer Form auszuführen. Mir ist nicht klar, ob es eine systematische Möglichkeit gibt, alle erforderlichen Operationen symbolisch für Sprachen in algebraischer Form auszuführen.
Um diese Frage gut zu stellen, müssen wir entscheiden, wie der Benutzer die Sprache spezifiziert. Ich bin offen für Vorschläge, aber ich denke so etwas:
Dabei ist ein Wortausdruck und S ein System linearer Ungleichungen über die Längenvariablen mit den folgenden Definitionen:
Jedes von ist ein Wortausdruck. (Dies sind Variablen , die auf ein beliebiges Wort in nehmen Σ * .)
Jedes von ist ein Wortausdruck. (Hier steht x r für die Umkehrung der Zeichenfolge x .)
Jedes von ist ein Wortausdruck. (Implizit ist Σ = { a , b , c , … } , also stellen a , b , c , … ein einzelnes Symbol im zugrunde liegenden Alphabet dar.)
Jedes von ist ein Wortausdruck, wenn η eine Längenvariable ist.
Die Verkettung von Wortausdrücken ist ein Wortausdruck.
Jedes von ist eine Längenvariable. (Dies sind Variablen, die eine beliebige natürliche Zahl annehmen können.)
Jeder von Ist eine Längenvariable. (Diese repräsentieren die Länge eines entsprechenden Wortes.)
Dies scheint breit genug zu sein, um viele der Fälle zu behandeln, die wir in Lehrbuchübungen sehen. Natürlich können Sie jede andere Textmethode zur Angabe einer Sprache in algebraischer Form ersetzen, wenn Sie einen besseren Vorschlag haben.