L’induzione matematica è uno strumento fondamentale per dimostrare proprietà su insiemi infiniti come i numeri naturali, e la sua implementazione formale in Lean ne offre una chiara interpretazione computazionale. Considerando la sequenza di Fibonacci, per esempio, la dimostrazione della formula esplicita di Binet, che esprime il termine n-esimo come combinazione delle potenze di due radici irrazionali ϕ\phi e ϕ\phi', si basa su un’induzione ben strutturata. La definizione stessa della funzione fib\text{fib} in Lean, con casi base e passo induttivo, sottolinea come la verifica della formula per n+2n+2 dipenda dalla conoscenza dei casi precedenti, sfruttando le proprietà algebriche di ϕ\phi e ϕ\phi' per semplificare le espressioni.

In modo analogo, l’induzione è usata per dimostrare proprietà più sottili, come la coprimalità di due numeri di Fibonacci consecutivi. Qui, Lean facilita la costruzione della dimostrazione mostrando che se la proprietà è vera per nn, allora è vera anche per n+1n+1, sfruttando l’ipotesi induttiva in modo simmetrico e le regole dell’aritmetica modulare. L’uso di tattiche come simp e exact permette di semplificare e completare la prova con rigore meccanico, dimostrando come la formalizzazione aiuti a evitare ambiguità e approssimazioni.

La versione naive della funzione Fibonacci, definita per ricorsione semplice, ha complessità esponenziale, il che la rende inefficiente per calcolare valori grandi. Per migliorare la performance, si introduce una versione tail-recursive, fib', che utilizza un accumulatore per mantenere lo stato corrente della sequenza, ottenendo così un algoritmo lineare. La dimostrazione formale che questa versione tail-recursive calcola la stessa funzione Fibonacci della definizione classica si basa su un’induzione più sofisticata, che generalizza l’ipotesi induttiva su un parametro variabile mm. Questo uso del quantificatore universale esterno permette di adattare l’ipotesi induttiva a casi in cui l’indice cambia durante il passaggio induttivo, illustrando come le prove formali in Lean non siano semplici ricorsioni ma veri e propri ragionamenti strutturati.

Un altro aspetto cruciale è l’uso di tattiche più aggressive come erw (extended rewrite) per svelare definizioni e uguaglianze più profonde nelle espressioni da dimostrare, pur mantenendo attenzione all’efficienza: un uso troppo disinvolto di erw potrebbe rallentare le dimostrazioni inutilmente. Questi dettagli tecnici mostrano come la formalizzazione non sia solo un’esercitazione formale, ma richieda una conoscenza precisa del comportamento degli strumenti per guidare la prova in modo efficace.

Un ulteriore esempio è la dimostrazione della proprietà additiva della sequenza di Fibonacci: fib(m+n+1)=fib(m)fib(n)+fib(m+1)fib(n+1)\text{fib}(m+n+1) = \text{fib}(m)\cdot \text{fib}(n) + \text{fib}(m+1)\cdot \text{fib}(n+1). Qui si osserva l’importanza di una generalizzazione corretta nell’induzione e dell’uso di riscritture e semplificazioni per mantenere l’equazione nella forma desiderata. La tecnica di specializzare l’ipotesi induttiva con parametri modificati è una strategia comune per dimostrazioni di identità complesse nelle successioni numeriche.

Più in generale, l’approccio formale in Lean consente di dimostrare proprietà classiche della teoria dei numeri, come l’esistenza di un divisore primo per ogni numero naturale diverso da uno. Qui l’induzione si combina con una dimostrazione per casi e con il principio del ben fondato, mostrando come ogni numero non primo ammetta un divisore più piccolo, a sua volta scomponibile in numeri primi. La chiave della dimostrazione è l’uso di una “call” induttiva su un argomento che diminuisce, con Lean che automaticamente verifica la correttezza di questa diminuzione per garantire la terminazione della prova. La capacità di utilizzare lo stesso teorema che si sta dimostrando, come passaggio intermedio, senza cadere in circolarità, evidenzia la potenza del ragionamento basato su induttività ben fondata.

Infine, nelle dimostrazioni più articolate, si ricorre alla scomposizione dei casi su numeri naturali usando le tattiche cases e rcases, permettendo di distinguere rapidamente tra il caso base (zero) e il passo successivo, semplificando i ragionamenti che non richiedono l’ipotesi induttiva nella parte successiva. Questo metodo è particolarmente utile per gestire situazioni in cui il comportamento della funzione o della proprietà è triviale nel caso base, liberando il restante della dimostrazione da calcoli superflui.

L’induzione, dunque, non è solo un meccanismo formale, ma un metodo versatile e raffinato che si adatta a molteplici contesti matematici, dall’aritmetica delle successioni fino alla struttura fondamentale dei numeri primi. L’implementazione in Lean di queste tecniche non solo assicura la correttezza formale, ma guida la comprensione profonda delle proprietà, facendo emergere le interazioni tra struttura ricorsiva, proprietà algebriche e strategie di prova.

È fondamentale comprendere che l’induzione non si limita a essere un semplice schema di prova, ma è strettamente legata a concetti di terminazione, ben fondatezza e trasformazioni strutturali dei dati. Nel contesto computazionale, questo significa che le funzioni definite ricorsivamente devono essere progettate tenendo conto della loro terminazione per garantire sia la correttezza formale sia l’efficienza. Inoltre, la gestione accurata dei casi e la generalizzazione delle ipotesi induttive sono strumenti imprescindibili per costruire dimostrazioni complesse e robustamente verificate.

Come vengono formalizzate le strutture algebriche in Lean e qual è il ruolo delle istanze e delle classi?

In Lean, la formalizzazione delle strutture algebriche avviene attraverso l’uso di classi e istanze, che permettono di definire gerarchie matematiche modulari e riutilizzabili. Un esempio importante è la definizione della classe Group3, che estende le strutture di monoidale con un'operazione di inversione, codificando la proprietà fondamentale inv_mul che garantisce l’esistenza dell’inverso rispetto alla moltiplicazione. Per facilitare l’automazione delle dimostrazioni, si utilizzano attributi come [simp] per indicare che un lemma deve essere usato dal simplificatore automatico di Lean, e annotazioni come @[to_additive] per tradurre risultati dalla notazione moltiplicativa a quella additiva, preservando così la coerenza tra strutture simmetriche.

Questa metodologia continua con la definizione di gruppi abeliani additivi (AddCommGroup3) e gruppi commutativi moltiplicativi (CommGroup3), da cui si passa a strutture più complesse come gli anelli (Ring3). Qui si osserva un approccio flessibile: non si assume immediatamente la commutatività dell’addizione per mostrare come sia possibile costruire istanze che aggiungono questa proprietà. Un punto cruciale è l’uso della sintassi per la creazione di istanze che consente di fornire come parametro un’istanza genitore, aggiungendo poi i campi extra necessari, evitando così ridondanze e problemi di risoluzione delle istanze.

L’esempio della struttura Ring3 mostra come vengano definite le proprietà distributive, sinistra e destra, rispetto all’addizione e moltiplicazione. La possibilità di istanziare questa struttura su interi (Z) sfrutta le definizioni già presenti nella libreria Mathlib, garantendo che le proprietà algebriche siano rispettate.

Segue un approfondimento sulle gerarchie di relazioni d’ordine, che combinano proprietà di ordine parziale con strutture di monoidale commutativo, mostrando l’estendibilità del sistema verso strutture ordinate, un aspetto essenziale per la modellazione di problemi più complessi in algebra e analisi.

La trattazione prosegue con le strutture che coinvolgono più tipi, come i moduli su anelli, estendendo l’analogia con gli spazi vettoriali ma permettendo scalari non necessariamente invertibili. La classe SMul3 definisce la moltiplicazione scalare, mentre Module1 costruisce una struttura modulare che estende le proprietà additive e incorpora la moltiplicazione scalare, con vincoli precisi come la moltiplicazione per zero e uno, e la compatibilità con le operazioni di somma e moltiplicazione nell’anello.

Un punto tecnico interessante emerge nella gestione delle istanze: non si può estendere AddCommGroup3 M direttamente all’interno di Module1 per evitare problemi nella risoluzione automatica delle istanze in Lean. La regola pratica è che ogni classe estesa deve menzionare tutte le variabili di tipo usate nei parametri, altrimenti si generano dipendenze circolari e ambiguità. Questo esempio illustra come la formalizzazione richieda attenzione non solo alle proprietà matematiche, ma anche alla struttura tecnica del sistema di tipi e delle istanze.

Gli esempi concreti di moduli includono il modulo su se stesso dell’anello (con la moltiplicazione come azione scalare) e i moduli abeliani su Z\mathbb{Z}, dove la moltiplicazione scalare da numeri naturali e interi viene definita come somma ripetuta, con estensione ai negativi tramite la negazione. Nonostante la dimostrazione formale di tutte le proprietà sia complessa e spesso omessa con il comando sorry, questa impostazione fornisce una base robusta per la teoria dei moduli in Lean.

Importante è comprendere che la costruzione di tali gerarchie non è solo un esercizio di definizione, ma riflette profonde relazioni tra strutture algebriche diverse e le loro proprietà, facilitando la prova meccanica di teoremi e la manipolazione formale di oggetti matematici complessi.

Inoltre, è fondamentale per il lettore cogliere il ruolo delle annotazioni e degli attributi nel sistema Lean, che permettono di automatizzare molte dimostrazioni e di mantenere consistenza tra notazioni e strutture matematiche. Il design attento delle classi, con la giusta gestione delle dipendenze di tipo, è cruciale per evitare problemi di risoluzione delle istanze, un aspetto che può sembrare tecnico ma che è essenziale per un uso efficace della formalizzazione.

Infine, l’uso di esempi concreti come gli interi permette di collegare la teoria astratta a oggetti matematici familiari, rendendo più accessibile la comprensione e mostrando la potenza del metodo.

Come si definiscono e manipolano i sottogruppi e i morfismi di gruppo in Mathlib?

Nel contesto formale di Mathlib, la manipolazione di sottogruppi richiede attenzione a dettagli tecnici che riflettono la complessità intrinseca della teoria dei gruppi. Un sottogruppo non è semplicemente una sottoinsieme chiuso rispetto alle operazioni di gruppo, ma deve essere considerato come il sottogruppo generato dall'unione di due sottogruppi, formalizzato tramite la chiusura (closure) di tale unione. Questo implica che, per definire la somma di due sottogruppi H e H', non si può limitarsi all'unione dei loro insiemi, ma bisogna utilizzare la chiusura sotto le operazioni del gruppo, operazione che in Mathlib si esprime come Subgroup.closure ((H : Set G) ∪ (H' : Set G)).

Un aspetto sottile è il fatto che il gruppo G, nella sua totalità, non è un sottogruppo di se stesso in senso stretto, poiché ha un tipo distinto, ma può essere rappresentato come il massimo elemento della struttura a reticolo dei sottogruppi. Allo stesso modo, il minimo elemento del reticolo è il sottogruppo banale, contenente solo l'elemento neutro. Questi due estremi, rappresentati da ⊤ e ⊥ rispettivamente, consentono di formalizzare l'appartenenza di elementi in modo immediato: ogni elemento di G appartiene al sottogruppo massimo, mentre l'appartenenza al sottogruppo minimo si riduce alla condizione di uguaglianza con l'identità.

La nozione di coniugazione di un sottogruppo tramite un elemento del gruppo è anch’essa formalizzata, definendo il sottogruppo coniugato come l'insieme degli elementi ottenuti tramite coniugazione dall'elemento di partenza. Questo permette di esplorare la struttura interna del gruppo e le sue simmetrie, operazione fondamentale in molti sviluppi teorici.

Le funzioni fra gruppi, cioè i morfismi di gruppi, giocano un ruolo cruciale nell'analisi e manipolazione di sottogruppi. In Mathlib, sono definite le operazioni di immagine diretta (map) e immagine inversa (comap) di un sottogruppo lungo un morfismo. Queste operazioni, pur non coincidendo esattamente con la terminologia matematica tradizionale, sono preferite per la loro sinteticità. La nozione di nucleo (kernel) di un morfismo è un caso particolare di immagine inversa del sottogruppo banale e costituisce un sottogruppo fondamentale nella teoria dei gruppi. Allo stesso modo, l'immagine di un morfismo è sempre un sottogruppo del gruppo di arrivo.

Il formalismo di Mathlib permette inoltre di dimostrare proprietà fondamentali dei morfismi e dei sottogruppi come la monotonicità rispetto all'inclusione (se un sottogruppo è contenuto in un altro, lo è anche la loro immagine inversa e diretta tramite un morfismo), e la composizione di morfismi corrisponde alla composizione delle operazioni di map e comap. Queste proprietà sono essenziali per una manipolazione coerente e modulare della teoria.

Risultati classici come il teorema di Lagrange, che afferma che l’ordine di un sottogruppo finito divide quello del gruppo, trovano la loro formalizzazione e dimostrazione all'interno di Mathlib, così come il teorema di Sylow, importante per l'esistenza di sottogruppi di ordine potenza di primo.

La teoria concreta dei gruppi in Mathlib contempla anche la manipolazione di gruppi di permutazioni, ad esempio il gruppo simmetrico Sn definito come il gruppo delle permutazioni di un insieme finito di n elementi. È possibile formalizzare proprietà come la generazione del gruppo tramite cicli e calcolare effettivamente prodotti di cicli. Questo consente di passare dalla teoria astratta alla manipolazione esplicita di elementi e operazioni concrete.

Un altro aspetto fondamentale è la definizione dei gruppi liberi e delle presentazioni di gruppi, che permettono di costruire gruppi a partire da generatori e relazioni, dotandoli di proprietà universali. Attraverso la definizione di gruppi presentati e la possibilità di costruire morfismi a partire da tali presentazioni, si estende la capacità di formalizzare e studiare ampiamente gruppi definiti da relazioni algebriche.

Infine, l’azione di un gruppo su un insieme è formalizzata come un morfismo dal gruppo alle permutazioni di quel tipo, mostrando il legame profondo tra teoria dei gruppi e strutture combinatorie o geometriche. Questa prospettiva permette di applicare la teoria dei gruppi in numerosi contesti matematici e di formalizzarne le proprietà.

Oltre a quanto detto, è fondamentale per il lettore comprendere che la formalizzazione di strutture algebriche in un sistema come Lean/Mathlib non è solo una traduzione formale della teoria classica, ma implica una precisa gestione dei tipi, delle chiusure e delle proprietà strutturali che spesso non emergono esplicitamente nella matematica tradizionale. La distinzione tra insieme e struttura algebrica, la gestione dei casi limite come il sottogruppo banale e quello totale, e la necessità di formalizzare concetti come le chiusure e le proprietà di morfismo sono punti cruciali per utilizzare efficacemente strumenti formali nella ricerca e nello studio avanzato. Comprendere la natura computazionale e logica di queste formalizzazioni aiuta a cogliere il rigore e la precisione che Mathlib apporta allo studio dei gruppi, aprendo la strada a ulteriori generalizzazioni e applicazioni sia teoriche che pratiche.