Perché non c'è permutazione in Regexes? (Anche se le lingue normali sembrano essere in grado di farlo)


13

Il problema

Non esiste un modo semplice per ottenere una permutazione con una regex.

  • Permutazione: ottenere una parola
    w=x1xn
    ("aabc") in un altro ordine, senza cambiare il numero o il tipo di lettere.
  • Regex: espressione regolare.

Per verifica:

Il tipo di soluzione che sto cercando

Dovrebbe avere la forma:

  • »Aabc« (o qualsiasi altra cosa che potresti usare tra parentesi aperte e chiuse)
  • (AABC)! (simile a (abc)? ma con un altro simbolo alla fine)
  • [AABC]! (simile a [abc] + ma con un altro simbolo alla fine)

Vantaggi di queste soluzioni

Loro sono:

  • facile
  • adattabile
  • riutilizzabile

Perché questo dovrebbe esistere

  • I regex sono un modo per descrivere una grammatica di una lingua normale. Hanno il pieno potere di essere qualsiasi tipo di linguaggio regolare.
  • Diciamo che le lingue regolari sono abbastanza potenti per permutazioni (prova di seguito) - perché non esiste un modo semplice per esprimerlo?

Quindi la mia domanda è:

  • (Perché) La mia prova è sbagliata?
  • Se è giusto: perché non esiste un modo semplice per esprimere le permutazioni?

La prova

  • Le espressioni regolari sono un modo per annotare la grammatica di una lingua normale. Possono descrivere qualsiasi grammatica delle lingue regolari.
  • Un altro modo per descrivere le lingue regolari (che hanno un numero finito di lettere all'interno dell'alfabeto) sono gli automi non deterministici (con un numero finito di stati).

Avendo un numero finito di lettere posso creare questo automa: (Esempio. Formale: vedi sotto)

Grammatica che accetta permutazioni di "abbc":

(in cerca di numeri in cima, forse qualcuno sa come rendere migliore questa parte)

s -> ah¹

s -> bh²

s -> ch³

h¹ -> bh¹¹

h¹ -> ch¹²

h² -> ah¹¹ (nessun errore di battitura! equivalenza)

h² -> bh²²

h² -> ch²³

h³ -> ah¹²

h³ -> bh²³

h¹¹ -> bc

h¹¹ -> cb

h¹² -> bb

h²² -> ac

h²² -> ca

h²³ -> ab

h²³ -> ba

Più formale: (usando un automa a stati finiti ma questo potrebbe essere fatto anche con la grammatica)

  • Una parola q (con lunghezza finita) a cui qualsiasi permutazione dovrebbe raggiungere uno stato accettante.
  • X è l'alfabeto finito.
  • Set di stati S contiene qualsiasi ordine di lettere fino alla lunghezza di q. (Quindi la dimensione di S è finita.) Più uno stato di "qualsiasi parola più".
  • funzione di transizione di stato d che accetta una lettera e si sposta sullo stato che corrisponde alla parte ora letta della parola.
  • F è un insieme di quegli stati che sono permutazioni esatte di q.

Quindi è possibile creare un automa a stati finiti per accettare permutazioni di una determinata parola.

Passando alla prova

Quindi ho dimostrato che le lingue normali hanno il potere di controllare le permutazioni, vero?

Quindi perché non esiste un approccio per raggiungere questo obiettivo con Regexes? È una funzionalità utile.


10
Puoi elencare tutte le permutazioni della tua parola con un'espressione regolare. L'espressione risultante sarà piuttosto grande, ma sarà sicuramente un'espressione regolare.
Yuval Filmus,

7
Suggerisco di ignorare tutte le risposte su Teoria del calcolo su StackOverflow. Questa non è la specialità di quel sito.
Yuval Filmus,

La risposta sulla tua pagina collegata qui - stackoverflow.com/a/3102205/6936386 - sembra essere facilmente adattabile e non troppo complicata: ^(a()|a()|b()|c()){4}\2\3\4\5$sembra funzionare (vedi regex101.com/r/9URPpg/4/tests ).
Boboquack,

7
@boboquack Non è un'espressione regolare nel senso in cui il termine è usato nell'informatica. (Questo genere di cose è esattamente il motivo per cui Yuval suggerisce di non fidarsi delle risposte Stack Overflow sul CS teorico.)
David Richerby,

Risposte:


37

I teoremi fondamentali della teoria del linguaggio formale sono che espressioni regolari, grammatiche regolari, automi finiti deterministici (DFA) e automi finiti non deterministici (NFA) descrivono tutti gli stessi tipi di linguaggi: vale a dire i linguaggi regolari. Il fatto che possiamo descrivere queste lingue in così tanti modi completamente diversi suggerisce che ci sia qualcosa di naturale e importante in queste lingue, allo stesso modo in cui l'equivalenza delle macchine di Turing, il calcolo lambda e tutti i tipi di altre cose suggeriscono che le lingue calcolabili sono naturali e importanti. Non sono solo un artefatto di qualsiasi decisione casuale presa dallo scopritore originale.

Supponiamo di aggiungere una nuova regola per la creazione di espressioni regolari: se R  è un'espressione regolare, allora π(R) è un'espressione regolare, e corrispondono a ogni permutazione di ogni stringa corrispondente  R . Quindi, ad esempio, L(π(abc))={abc,acb,bac,bca,cab,cba} . Il problema è che questo rompe le equivalenze fondamentali sopra descritte. L(π((ab)))) è la lingua delle stringhe che contengono un numero uguale dia s e b s e questo non è un linguaggio regolare. Confrontalo con, ad esempio, aggiungendo un operatore di negazione o inversione alle espressioni regolari, che non cambia la classe di lingue accettate.

Quindi, per rispondere alla domanda del titolo, espressioni regolari non possono fare permutazioni e non aggiungiamo tale abilità perché le espressioni regolari non corrisponderebbero alle lingue normali. Detto questo, è possibile che "espressioni regolari con permutazioni" siano anche un'interessante classe di lingue con molte caratterizzazioni diverse.


Ma anche L ((ab) *) non è un linguaggio normale, quindi L (perm ((ab) *)) non può essere uno. ((ab) * non è un linguaggio normale poiché non esiste alcun tipo di memoria per ricordare quante "a" s ci sono, quindi con un numero finito di stati non è possibile inserire lo stesso numero di "b" s.)
Asqiir

9
L((ab)){ε,ab,abab,ababab,abababab,}{ε,ab,aabb,aaabbb,aaaabbbb,}

4
ab

2
Hai perfettamente ragione. Mi mancava il punto di "mettere le espressioni regolari l'una nell'altra", pensavo solo a "permutare una parola fissa" non "permutare un'altra regex" che ovviamente non è possibile.
Asqiir,

1
Forse le espressioni regolari con permutazioni descrivono una classe di linguaggi con proprietà interessanti, ma !in pratica non ho mai avuto bisogno dell'operatore, e suppongo che poche persone lo abbiano, poiché è facile da implementare e nessuna implementazione di espressioni regolari estese I ' l'ho visto supporta.
reinierpost,

16

Quindi la mia domanda è:

  • (Perché) La mia prova è sbagliata?
  • Se è giusto: perché non esiste un modo semplice per esprimere le permutazioni?

La tua "prova" ha esaminato solo le permutazioni di singole parole, che sono lingue finite.

Ogni lingua finita è regolare (es. Semplicemente elencando tutti i membri con un | intervallo), ma ci sono infinite lingue regolari (e quelle generalmente sono le più interessanti).

Non appena ottieni un'espressione regolare (o grammatica / automa) che accetta un linguaggio infinito (cioè un'espressione con il * operatore, o un automa con un ciclo), la tua costruzione non funziona più (ottieni una grammatica / automa infiniti ).

La risposta di David Richerby ha fornito un esempio di una lingua normale la cui lingua di permutazione non è più regolare - tutti questi esempi sono lingue infinite.


8

ΣnΣmO(m)

Quindi, in un certo senso, non esiste un modo sintetico per specificare tutte le permutazioni di una parola.


Ω~(2n)ΣnmO(m)

Useremo il L(xi,yi)1iN

  • xiyiL .
  • ijxiyjLxjyiL

LNLixiyiqixiqiqjijqi=qjxiyjxjyiL , contrariamente alle ipotesi.

Lnσ1,,σnnSσ1,,σnn/2xSSySSxSySLnSTxSyTLnLn(nn/2)=Ω(2n/n)


Questo significa 1) in teoria sarebbe possibile lasciare che »abc« corrisponda a tutti {abc, acb, bac, bca, cab, cba} ma non è efficace e li renderebbe troppo lenti poiché »abc« si espanderebbe esponenzialmente a (abc | ACB | bac | bca | taxi | cba)? o 2) Il tipo di automa di cui ho bisogno non è in grado di specificare tutte le permutazioni per una determinata parola?
Asqiir,

1
un'Bcabc+acd+bac+bca+cab+cba1+3+6+6+1=17abcdefghij.
Yuval Filmus,

1
Cosa ho capito: in teoria, le lingue regolari sono in grado di accettare permutazioni (così come le espressioni regolari). Non esiste un "modo semplice" per scrivere "permutazione di abc" come »abc«. (Per qualsiasi motivo.)
Asqiir,

1
Sì, è un buon riassunto. Vedrò se riesco a trovare un argomento più semplice per le espressioni regolari.
Yuval Filmus,

2
Per i futuri lettori: questa non è la risposta corretta! (Correggimi se sbaglio.) Cerca quello accettato.
Asqiir,

0

Perché non c'è modo di scrivere "permutazione di" in Regexes

Una permutazione di un linguaggio normale e infinito (quantità infinita di parole) non è necessariamente regolare. Pertanto, non può essere scritto come regex.

Prova

Pensa alla lingua (ab)* . (Esempio ispirato a David Richerby .) Una delle sue permutazioni è a*b*. Questa non è una lingua normale. qed.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.