Il principio di induzione forte, noto come Nat.strong_induction_on in Lean, consente di dimostrare proprietà su numeri naturali senza la necessità di un caso base separato: il caso base è incluso implicitamente nel passo induttivo. Nel contesto della teoria dei numeri, questo si traduce nell’affermazione che ogni numero naturale maggiore o uguale a 2 ha un fattore primo. Se il numero stesso è primo, la dimostrazione è ovvia; altrimenti, esiste un fattore non banale più piccolo, al quale si applica l’ipotesi induttiva.

Questa strategia è essenziale per provare teoremi classici come l’esistenza di fattori primi per ogni numero naturale non triviale, da cui si può derivare la famosa affermazione dell’infinità dei numeri primi. Tale infinito può essere dimostrato considerando, ad esempio, il numero fattoriale n! più 1, il quale ha un fattore primo che non divide nessuno degli interi da 1 a n, mostrando quindi che per ogni n esiste un primo più grande di n.

Un’ulteriore formulazione del teorema si basa sull’argomento di Euclide: se si suppone che esista un insieme finito di primi {p₁, p₂, ..., pₙ}, allora il numero dato dal prodotto di questi primi più uno, ovvero Π pᵢ + 1, ha un fattore primo che non appartiene all’insieme, generando una contraddizione.

La formalizzazione di tali argomentazioni richiede una rigorosa gestione degli insiemi finiti. In Lean, i tipi Finset α rappresentano insiemi finiti di elementi di tipo α. La teoria dei Finset non si limita a manipolare gli insiemi, ma impone anche l’uso di un test di uguaglianza (tramite l’assunzione [DecidableEq α]) per poter ragionare computazionalmente sugli elementi. Ciò è cruciale per trattare insiemi finiti in modo efficace.

Per dimostrare proprietà su insiemi finiti si utilizza il principio di induzione su Finset, chiamato Finset.induction_on. Questo metodo si basa sul mostrare la proprietà per l’insieme vuoto e dimostrare che l’aggiunta di un elemento preserva la proprietà stessa. Nella pratica, ciò si traduce nell’analisi della struttura degli insiemi finiti mediante l’operazione di inserimento di un singolo elemento, con la relativa manipolazione del prodotto degli elementi (Finset.prod).

Un risultato fondamentale in questo ambito è che se un primo p divide il prodotto di un insieme finito di primi, allora p deve appartenere all’insieme stesso. Questa proprietà si basa sul fatto che i primi sono elementi irriducibili rispetto alla divisione e permette di controllare la struttura dei fattori primi in modo preciso.

L’uso di insiemi finiti permette inoltre di dimostrare in modo alternativo l’infinità dei primi affermando che per ogni insieme finito s di numeri naturali, esiste un primo p che non appartiene a s. Dimostrare ciò comporta assumere per assurdo che tutti i primi siano in s, filtrare s per ottenere un sottoinsieme di soli primi, e considerare il prodotto di questi primi più uno, da cui si ricava una contraddizione.

Questa seconda formulazione evidenzia come la struttura degli insiemi finiti e le loro proprietà combinatorie siano strumenti potenti per la teoria dei numeri, portando a conclusioni non banali come l’infinità dei primi.

È importante notare che la formalizzazione matematica, come quella implementata in Lean, richiede di specificare in modo esplicito ogni passaggio logico, cosa che nei ragionamenti tradizionali viene spesso lasciata implicita. Questo spinge a comprendere in profondità le implicazioni dei principi come l’induzione forte e il trattamento computazionale degli insiemi finiti, rivelando la complessità e la bellezza della logica matematica alla base di risultati apparentemente semplici.

Inoltre, la dimostrazione dell’infinità dei primi non si limita a stabilire la loro esistenza oltre ogni limite, ma mette in luce la relazione tra proprietà aritmetiche dei numeri e strutture insiemistiche che possono essere formalizzate e verificate con sistemi di prova assistita. Ciò consente di sviluppare una comprensione più solida e rigorosa dei concetti fondamentali della teoria dei numeri.

Come si definiscono e si valutano formalmente le formule proposizionali in Lean?

In Lean, le formule proposizionali vengono formalizzate tramite un tipo induttivo chiamato PropForm, che esprime le costruzioni fondamentali del calcolo proposizionale. Ogni formula proposizionale è una delle seguenti: una variabile var n, la costante fls (falso), oppure una formula composta costruita usando le connettive logiche fondamentali: congiunzione (conj A B), disgiunzione (disj A B) e implicazione (impl A B). Queste corrispondono rispettivamente alle notazioni matematiche pn,,AB,AB,ABp_n, \bot, A \wedge B, A \vee B, A \to B. Le altre connettive, come la negazione ¬A\neg A e la bi-implicazione ABA \leftrightarrow B, possono essere espresse tramite combinazioni di quelle di base, ad esempio ¬A\neg A si definisce come AA \to \bot.

Una volta definito questo tipo di dati, si passa a definire la funzione di valutazione eval che, dato un assegnamento di valori booleani v alle variabili, calcola il valore di verità della formula. Questa funzione è definita per ogni costruttore del tipo PropForm: per una variabile, restituisce il valore assegnato da v; per la costante fls, restituisce sempre falso; per le formule composte, combina ricorsivamente i valori delle sottoproposizioni usando gli operatori booleani corrispondenti (&&, ||, e l’operatore dell’implicazione logica).

Un aspetto fondamentale è la nozione di insieme delle variabili che compaiono in una formula, definito ricorsivamente: per una variabile è il singoletto contenente quella variabile, per fls è l’insieme vuoto, e per le formule composte è l’unione degli insiemi delle variabili delle sottoproposizioni. Questa definizione è cruciale per dimostrare proprietà di stabilità della valutazione rispetto a diversi assegnamenti: se due assegnamenti assegnano lo stesso valore alle variabili che compaiono nella formula, allora la valutazione della formula è la stessa per entrambi.

Un meccanismo importante è la sostituzione subst, che consente di sostituire in una formula tutte le occorrenze di una variabile con un’altra formula. La sostituzione viene definita ricorsivamente e preserva la struttura logica della formula. Ad esempio, sostituire una variabile che non compare nella formula non modifica la formula stessa. Inoltre, si dimostra che valutare la formula ottenuta dalla sostituzione equivale a valutare la formula originale con un assegnamento modificato che assegna a quella variabile il valore di verità della formula sostitutiva.

Questa formalizzazione non solo esplicita in modo rigoroso la sintassi e la semantica del calcolo proposizionale, ma consente anche di automatizzare dimostrazioni e ragionamenti formali tramite Lean, sfruttando l’induttività per la definizione e la prova di teoremi. L’uso di tipi induttivi per rappresentare formule e strutture dati consente di manipolare in modo strutturato e modulare oggetti complessi, base imprescindibile per la matematica formale e la verifica automatica.

È essenziale comprendere che la chiarezza e la precisione della definizione delle formule, dell’insieme delle variabili coinvolte, della valutazione e della sostituzione sono fondamentali per evitare ambiguità e garantire correttezza nelle dimostrazioni formali. Inoltre, la capacità di Lean di generare automaticamente teoremi di estensionalità e di usare tecniche di automazione per semplificare dimostrazioni ripetitive aumenta significativamente l’efficienza nello sviluppo di formalizzazioni matematiche e programmi di verifica.

Infine, questa metodologia non si limita al calcolo proposizionale: l’approccio con tipi induttivi e funzioni ricorsive costituisce il cuore della definizione di strutture matematiche più complesse, come gruppi, anelli e spazi topologici, che si modellano come “bundles” di dati con proprietà. La costruzione rigorosa e modulare di tali strutture permette a Lean di diventare uno strumento potente per l’esplorazione e la verifica della matematica moderna.

Come Lean gestisce le gerarchie algebriche senza conflitti di istanze

Nel sistema di tipo di Lean, la gestione delle gerarchie algebriche richiede attenzione meticolosa, specialmente quando si combinano più strutture che condividono una dipendenza comune. Un esempio paradigmatico è la costruzione della struttura di Monoid, dove più classi estendono la stessa classe base, potenzialmente introducendo ambiguità. Tuttavia, l’uso del costrutto extends si dimostra cruciale per evitare la duplicazione conflittuale delle istanze.

Quando si definisce una classe come Semigroup2 estendendo Dia1, il sistema associa automaticamente il campo toDia1, utilizzando una convenzione di prefisso implicito. Questo consente una sintassi pulita senza necessità di specificare esplicitamente l'istanza Dia1. L’operazione binaria definita nella classe Dia1 risulta associativa grazie all’assioma dia_assoc.

L’aggiunta di un elemento neutro si realizza estendendo sia One1 che Dia1 nella classe DiaOneClass1, con gli assiomi one_dia e dia_one che garantiscono il comportamento neutro dell’elemento uno a sinistra e a destra dell’operazione . Questa composizione permette di definire proprietà che coinvolgono entrambe le strutture senza ridondanza. Il sistema di risoluzione delle istanze di Lean è in grado di trovare automaticamente i percorsi corretti, e con l’opzione trace.Meta.synthInstance è possibile visualizzare i tentativi (riusciti e falliti) di istanziazione, offrendo trasparenza nel processo inferenziale.

Una definizione di monoid come Monoid1, che estende Semigroup1 e DiaOneClass1, appare inizialmente diretta ma nasconde un'insidia: entrambe le classi estendono Dia1, e quindi una costruzione ingenua produrrebbe due operazioni indipendenti. Tuttavia, usando extends, Lean non replica i campi sovrapposti, ma li unifica intelligentemente. Questo è visibile confrontando Monoid1 con una versione manuale Monoid2, dove toSemigroup1.toDia1.dia e toDiaOneClass1.toDia1.dia risultano differenti. In Monoid1, invece, Lean assicura che queste due espressioni coincidano.

Analizzando il costruttore di Monoid1, notiamo che esso decompone DiaOneClass1, includendo solo i campi non ridondanti e generando automaticamente istanze non esplicite come toDiaOneClass1, che preservano la simmetria tra le classi estese. Questa strategia consente una maggiore modularità e evita collisioni semantiche, mantenendo la consistenza nella gerarchia.

Il passo verso i gruppi implica l'introduzione di una funzione di inversione. Si definisce dunque la classe Inv1, contenente il campo inv, accompagnato da notazione simbolica con l’operatore apice. Group1 estende Monoid1 e Inv1, imponendo l’assioma inv_dia, che richiede che l’inverso sia sinistro rispetto all’operazione . La simmetria è tuttavia garantita da un lemma, left_inv_eq_right_inv1, che mostra l’unicità dell’inverso, sfruttando associatività e neutralità.

L’uso del comando export rende disponibili nel namespace principal

Come si valutano i polinomi in un'algebra e cosa implica il teorema di D'Alembert-Gauss?

Nel contesto algebrico, valutare un polinomio non è semplicemente sostituire una variabile con un numero. Quando si lavora in un'algebra su un anello commutativo, la valutazione prende la forma di un morfismo di algebre, e ogni dettaglio della struttura entra in gioco. L'operazione aeval rappresenta proprio questa valutazione: prende un elemento dell’algebra e restituisce il valore di un polinomio su quell’elemento secondo le regole dell’omomorfismo. Ad esempio, valutando il polinomio X2+1X^2 + 1 sull’unità immaginaria iCi \in \mathbb{C}, si ottiene zero, proprio perché i2+1=1+1=0i^2 + 1 = -1 + 1 = 0.

Questo risultato non è solo una curiosità aritmetica. È un riflesso del fatto che C\mathbb{C} è algebricamente chiuso: ogni polinomio non costante con coefficienti complessi ha almeno una radice in C\mathbb{C}. Il teorema di D’Alembert-Gauss garantisce che possiamo fattorizzare ogni polinomio complesso come prodotto di binomi lineari. Così, X2+1X^2 + 1 si fattorizza come (Xi)(X+i)(X - i)(X + i), e da ciò segue che le sue radici sono proprio ii e i-i.

La funzione aroots, che generalizza il concetto di radici a qualunque algebra, restituisce un multinsieme di radici, cioè una collezione che tiene conto della molteplicità. In particolare, si comporta coerentemente con la definizione classica quando si lavora in campi algebricamente chiusi. Tuttavia, bisogna avere cura nel trattare il polinomio nullo, poiché le sue radici non sono ben definite: ogni elemento dell’algebra è soluzione, ma non si può rappresentare tale infinità con un multinsieme finito.

Quando si vuole valutare un polinomio PR[X]P \in R[X] su un elemento di un’altra struttura algebrica SS, ma non si ha una struttura di algebra tra RR e SS, si utilizza eval2. A differenza di aeval, questa funzione si basa su un semplice omomorfismo di anelli f:RSf : R \to S, che permette la valutazione anche quando manca la struttura più ricca di algebra. Ad esempio, utilizzando l’omomorfismo che manda ogni numero reale nel suo equivalente complesso, possiamo valutare P(X)=X2+1P(X) = X^2 + 1 in ii, ottenendo ancora una volta zero. Questo mostra come eval2 sia più generale e più vicino al concetto di sostituzione classica, pur mantenendo la coerenza con l’impianto algebrico.

Un’estensione naturale del concetto di polinomio univariato è data dai polinomi multivariati. Se gli indeterminati sono indicizzati da un insieme finito σ\sigma, allora l’insieme dei polinomi è rappresentato da MvPolynomial σ R. Questa costruzione astratta consente, ad esempio, di esprimere la circonferenza unitaria nel piano come X02+X121X_0^2 + X_1^2 - 1. Valutando questo polinomio nel punto (1,0)(1, 0), si verifica immediatamente che si annulla: il punto appartiene alla circonferenza.

In un contesto più astratto, come quello dell’algebra lineare, la definizione degli spazi vettoriali dipende da due strutture fondamentali: il gruppo abeliano additivo e il modulo. Non si può fare a meno di distinguerle, poiché l’interazione tra tipi di dati nel sistema di sintesi delle classi in Lean potrebbe portare a comportamenti imprevisti se si tentasse di dedurre una dall’altra in modo automatico. La moltiplicazione scalare, indicata da ava \cdot v, obbedisce a regole ben note, come la distributività rispetto alla somma di vettori o di scalari. Queste regole sono codificate in lemmi come smul_add, add_smul, smul_comm.

Il formalismo di Mathlib si estende anche a strutture più generali dei semplici spazi vettoriali: moduli su anelli, semimoduli su semianelli, e così via. Questo approccio consente di trattare anche i casi in cui l’anello dei coefficienti non è commutativo, ampliando l’ambito applicativo dell’algebra lineare. Per esempio, l’azione degli ideali su sottospazi può essere descritta come un modulo degli ideali di RR sui sottospazi di un modulo su RR.

Le applicazioni lineari, a loro volta, sono rappresentate da mappe bundled, cioè strutture che contengono sia la funzione sia le dimostrazioni delle sue proprietà lineari. Questo permette di trattarle come oggetti dotati di propria algebra: possono essere sommate, scalate e composte con altre mappe lineari mediante operatori come ◦ₗ o LinearMap.comp. La notazione Vl[K]WV \toₗ[K] W denota lo spazio delle applicazioni lineari tra VV e WW su un campo KK, ed è cruciale q

Come si struttura e si manipola lo spazio dei sottospazi vettoriali in algebra lineare astratta

Nella teoria dei moduli e degli spazi vettoriali, la nozione di sottospazio vettoriale è fondamentale e assume una struttura ricca e ben definita. Considerando uno spazio vettoriale V su un campo K, un sottospazio vettoriale non è semplicemente un sottoinsieme chiuso rispetto alle operazioni lineari, ma può essere formalizzato come un oggetto dotato di struttura propria, chiamato Submodule K V, che consente di sfruttare proprietà avanzate e tecniche di algebra astratta.

Uno dei vantaggi principali nell’introdurre la nozione di Submodule come tipo distinto — piuttosto che limitarsi a un predicato che verifica se un insieme è un sottospazio — è la possibilità di dotare l’insieme dei sottospazi di una struttura di reticolo completo rispetto all’inclusione. Questo significa che per ogni coppia di sottospazi è possibile definire operazioni di infimo e supremo che generalizzano rispettivamente l’intersezione e la generazione del sottospazio unione, con la differenza fondamentale che la semplice unione di due sottospazi non è in generale un sottospazio, mentre il supremo corrisponde al sottospazio generato dall’unione.

La struttura di reticolo permette di parlare in modo coerente e conciso di sottospazi come elementi di un sistema ordinato dotato di operazioni di massimo e minimo, dove l’elemento massimo (⊤) rappresenta lo spazio intero V e l’elemento minimo (⊥) rappresenta il sottospazio banale contenente solo lo zero. Questa dualità fornisce un quadro elegante per discutere proprietà fondamentali come la somma diretta interna di sottospazi.

Nel caso di somme dirette, si utilizza la relazione di complementarietà (IsCompl) tra due sottospazi, che implica che la loro somma generi l’intero spazio e che la loro intersezione sia solo l’elemento neutro. Questa idea si estende naturalmente a famiglie arbitrariamente indicizzate di sottospazi attraverso il concetto di somma diretta interna (DirectSum.IsInternal), che assicura indipendenza e rappresentazione univoca degli elementi come somme di componenti in ciascun sottospazio.

Un altro aspetto cruciale riguarda la costruzione di sottospazi a partire da insiemi arbitrari. L’operazione Submodule.span K s genera il più piccolo sottospazio contenente un dato insieme s, formalizzando la nozione classica di combinazioni lineari. Dal punto di vista teorico, la proprietà universale di questa costruzione si traduce in una connessione di Galois tra l’operazione di generazione del sottospazio e l’inclusione degli insiemi, offrendo uno strumento potente per dimostrazioni e ragionamenti.

La possibilità di “spingere” e “tirare” sottospazi lungo mappe lineari (map e comap) permette di studiare il comportamento delle strutture lineari rispetto agli omomorfismi tra spazi vettoriali. In particolare, la nozione di immagine (range) e nucleo (ker) di una mappa lineare si formalizza come sottospazi specifici, rispettivamente come l’immagine del sottospazio intero e il preimmagine del sottospazio nullo tramite la mappa. La relazione tra iniettività e suriettività della mappa e le proprietà dei suoi sottospazi associati è un cardine nella teoria delle trasformazioni lineari.

Infine, lo spazio quoziente emerge come uno strumento per “modulare” uno spazio vettoriale rispetto a un sottospazio, generalizzando l’idea di classi di equivalenza. La proiezione naturale da V allo spazio quoziente è un esempio paradigmatico di mappa lineare la cui struttura può essere studiata tramite le nozioni precedenti.

È essenziale comprendere che la formalizzazione di queste nozioni in un sistema di dimostrazione assistita, come Lean con Mathlib, non solo ne rende rigorosa la definizione, ma apre alla possibilità di automatizzare e generalizzare molte dimostrazioni. La capacità di interpretare sottospazi come tipi con struttura e di lavorare con reticoli completi consente di sfruttare strumenti di algebra astratta e logica per avanzare nello studio e nella manipolazione di strutture algebriche complesse.

Oltre a quanto esposto, è importante per il lettore riconoscere come queste strutture permettano di affrontare problemi più ampi nell’algebra lineare, quali la decomposizione di spazi, la classificazione di operatori lineari e l’analisi delle proprietà di iniettività, suriettività e isomorfismi. Comprendere le proprietà universali e categoriali che sottendono le costruzioni di sottospazi e spazi quoziente apre la strada a studi più avanzati in algebra omologica, teoria delle rappresentazioni e geometria algebrica.