Data un'espressione regolare R che descrive un linguaggio normale (nessuna retrocessione di fantasia). Esiste un modo algoritmico per costruire un'espressione regolare R * che descrive la lingua di tutte le parole ad eccezione di quelle descritte da R? Dovrebbe essere possibile in quanto Wikipedia dice:Esiste un modo per annullare un'espressione regolare?
I linguaggi regolari sono chiusi sotto le varie operazioni, vale a dire, se le lingue K e L sono regolari, così è il risultato delle seguenti operazioni: [ ...] il complemento ¬L
Ad esempio, dato l'alfabeto {a, b, c}, l'inverso della lingua (abc *) + è (un | (ac | b | c). *)?
Come DPenner ha già sottolineato nei commenti, l'inverso di un expresion regolare può essere esponenzialmente più grande della espressione originale. Ciò rende l'inversione delle espressioni regolari inadatta per implementare la sintassi di espressioni parziali negative per scopi di ricerca. Esiste un algoritmo che conserva la O (n * m) runtime caratteristica (dove n è la dimensione della regex e m è la lunghezza dell'input) dell'espressione regolare corrispondente e consente una sottoespressioni negati?
Costruire l'NFA da regex, costruire il DFA da NFA (dovrebbe esserci un algo per questo), trasformare gli stati non-terminali in stati terminali e viceversa, quindi derivare la regex da DFA. – nhahtdh
@nhahtdh Sembra un'idea interessante; il problema è che un NFA di lunghezza O (n) può corrispondere a un DFA di lunghezza O (2^n). – fuz
Non ho analizzato correttamente questo argomento, ma non riesco a vedere come un NFA genererebbe un DFA più grande. Puoi mostrarmi un caso del genere? – nhahtdh