Dato un insieme \(\Sigma\) di simboli, il
monoide libero su \(\Sigma\) consta dell'insieme delle tuple
\[
\Sigma^\star = \coprod_{n\ge 0} \Sigma^n = \{(x_1,\dots, x_n)\mid x_i \in\Sigma,\; n\ge 0\}
\]con la convenzione che \(\Sigma^0=\{\varnothing\}\), dove \(\varnothing\) è la "parola vuota", che fa da elemento neutro per l'operazione di monoide (che è la giustapposizione di tuple: se \(\vec x_n = (x_1,\dots, x_n)\) e \(\vec y_m = (y_1,\dots, y_m)\) allora \(\vec x_n \circ \vec y_m := (x_1,\dots, x_n,y_1,\dots, y_m)\)). Questo insieme soddisfa la seguente proprietà universale: ogni funzione \(f : \Sigma \to M\), dove \(M\) è un monoide, si estende in maniera unica a un omomorfismo di monoidi \(\bar f : \Sigma^\star \to M\).
Ora, rozzamente, una espressione regolare serve a definire dei pattern per (ad esempio) compiere operazioni di cerca-e-sostituisci a un testo: a seconda del valore semantico di alcune wildcards, come il punto (trova un carattere qualsiasi), il caret (trova qualsiasi cosa diverso dal carattere o dal gruppo che segue), l'asterisco (trova \([0,\infty)\) occorrenze di ciò che precede) e altro, puoi quindi specificare di trovare non tanto "la parola
autismo all'interno di un testo", ma (ad esempio con "aut.+o") tutte le parole che iniziano per aut e finiscono per o, tipo aut
ismo e aut
omobilismo. Ma non troverà "auto" perché aver scritto "aut.+o" dice trova qualsiasi parola che abbia la struttura aut-[
almeno un carattere]-o. Per trovare anche auto avrei dovuto scrivere "aut.*o" (aut-[
zero o più caratteri]-o)
Come si collegano le due cose? Semplice, dato un alfabeto \(\Sigma\), certi elementi di \(\Sigma^\star\) sono espressioni regolari "ben formate" (data la struttura generica di una regex, e in particolare dei modificatori è ovvio che non tutte ti vanno bene), e queste regole per stabilire se una regex è ben formata sono proprio quelle che riporti.
PS: Incidentalmente, ho dato in pasto a una regexp il testo che sto scrivendo prima di postarlo: ora non ricordo qual è il dialetto specifico che il mio editor utilizza, ma per groupare le espressioni matematiche tra i simboli backslash-tondaaperta e backslash-tondachiusa la matematica che mentre scrivo è rinchiusa tra dollari uso questa regexp:
- Codice:
\\((.*?)\\) -> \\\(\1\\\)
In pratica sto dicendo: trova (
pigramente) qualsiasi cosa sia contenuto tra simboli di dollaro, e salvalo in un registro: poi chiudi quello che hai salvato tra i delimitatori slash-tondaaperta e slash-tondachiusa che aprono e chiudono un ambiente matematico in TeX.
- "Everything in Mathematics that can be categorized, is trivial" (P. J. Freyd), which should be understood as: "category theory is good ideas rather than complicated techniques".
- "I always disliked Analysis" (P. J. Freyd)