La formalizzazione della matematica attraverso Lean 4 rappresenta un approccio rivoluzionario nel modo di concepire e verificare rigorosamente le dimostrazioni matematiche. Lean è un assistente di prova interattivo che consente di scrivere definizioni, teoremi e dimostrazioni in un linguaggio formale assimilabile a un linguaggio di programmazione, garantendo così la correttezza sintattica e logica degli argomenti trattati. Questo sistema non richiede una conoscenza preliminare approfondita della formalizzazione o delle metodologie informatiche; si rivolge infatti anche a chi possiede un bagaglio matematico di base, offrendo al contempo la possibilità di apprendere argomenti di vario livello, dal numero teorico all’analisi, in modo graduale e rigoroso.

L’utilizzo di Lean si basa su una libreria estesa e in continua crescita, chiamata Mathlib, che fornisce una vasta gamma di strumenti e teoremi predefiniti. La sua natura interattiva, soprattutto quando integrata nell’editor Visual Studio Code, facilita l’apprendimento e la sperimentazione, offrendo un ambiente in cui si può iterare rapidamente fra la scrittura del codice matematico e la sua verifica formale. Il coinvolgimento della comunità, come quella presente sulla piattaforma Zulip, è un ulteriore valore aggiunto che permette di condividere dubbi, soluzioni e approfondimenti.

Lean trasforma quindi il processo matematico in un’attività quasi programmatoria, in cui ogni passaggio deve essere esplicitato e controllato dal sistema. Questo approccio non solo previene errori logici ma promuove anche una comprensione più profonda delle strutture matematiche. Nel mondo contemporaneo, dove la precisione e la riproducibilità sono fondamentali, la formalizzazione con Lean rappresenta un punto di svolta, garantendo che i risultati matematici non siano mai lasciati al caso o a interpretazioni ambigue.

È importante considerare che la formalizzazione richiede un cambio di paradigma rispetto alla matematica tradizionale. Spesso si tratta di tradurre concetti intuitivi in un codice rigoroso, il che può inizialmente apparire laborioso o limitativo. Tuttavia, questo processo offre il vantaggio di creare una base solida su cui costruire nuovi risultati con certezza assoluta. Inoltre, la formalizzazione apre la strada all’automatizzazione di molte attività matematiche, dall’esplorazione di congetture alla verifica di teoremi complessi, facilitando lo sviluppo della ricerca.

Un altro aspetto cruciale riguarda la gestione e la modularità delle dimostrazioni. Lean consente di strutturare il lavoro in modo gerarchico, utilizzando lemmi, teoremi e strutture algebriche che si possono richiamare e combinare, semplificando la complessità e migliorando la chiarezza. Questo modello riflette la pratica matematica formale, ma amplificandone la precisione e l’efficienza.

Al di là della semplice scrittura di prove, è essenziale comprendere il significato e l’impatto che la formalizzazione comporta sul piano epistemologico: la matematica, tradizionalmente basata su dimostrazioni accettate dalla comunità, qui viene portata a un livello in cui ogni passaggio è verificabile da una macchina, eliminando incertezze e potenziali errori umani. Questo non significa che la creatività e l’intuizione siano escluse, ma che trovano uno strumento di supporto potentissimo, capace di accompagnare la scoperta e la verifica.

Infine, la familiarità con Lean favorisce un’apertura interdisciplinare, poiché le tecniche di formalizzazione sono affini a quelle della programmazione, dell’intelligenza artificiale e della logica computazionale. Gli strumenti e le competenze acquisite possono quindi essere applicati in vari ambiti, dalla sicurezza software alla verifica di algoritmi complessi, rendendo questa conoscenza un patrimonio versatile e prezioso.

Come si costruisce una funzione inversa nel contesto della logica classica in Lean?

Nel contesto della teoria degli insiemi formalizzata in Lean, la costruzione di una funzione inversa quando non è garantita la computabilità richiede un ricorso esplicito alla logica classica. Quando abbiamo un'applicazione f:αβf : \alpha \to \beta, vogliamo costruire una funzione βα\beta \to \alpha che restituisca, per ogni yβy \in \beta, un xαx \in \alpha tale che f(x)=yf(x) = y, se esiste. Per fare ciò, dobbiamo selezionare un elemento da un insieme per il quale sappiamo solo che esiste un tale xx, ma non sappiamo come costruirlo effettivamente. Questo tipo di scelta non è computabile e perciò non può essere espresso in logica costruttiva; è qui che entra in gioco l'assioma della scelta, nella sua forma classica.

Lean permette di accedere a tale assioma attraverso l’operatore Classical.choose, che agisce su un enunciato esistenziale x,P(x)\exists x, P(x), restituendo un elemento xx che soddisfa PP. La correttezza della scelta è garantita dal teorema Classical.choose_spec, che assicura che P(Classical.choose h)P(\text{Classical.choose}\ h) è vero per ogni ipotesi h:x,P(x)h : \exists x, P(x).

Con questo strumento in mano, si può definire la funzione inversa in modo condizionale: se esiste un xx tale che f(x)=yf(x) = y, allora Classical.choose h restituisce tale xx; altrimenti, si fornisce un valore di default in α\alpha. Questo comportamento si esprime tramite una costruzione if dipendente, che si basa sull’identità dif_pos h per trattare il ramo positivo e dif_neg h per il ramo negativo.

La funzione risultante non è computabile, e per questo si dichiara l’ambiente come noncomputable. Inoltre, la funzione così definita non è garantita unica: essa restituisce "un qualche" xx tale che f(x)=yf(x) = y, ma non possiamo sapere quale, né possiamo esigerne uno specifico.

Un risultato cruciale è il teorema inverse_spec, che afferma che, se x,f(x)=y\exists x, f(x) = y, allora f(inverse f y)=yf(\text{inverse}\ f\ y) = y. Questa proprietà rende la funzione inversa definita una funzione inversa sinistra se e solo se ff è iniettiva, e una inversa destra se e solo se ff è suriettiva. Le nozioni formali di LeftInverse e RightInverse possono essere esplorate direttamente nell'ambiente di sviluppo di Lean per approfondire questa corrispondenza.

Un caso particolarmente interessante è la formalizzazione del Teorema di Cantor, che dimostra che non esiste una funzione suriettiva da un insieme al suo insieme delle parti. L’argomento si fonda su un insieme costruito diagonalmente che porta inevitabilmente a una contraddizione se si suppone l’esistenza di tale suriezione. La forza del formalismo in Lean consiste nel rendere questa intuizione perfettamente rigorosa e verificabile in ogni passaggio.

Nella parte finale si affronta un teorema più sofisticato: il Teorema di Schröder-Bernstein. Si tratta di un risultato profondo ma sorprendentemente accessibile una volta che si interiorizza l’intuizione: se esistono due applicazioni iniettive f:αβf : \alpha \to \beta e g:βαg : \beta \to \alpha, allora esiste una biiezione tra α\alpha e β\beta. La costruzione della biiezione avviene tramite un’analisi ricorsiva dell’immagine composta gfg \circ f, che genera una successione decrescente di insiemi SnS_n, la cui unione costituisce il dominio su cui applicare ff. Sul complemento di questo dominio, si utilizza l'inverso parziale di gg, costruito con invFun, funzione definita nella libreria Mathlib di Lean, che sfrutta ancora una volta l’assioma della scelta per garantire l’esistenza di un preimmagine ove possibile.

La funzione risultante, chiamata sbFun, utilizza quindi una scelta condizionata per decidere se applicare ff o l'inverso di gg, ottenendo così una funzione che è sia iniettiva sia suriettiva, quindi biiettiva. È importante notare che la dimostrazione si appoggia in modo essenziale alla logica classica, come mostra l'uso esteso di costrutti non computabili, e proprio per questo rappresenta un perfetto esempio di come le tecniche formali siano in grado di catturare in modo rigoroso risultati profondi della matematica.

È fondamentale comprendere che ogni passo in queste costruzioni formalizzate non è solo una traduzione meccanica della matematica tradizionale, ma una vera e propria chiarificazione concettuale. L’esercizio di formalizzazione rivela ogni dipendenza logica, ogni assunzione spesso implicita, costringendo il matematico a un rigore assoluto che spesso porta a una comprensione più profonda del risultato.

Per consolidare la comprensione, è utile esercitarsi nel dimostrare che l'inversa costruita è davvero un'inversa sinistra o destra in base alla proprietà di ff. È anche consigliato analizzare i dettagli della funzione invFun, poiché essa rappresenta un meccanismo fondamentale per navigare tra funzi

Come formalizzare e comprendere le identità matematiche fondamentali

In matematica, molte delle identità e delle proprietà fondamentali sono basate su ricorsione e induzione. Questi concetti sono essenziali, non solo per risolvere problemi pratici, ma anche per formare una base solida nella logica e nella dimostrazione formale. Un esempio di come affrontare un’operazione di induzione è l’identità che esprime la funzione fattoriale come prodotto di numeri. La definizione della funzione fattoriale tramite il prodotto può essere dimostrata con induzione, come nel seguente esempio:

lean
example (n : N) : fac n = Π i ∈ range n, (i + 1) := by induction' n with n ih
· simp [fac, prod_range_zero] · simp [fac, ih, prod_range_succ, mul_comm]

Questa espressione è significativa in quanto evidenzia come il software di dimostrazione Lean gestisca le proprietà degli operatori, come la commutatività del prodotto (mul_comm). La semplificazione con le regole di commutatività non è banale, poiché potrebbe causare un ciclo infinito. Tuttavia, Lean è abbastanza intelligente da riconoscere quando può applicare la regola senza rischiare di entrare in un loop infinito. Le regole di semplificazione come mul_assoc, mul_comm e mul_left_comm sono molto utili per identificare i prodotti che sono uguali, anche se permutati o racchiusi da parentesi diverse.

In effetti, il ragionamento sulle identità di somma e prodotto è spesso arricchito da teoremi che coinvolgono somme di numeri naturali. Un esempio è il teorema che stabilisce la somma dei primi n numeri naturali:

lean
theorem sum_id (n : N) : Σ i ∈ range (n + 1), i = n * (n + 1) / 2 :=
by symm; apply Nat.div_eq_of_eq_mul_right (by norm_num : 0 < 2) induction' n with n ih · simp rw [Finset.sum_range_succ, mul_add 2, ← ih] ring

In questo esempio, il passaggio iniziale elimina il denominatore. Questo tipo di semplificazione è utile perché, nel formalizzare identità, è importante tenere conto delle condizioni laterali che possono sorgere quando si maneggiano divisioni. È fondamentale anche evitare l'uso di sottrazioni tra numeri naturali quando possibile.

Queste tecniche possono essere applicate a una varietà di identità. Si suggerisce di provare a dimostrare teoremi analoghi, come quelli che riguardano la somma dei quadrati, che sono ben noti in molti testi matematici:

lean
theorem sum_sqr (n : N) : Σ i ∈ range (n + 1), i ^ 2 = n * (n + 1) * (2 * n + 1) / 6 := by sorry

Per chi è appassionato di argomenti fondamentali, può essere interessante esplorare la commutatività e l’associatività dell'addizione e della moltiplicazione, nonché la distributività della moltiplicazione rispetto all'addizione. Questi concetti sono strettamente legati alle definizioni di addizione e moltiplicazione in Lean, che sono basate su ricorsione.

Per esempio, la definizione dell'addizione in Lean può essere scritta come segue:

lean
inductive MyNat where
| zero : MyNat | succ : MyNat → MyNat namespace MyNat def add : MyNat → MyNat → MyNat | x, zero => x | x, succ y => succ (add x y)

Attraverso l’induzione, possiamo provare che l'addizione è commutativa:

lean
theorem add_comm (m n : MyNat) : add m n = add n m := by induction' n with n ih · rw [zero_add] rfl rw [add, succ_add, ih]

Inoltre, anche se i teoremi come mul_add e mul_comm sono ancora da dimostrare, è chiaro che la definizione di addizione e moltiplicazione è abbastanza potente da produrre dimostrazioni di queste identità altrimenti complesse.

Un altro argomento affascinante è la dimostrazione che esistono infiniti numeri primi, una delle più antiche e famose proposizioni matematiche. Questa può essere formalizzata nel modo seguente: per ogni numero naturale n, esiste un numero primo maggiore di n. La prova formale si basa sull'idea che, dato qualsiasi numero n! + 1, i suoi fattori primi non possono essere uguali o minori di n, contraddicendo così l'ipotesi iniziale. Formalizzare questa dimostrazione in Lean comporta l'uso di induzione forte, che permette di dimostrare che ogni numero naturale possiede una certa proprietà.

In generale, le tecniche di induzione e ricorsione sono alla base di molte dimostrazioni matematiche avanzate. Sebbene a volte queste tecniche possano sembrare astratte, sono strumenti potentissimi che, quando utilizzati correttamente, permettono di trattare una vasta gamma di problemi matematici, dalle semplici identità alle teorie più complesse.

Come si definiscono e si studiano la convergenza e la continuità negli spazi metrici?

La nozione di convergenza e continuità negli spazi metrici si basa sull’idea di distanza, generalizzando la nozione familiare di distanza tra numeri reali. Uno spazio metrico è definito come un tipo X dotato di una funzione di distanza dist: X → X → ℝ, che soddisfa proprietà fondamentali quali la non negatività, la simmetria, l’identità degli indiscernibili e la disuguaglianza triangolare. Questi requisiti garantiscono che la distanza rappresenti in modo coerente la nozione intuitiva di "vicinanza" tra punti.

La convergenza di una successione (uₙ) verso un punto a in uno spazio metrico X è formalmente definita attraverso la funzione di distanza: si dice che u tende a a se, per ogni ε positivo, esiste un indice N tale che per ogni n ≥ N, la distanza dist(uₙ, a) è minore di ε. Questo approccio basato sulle "bolle" di raggio ε intorno ad a permette di generalizzare la definizione di limite anche in contesti molto astratti.

Analogamente, la continuità di una funzione f: X → Y tra spazi metrici si esprime in termini di controllo delle distanze. f è continua se per ogni punto x in X e per ogni ε > 0, esiste un δ > 0 tale che per ogni x' vicino a x, ossia con dist(x', x) < δ, si ha che dist(f(x'), f(x)) < ε. Questo modo di definire la continuità permette di stabilire la dipendenza sensibile dei valori di f rispetto a variazioni piccole nell’argomento.

La manipolazione di queste definizioni e proprietà può risultare complessa, soprattutto quando si considerano funzioni definite su prodotti di spazi metrici o funzioni composte. Ad esempio, la funzione distanza stessa, intesa come funzione da X × X a ℝ, è continua, e ciò si dimostra mediante composizioni di funzioni continue e proprietà delle proiezioni coordinate. In questi contesti, tecniche di composizione e di uso di lemmi di continuità si rivelano fondamentali per la dimostrazione.

L’uso di lemmi come Continuous.comp (per la composizione di funzioni continue), Continuous.prod_mk (per la continuità delle funzioni definite su prodotti) e Continuous.dist (per la continuità di funzioni che misurano distanze tra immagini di punti) costituisce il nucleo delle dimostrazioni formali. Tali strumenti non solo facilitano la costruzione di prove formali, ma evidenziano anche la struttura interna delle funzioni continue e la relazione tra topologia e metrica.

Da un punto di vista più ampio, la distinzione tra continuità globale e continuità puntuale risulta significativa. La continuità puntuale è definita analogamente, ma localmente attorno a un punto specifico, mediante condizioni ε-δ, ed è alla base di molte generalizzazioni e approfondimenti nella teoria.

Infine, definizioni geometriche quali quelle di palla aperta o chiusa derivano direttamente dalla funzione di distanza e costituiscono la base per definire insiemi aperti e chiusi in uno spazio metrico. L’insieme delle palle aperte genera la topologia indotta dalla metrica, e questo collegamento sottolinea la profonda relazione tra la struttura metrica e la struttura topologica.

Comprendere questi concetti permette di estendere la teoria classica dei numeri reali e delle successioni a contesti più generali e astratti, fornendo strumenti potenti per l’analisi matematica e la topologia. È importante considerare che la funzione di distanza può assumere forme più generali, come distanze infinite o pseudodistanze, aprendo la strada a ulteriori estensioni della teoria e a spazi più complessi, quali gli spazi normati e quelli metrici estesi.

Il lettore deve tener presente che la formalizzazione di questi concetti, come avviene in sistemi di dimostrazione automatica, richiede una conoscenza approfondita delle proprietà formali e delle tecniche di composizione, ma allo stesso tempo offre una chiarezza e una precisione indispensabili per sviluppi rigorosi e applicazioni future. La continuità e la convergenza non sono solo proprietà astratte, ma strumenti concreti per comprendere la struttura degli spazi e il comportamento delle funzioni, con implicazioni fondamentali in analisi, geometria e oltre.