Esiste un algoritmo / procedura sistematica per verificare se una lingua è regolare?
In altre parole, dato un linguaggio specificato in forma algebrica (pensa a qualcosa come ), verifica se il linguaggio è regolare o meno. Immagina di scrivere un servizio web per aiutare gli studenti a fare tutti i compiti; l'utente specifica la lingua e il servizio Web risponde con "normale", "non regolare" o "non lo so". (Vorremmo che il servizio web rispondesse "Non lo so" il più raramente possibile.) Esiste un buon approccio per automatizzare questo? È trattabile? È decidibile (cioè è possibile garantire che non abbiamo mai bisogno di rispondere "Non lo so")? Esistono algoritmi ragionevolmente efficienti per risolvere questo problema ed essere in grado di fornire una risposta diversa da "non lo so"
Il metodo classico per dimostrare che una lingua non è regolare è il lemma del pompaggio. Tuttavia, sembra che a un certo punto sia necessario un approfondimento manuale (ad esempio, per scegliere la parola da pompare), quindi non sono chiaro se questo possa essere trasformato in qualcosa di algoritmico.
Un metodo classico per dimostrare che una lingua è regolare sarebbe usare il teorema di Myhill-Nerode per derivare un automa a stati finiti. Sembra un approccio promettente, ma richiede la capacità di eseguire operazioni di base sulle lingue in forma algebrica. Non mi è chiaro se esiste un modo sistematico per eseguire simbolicamente tutte le operazioni che potrebbero essere necessarie, su linguaggi in forma algebrica.
Per porre bene questa domanda, dobbiamo decidere come l'utente dovrà specificare la lingua. Sono aperto ai suggerimenti, ma sto pensando a qualcosa del genere:
dove è un'espressione di parole e è un sistema di disuguaglianze lineari sulle variabili di lunghezza, con le seguenti definizioni:S
Ognuno di è un'espressione di parole. (Rappresentano variabili che possono assumere qualsiasi parola in .)Σ ∗
Ognuno di è un'espressione di parole. (Qui rappresenta il rovescio della stringa .)x r x
Ciascuno di è un'espressione di parole. (Implicitamente, , quindi rappresentano un singolo simbolo nell'alfabeto sottostante.)Σ = { a , b , c , ... } a , b , c , ...
Ognuno di è un'espressione di parole, se è una variabile di lunghezza.η
La concatenazione di espressioni di parole è un'espressione di parole.
Ognuno di è una variabile di lunghezza. (Questi rappresentano variabili che possono assumere qualsiasi numero naturale.)
Ciascuno di è una variabile di lunghezza. (Questi rappresentano la lunghezza di una parola corrispondente.)
Questo sembra abbastanza ampio da gestire molti dei casi che vediamo negli esercizi da manuale. Naturalmente, puoi sostituire qualsiasi altro metodo testuale per specificare una lingua in forma algebrica, se hai un suggerimento migliore.