In Lean gebruiken we de existentiële kwantor, weergegeven als , om te zeggen: "er bestaat". De formele expressie in Lean betekent dat er een reëel getal tussen 2 en 3 bestaat. De gebruikelijke manier om een dergelijk statement te bewijzen, is door een specifiek reëel getal te tonen en aan te tonen dat het voldoet aan de gestelde eigenschap. Het getal 2.5 voldoet aan de eis, en de norm_num tactiek kan bewijzen dat het aan de beschrijving voldoet.
Om dit bewijs effectief te leveren, kan de "use" tactiek in Lean worden ingezet om het object dat voldoet aan de voorwaarden van de existentiële uitspraak te presenteren. Bijvoorbeeld, de uitspraak kan als volgt bewezen worden:
Hier geven we met "use" het getal 5/2 op, wat voldoet aan de vereiste eigenschappen, en vervolgens wordt de bewijslast afgerond door de tactiek "norm_num", die de numerieke eigenschappen controleert.
Naast de eenvoudige gevallen is het mogelijk om meer complexe bewijzen te leveren met de "have"-tactiek, waarbij we stapsgewijs bewijsstukken verzamelen. In dit geval kunnen we bijvoorbeeld de bewering als volgt formuleren:
In dit geval hebben we de voorwaarden voor de existentiële uitspraak opgesplitst in twee deelvoorwaarden die de eigenschap van het getal 5/2 verifiëren. Het gebruik van "have" stelt ons in staat de voorwaarden stap voor stap te bewijzen voordat we de existentiële bewering zelf leveren.
Een alternatieve manier om een bestaand object te gebruiken, is via Lean’s anonieme constructeurnotatie. Dit wordt bijvoorbeeld als volgt gebruikt:
In deze versie van het bewijs gebruiken we geen "by", maar geven we de volledige bewijsconstructie direct aan. Dit is handig wanneer we op een beknopte manier bewijs willen leveren zonder tussenstappen.
Wanneer een object bestaat, maar we niet specifiek willen aangeven welk object het is, kunnen we gebruik maken van de existentiële kwantor om dit op een algemenere manier te zeggen. We kunnen bijvoorbeeld zeggen dat een functie een bovengrens heeft zonder die bovengrens expliciet te noemen. Dit kan als volgt geformuleerd worden:
Hier definiëren we de eigenschap dat een functie een bovengrens heeft, en gebruiken we de existentiële kwantor om te zeggen dat er een bestaat waarvoor de functie altijd kleiner dan of gelijk aan is.
In de praktijk kan de existentiële kwantor vaak worden gebruikt om de eigenschappen van functies of objecten in een wiskundige structuur te onderzoeken. Wanneer we weten dat er een object bestaat dat een bepaalde eigenschap heeft, kunnen we dit object een naam geven en ermee werken, zoals in het geval van de bovengrens van functies. Dit wordt vaak gedaan met de tactieken zoals "rcases", die de informatie in de existentiële kwantor "uitpakken", waardoor we toegang krijgen tot de specifieke eigenschappen van het object.
Bijvoorbeeld, stel dat we twee functies en hebben die beide een bovengrens hebben. We kunnen de eigenschap van hun som als volgt bewijzen:
In dit bewijs gebruiken we de tactiek "rcases" om de bovengrenzen van en uit te pakken en deze te combineren om de bovengrens van hun som te bewijzen. Dit is een gebruikelijke methode in de wiskunde: het unpacken van informatie waarvan we weten dat het bestaat, om vervolgens verder te redeneren over de nieuwe situatie.
In meer complexe gevallen kunnen we de "rcases"-tactiek combineren met andere tactieken zoals "rintro" of "obtain", wat een efficiënte manier biedt om met existentiële kwantoren te werken. De tactiek "rintro" is bijvoorbeeld een combinatie van "intro" en "rcases", waarmee we de structuur van de bewijzen kunnen verbeteren.
Het gebruik van de existentiële kwantor is van fundamenteel belang voor veel wiskundige redeneringen, en Lean biedt verschillende krachtige manieren om hiermee om te gaan. De combinatie van "rcases", "rintro", en "obtain" zijn de meest voorkomende manieren om met existentiële uitspraken in Lean te werken. Bovendien ondersteunt Lean ook pattern matching, wat overeenkomt met de technieken die in de functionele programmeertalen worden gebruikt. Dit biedt niet alleen een praktische manier van redeneren, maar helpt ook om complexe wiskundige uitspraken te structureren en te bewijzen.
Een essentieel punt bij het gebruik van de existentiële kwantor is dat het ons in staat stelt om te redeneren over het bestaan van objecten zonder deze objecten expliciet te moeten identificeren. Dit maakt het een krachtig hulpmiddel in veel verschillende wiskundige contexten.
Hoe de Keuze Axioma en Inverse Functies de Grondslagen van Wiskundige Formele Bewijzen Beïnvloeden
In de wiskundige logica en formele systemen zoals Lean, komt het idee van inverse functies vaak naar voren, vooral wanneer de betrokken functies injectief of surjectief zijn. Dit is een bijzonder gebied van studie, waarin de integratie van klassieke logica, zoals het keuze axioma, cruciaal is voor het definiëren en werken met inverse functies. In dit hoofdstuk zullen we niet alleen de technische aspecten van inverse functies verkennen, maar ook de fundamentele rol van de keuzeoperator en de noodzaak voor onberekenbaarheid in bepaalde gevallen.
Het concept van een inverse functie is eenvoudig: gegeven een functie , willen we een functie vinden die voor elke (surjectieve eigenschap) en voor elke (injectieve eigenschap). Het probleem wordt echter ingewikkelder wanneer we werken binnen een formeel systeem, zoals Lean, waarbij de axiomatiek en de toegankelijkheid van verschillende logische principes een sleutelrol spelen.
Een van de fundamentele uitdagingen bij het definiëren van een inverse functie is dat we, in het geval van surjectiviteit, een element moeten vinden voor een gegeven zodat . Dit vereist een beroep op het keuze axioma, een principe uit de klassieke logica dat stelt dat als er voor elke element in een verzameling een keuze kan worden gemaakt, deze keuze altijd kan worden gemaakt, zelfs als de verzameling eindig of oneindig is. In Lean wordt dit bereikt door gebruik te maken van de klassieke keuzeoperator, Classical.choose, die een element selecteert uit een niet-lege verzameling. Deze operator wordt gebruikt om de waarde van te bepalen, waarvoor geldt dat .
De formele definitie van een inverse functie binnen Lean is dan als volgt:
Hier definieert inverse f y de inverse functie voor een gegeven . Als er een bestaat zodanig dat , wordt dat gekozen door Classical.choose h. Anders wordt een standaardwaarde uit geretourneerd. Het gebruik van de noncomputable sectie en de klassieke logica is nodig omdat de keuzeoperator niet altijd computabel is. Dit betekent dat de keuze van kan afhangen van niet-berekenbare keuzes, die fundamenteel zijn voor dit soort formaliseringen.
De Classical.choose_spec geeft aan dat de gekozen waarde altijd voldoet aan de voorwaarden van de oorspronkelijke stelling. Dit zorgt ervoor dat de inverse functie altijd een geldig element kiest wanneer dit mogelijk is.
Wat betreft de injectiviteit en surjectiviteit van een functie, worden de eigenschappen van de inverse functie als volgt beschreven:
-
Een functie heeft een linksinversie als en alleen als deze injectief is.
-
Een functie heeft een rechtse inversie als en alleen als deze surjectief is.
Deze concepten kunnen gemakkelijk in Lean worden geformaliseerd, waarbij de gebruikelijke eigenschappen van injectieve en surjectieve functies worden onderzocht. De stellingen die deze relaties aantonen kunnen als volgt worden geformuleerd:
Daarnaast introduceren we in deze context de beroemde Cantor's Theorem, die stelt dat er geen surjectieve functie bestaat van een verzameling naar de machtsverzameling van die verzameling. Dit is een fundamenteel resultaat in de verzamelingenleer en wordt als volgt geformaliseerd in Lean:
Deze stelling toont aan dat er geen surjectieve functie kan bestaan van een verzameling naar zijn machtsverzameling. Het bewijs vereist een subtiele redenering en toont aan hoe fundamentele logische principes, zoals de ontkenning van de surjectiviteit van een functie, in formele systemen kunnen worden behandeld.
Verder is er het Schröder-Bernstein Theorem, een andere wiskundige stelling die de relatie tussen injectieve functies en de cardinaliteit van verzamelingen in een formeel systeem onderzoekt. Dit stelt dat als twee functies en beide injectief zijn, er een bijectie bestaat tussen de verzamelingen en , zelfs als ze oneindig zijn.
De manier waarop de stelling van Schröder-Bernstein wordt geformaliseerd in Lean maakt gebruik van de techniek van het samenstellen van functies en het definieren van een bijectie door een combinatie van injectieve functies en inverse functies. De bijbehorende definitie wordt als volgt gepresenteerd:
Dit resultaat bouwt voort op de concepten van injectieve en surjectieve functies en illustreert de kracht van formele wiskundige systemen in Lean bij het bewijzen van zulke fundamentele theorema’s.
Belangrijk voor de lezer is te begrijpen dat de werking van inverse functies niet alleen afhankelijk is van de abstracte wiskundige principes, maar ook van de formele logica die eraan ten grondslag ligt. De keuze van een element uit een verzameling, bijvoorbeeld via de keuzeoperator, is essentieel voor de validiteit van inverse functies in formele systemen. In de praktijk wordt dit vaak over het hoofd gezien, maar het heeft grote implicaties voor de computability van wiskundige constructies. Het is ook van belang om te erkennen dat de formaliteit van de bewijsvoering ons niet alleen helpt de resultaten te begrijpen, maar ons ook in staat stelt om wiskundige concepten op een volledig rigoureuze manier te hanteren.
Hoe Bewijs je Eigenschappen van de Fibonacci-reeks met Inductie in Lean?
De Fibonacci-reeks is een van de fundamentele objecten in de getaltheorie en heeft talrijke interessante eigenschappen. In Lean, een formeel systeem voor wiskundig bewijs, kunnen we de eigenschappen van de Fibonacci-reeks vaststellen door middel van inductieve bewijzen. Dit hoofdstuk bespreekt de techniek van inductie in Lean en laat zien hoe deze wordt toegepast op de Fibonacci-reeks en gerelateerde stellingen.
Een veelvoorkomende eigenschap van de Fibonacci-reeks die we willen bewijzen, is de identiteit tussen opeenvolgende Fibonacci-getallen. Het volgende bewijs toont aan dat twee opeenvolgende Fibonacci-getallen relatief priem zijn, oftewel hun grootste gemene deler is 1:
Dit bewijs maakt gebruik van inductie over het natuurlijke getal . In de basisstap, wanneer , wordt de eigenschap triviaal bewezen. In de inductieve stap wordt gebruik gemaakt van de inductieve hypothese om de gewenste eigenschap voor te bewijzen.
Naast het gebruik van inductie, kan Lean ook geoptimaliseerde rekenkundige definities gebruiken om de Fibonacci-getallen snel te berekenen. De directe implementatie van de Fibonacci-functie in Lean is echter zeer inefficiënt, omdat deze exponentieel in de tijd groeit ten opzichte van het argument. Dit kan eenvoudig verklaard worden door te kijken naar de recursieve structuur van de functie.
Om deze inefficiëntie te verhelpen, kunnen we een staartrecursieve versie van de Fibonacci-functie implementeren, die de berekening in lineaire tijd uitvoert:
Dit verbetert de prestaties drastisch door de recursie op te slaan in twee variabelen, waardoor het geheugenverbruik en de tijdcomplexiteit verminderen. Het bewijs dat deze functie hetzelfde resultaat oplevert als de oorspronkelijke Fibonacci-functie wordt ook gegeven door inductie, waarbij we aantonen dat de helperfunctie aux dezelfde waarden produceert als de reguliere Fibonacci-functie:
Bij het werken met inductie in Lean wordt vaak de generalizing-tactiek gebruikt, die een extra variabele in de inductieve hypothese introduceert, wat handig is wanneer we te maken hebben met functies die meerdere parameters vereisen. Dit zorgt ervoor dat de inductie niet alleen over de belangrijkste variabele gaat, maar over de gehele structuur van de functie.
In sommige gevallen kan het nodig zijn om de inductie te splitsen in verschillende gevallen, bijvoorbeeld wanneer een getal gelijk is aan 0 of een opvolger is van een ander getal. Dit wordt vaak gedaan met de cases of rcases tactieken, die de bewijzen opsplitsen in kleinere, behandelbare delen. Het gebruik van deze tactieken zorgt ervoor dat de bewijzen efficiënter worden en dat Lean sneller de relevante gevallen kan afleiden.
Naast deze basale inductie-toepassingen kunnen we ook meer geavanceerde resultaten bewijzen, zoals de eigenschap van priemgetallen. De stelling hieronder stelt dat elk natuurlijk getal een priemdivisie heeft. Het bewijs maakt gebruik van een inductieve aanpak, waarbij we de stelling zelf in zijn bewijs gebruiken:
Dit bewijs toont aan hoe we inductie kunnen combineren met bekende eigenschappen van priemgetallen om een bewijs op te bouwen, waarbij Lean in staat is om een eerdere stelling opnieuw toe te passen in de inductieve stap.
Naast de toepassing van inductie is het belangrijk om te begrijpen dat Lean’s mechanismen voor recursieve definities van functies voldoende flexibel zijn om arbitraire recursieve oproepen toe te staan, zolang de complexiteit van de argumenten afneemt volgens een goed-onderbouwde maat. Dit maakt Lean tot een krachtig hulpmiddel voor het bewijzen van eigendommen van recursieve functies en het vaststellen van getaltheoretische stellingen.
Voor de lezer is het van belang te begrijpen dat inductie in Lean niet slechts een mechanisch proces is, maar een manier om wiskundige structuren formeel te begrijpen en vast te leggen. Het vermogen om recursieve functies efficiënt te definiëren en te bewijzen, evenals de kracht van inductie in het vaststellen van eigenschappen van getallenreeksen zoals de Fibonacci-reeks, is cruciaal voor het gebruik van Lean in de wiskunde en de getaltheorie.
Hoe de hiërarchie van morfismen in Lean werkt en de uitdagingen van coërcies
De basis van veel wiskundige theorieën is het gebruik van morfismen, die algebraïsche structuren met elkaar verbinden. In Lean, een geavanceerde wiskundige logica en bewijsassistent, wordt deze verbinding vaak uitgedrukt door middel van gemoduleerde structuren zoals monoid- en ringhomomorfismen. Wanneer we werken met deze structuren, moeten we rekening houden met de manier waarop Lean omgaat met coërcies en het correct toepassen van lemmata die betrekking hebben op deze morfismen.
Een eenvoudig voorbeeld is het concept van een monoid-homomorfisme, gedefinieerd als een functie tussen twee monoid-structuren die de monoidbewerking respecteert. Dit kan worden weergegeven met de structuur MonoidHom1, die in Lean als volgt wordt gedefinieerd: het bevat een functie toFun die de elementen van de eerste monoid naar de tweede monoid afbeeldt, en twee belangrijke eigenschappen: de afbeelding van het neutrale element is ook het neutrale element, en de afbeelding van het product van twee elementen is gelijk aan het product van de afbeeldingen van die elementen.
Er is echter een probleem dat snel opduikt wanneer we deze concepten in Lean willen uitbreiden naar meer geavanceerde structuren, zoals ringen. Het belangrijkste probleem is dat de lemmas die we definiëren voor monoid-homomorfismen niet direct toepasbaar zijn op ringhomomorfismen, omdat ringhomomorfismen een extra structuur (de optelling) vereisen. Een manier om dit te omzeilen is door een nieuwe typeklasse te introduceren, die de concepten van zowel monoid- als ringhomomorfismen omvat. Deze typeklasse, genaamd MonoidHomClass1, biedt een gemeenschappelijk raamwerk waarmee we lemmata kunnen definiëren die zowel voor monoid- als ringhomomorfismen gelden.
Dit vereist echter enige zorgvuldigheid in de manier waarop we coërcies (zoals de conversie van een homomorfisme naar een functie) behandelen. In de initiële benadering die in Lean werd geprobeerd, werd het MonoidHomClass1 gebruikt om een coërcie te creëren, maar dit leidde tot problemen bij het afleiden van de juiste instantiaties van de coërcie. De oplossing was het gebruik van de outParam functie, die ervoor zorgt dat Lean eerst de specifieke klasse van het homomorfisme bepaalt (bijvoorbeeld of het een monoid- of ringhomomorfisme is) en vervolgens de onderliggende monoid- of ringstructuren afleidt.
Deze oplossing, hoewel effectief, brengt een ander probleem met zich mee: de repetitieve code die nodig is om de toFun-functie en de bijbehorende coërcie- en coërcie-attributen te definiëren. Dit is opgelost door een extra abstractielaag toe te voegen met de DFunLike klasse. Deze klasse maakt het mogelijk om functies te behandelen die afhankelijk zijn van een extra parameter (zoals de monoid- of ringstructuur) en garandeert dat de coërcie-instantie injectief is, wat essentieel is om ambiguïteit bij het toewijzen van coërcies te voorkomen.
Met deze aanpassingen is het nu mogelijk om lemmata over morfismen te definiëren die universeel toepasbaar zijn, zowel voor monoid- als ringhomomorfismen. Dit maakt het eenvoudiger om algebraïsche resultaten te generaliseren en toe te passen op bredere contexten, zoals ringen en algebra's met extra structuren.
Naast deze technische aspecten is het belangrijk te begrijpen hoe Lean de hiërarchie van morfismen beheert en hoe dit bijdraagt aan de modulariteit en herbruikbaarheid van wiskundige bewijsvoering. Lean biedt een krachtig mechanisme voor het definiëren van abstracte wiskundige structuren, maar het vereist zorgvuldigheid bij het ontwerpen van deze structuren om fouten zoals de bovengenoemde te vermijden. Het correct toepassen van coërcies en het beheren van abstracties in Lean is een essentieel onderdeel van het werken met complexe wiskundige objecten en hun relaties.
De wiskundige structuren die we in Lean definiëren, zijn vaak niet alleen formele vertalingen van wiskundige concepten, maar vormen de basis voor verdere constructies en bewijsvoering. Het is cruciaal om te begrijpen dat, hoewel de syntaxis en semantiek van Lean de formele kracht en precisie van de wiskundige theorieën ondersteunt, het tegelijkertijd de noodzaak van zorgvuldig ontworpen abstracties benadrukt. Het doorgronden van de nuances van de typeklasse-hiërarchieën en coërcies in Lean kan helpen bij het ontwikkelen van meer robuuste en flexibele wiskundige modellen.
Wat zijn metrische ruimten en waarom zijn ze belangrijk voor topologie?
In de context van metrische ruimten kunnen open en gesloten verzamelingen gedefinieerd worden aan de hand van bollen. Dit is een fundamenteel concept in de topologie van metrische ruimten. Bollen worden gedefinieerd door een straal die een bepaalde afstand ten opzichte van een centraal punt geeft. Er zijn zowel open als gesloten bollen, afhankelijk van of de rand van de verzameling wordt meegenomen. Een gesloten bol rond een punt met straal , bijvoorbeeld, omvat alle punten waarvoor de afstand kleiner dan of gelijk aan is. Dit is wiskundig uitgedrukt als:
In dit geval is een willekeurig reëel getal, zonder restricties op het teken. Er zijn echter gevallen waarin een specifieke voorwaarde voor de straal noodzakelijk is, zoals in de volgende voorbeelden. Als de straal groter dan nul is, dan geldt bijvoorbeeld dat het punt altijd binnen de bol ligt:
Als de straal nul of groter is, geldt iets vergelijkbaars voor de gesloten bol:
\text{example (hr : 0 \leq r)} : a \in \text{Metric.closedBall} \, a \, r := \text{Metric.mem_closedBall_self} \, hrMet behulp van deze bollen kunnen we de concepten van open en gesloten verzamelingen binnen metrische ruimten verder verkennen. Een verzameling is open als voor elk punt binnen de verzameling er een bol bestaat die geheel binnen die verzameling ligt. Dit wordt formeel uitgedrukt als:
Gesloten verzamelingen zijn simpelweg de complementen van open verzamelingen. Ze bezitten een belangrijke eigenschap: ze zijn gesloten onder limieten. Dit betekent dat als een reeks van punten binnen een gesloten verzameling convergeert, het limietpunt ook binnen die verzameling ligt. De afsluiting van een verzameling is de kleinste gesloten verzameling die die verzameling bevat:
Naast deze basisconcepten speelt ook de rol van buurtfilters een belangrijke rol in de metrische ruimte, vooral binnen de context van Mathlib. Bollen fungeren als een basis voor deze filters, wat resulteert in belangrijke stellingen over open en gesloten bollen met een positieve straal.
Compactheid is een ander cruciaal concept in de topologie, vooral in metrische ruimten. Compacte verzamelingen hebben verschillende eigenschappen die ze onderscheiden van andere verzamelingen, zoals het feit dat elke reeks van punten in een compacte verzameling een convergente deelverzameling heeft die binnen de verzameling blijft. Dit is vergelijkbaar met het gedrag van intervallen in de reële getallen.
Een compacte verzameling heeft bijvoorbeeld de eigenschap dat elke continue functie op een niet-lege compacte verzameling die naar de reële getallen gaat, gebonden is en zijn grenzen ergens aanneemt (dit is het zogenaamde extreme-waarde-theorema). Compacte verzamelingen zijn altijd gesloten verzamelingen, en dit kan bewezen worden door de volgende stelling:
In een compacte metrische ruimte is elke gesloten verzameling ook compact. Dit leidt tot het concept van een universeel compacte ruimte, wat een ruimte is die compact is op haar gehele verzameling.
Uniforme continuïteit is een ander belangrijk onderwerp in de studie van metrische ruimten. Een functie wordt uniforme continuïteit genoemd als, voor elke , er een bestaat zodat voor alle punten en in de ruimte met , geldt dat . Dit concept wordt als volgt gedefinieerd:
Dit begrip is bijzonder belangrijk wanneer we continuïteit in compacte metrische ruimten bestuderen, waar een continue functie altijd uniforme continuïteit heeft. Dit wordt verder uitgewerkt met de zogenaamde "continuous on" functie, die de continuïteit van een functie op een compacte verzameling bestudeert.
Tot slot is volledigheid een essentieel concept in metrische ruimten. Een Cauchy-reeks in een metrische ruimte is een reeks waarvan de termen steeds dichter bij elkaar komen. In een complete ruimte zal elke Cauchy-reeks altijd naar een limiet punt convergeren. Dit wordt als volgt gedefinieerd:
Dit concept is van fundamenteel belang voor de analyse van metrische ruimten, vooral in de context van convergentie en het gedrag van reeksen in deze ruimten.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский