Når vi arbejder med negationer i matematisk bevisførelse, støder vi ofte på udfordringer, der kræver en grundig forståelse af både den klassiske logik og de teknikker, der bruges i bevisværktøjer som Lean. Negationer i matematik kan virke indviklede, især når de optræder i sammensatte udsagn. Denne del af matematikken handler om at forstå, hvordan vi håndterer negationer af universelle og eksistensielle udsagn, og hvordan vi udnytter teknikker som bevis ved kontradiktion.

Et af de første og mest grundlæggende værktøjer i matematik er begrebet "modsat". Det gælder i høj grad, når vi arbejder med udsagn som ¬∃ x, P x og ∀ x, ¬P x, som er to forskellige måder at udtrykke negationen af en eksistens og en universel kvantifikator.

For eksempel, hvis vi har et udsagn af formen ¬∃ x, P x, kan vi direkte udlede, at ∀ x, ¬P x. Beviset for dette sker ved at vise, at hvis der ikke eksisterer et element x, der opfylder P x, må det gælde, at P x ikke er sand for nogen x. Det omvendte, ∀ x, ¬P x → ¬∃ x, P x, følger ligeledes ved en simpel anvendelse af logikkens regler. Disse eksempler er ligetil og kan bevises med de værktøjer, man har lært tidligere i bevisteknologi.

Men det er ikke altid så enkelt, som det ser ud. Når vi arbejder med udsagn som ¬∀ x, P x, opstår der en ny udfordring. Her skal vi bruge en teknik kaldet "bevis ved kontradiktion", eller "by_contra", som gør det muligt at antage, at det modsatte af det ønskede resultat er sandt og derefter finde en modsigelse. Et konkret eksempel på dette kunne være: Hvis vi vil bevise, at der findes et x, for hvilket ¬P x gælder, og vi ved, at det er falsk, at ∀ x, P x, kan vi antage, at for alle x gælder P x, og derefter finde en modsigelse.

Bevis ved kontradiktion er grundlæggende for klassisk matematik. Den grundlæggende idé er, at hvis noget fører til en modsigelse, så må det modsatte være sandt. Denne teknik er yderst effektiv, når vi har at gøre med komplekse udsagn, hvor direkte bevis ikke er muligt. I Lean kan dette udtrykkes med by_contra og tillader os at bygge bro mellem de to modsatrettede udsagn.

Desuden er en anden nyttig teknik, der ofte benyttes i sådanne situationer, at arbejde med konjugationer. Når vi har to udsagn af formen A ∧ B (A og B), kan vi bevise dem hver for sig, hvilket er fundamentet for konstruktionen af en konjunktion. I Lean kan vi bruge constructor-taktikken til at opdele beviset i to dele: først bevise A og derefter B. Hvis vi skal udlede et udsagn fra en konjunktion, kan vi bruge rcases, rintro eller simpelthen tilgå komponenterne af konjunktionen ved hjælp af h.left og h.right.

En af de mere subtile aspekter ved at arbejde med negationer og konjunktioner i Lean er at forstå, hvordan man omdanner mål og hypoteser. Taktikker som push_neg og contrapose spiller en afgørende rolle i at forenkle udtrykkene og ændre deres form. Push_neg er især nyttig, når negationen er placeret udenfor en kvantifikator og hjælper med at "skubbe" negationen ind i kvantifikatorens rækkevidde. Dette gør det lettere at arbejde med, især når vi har komplekse sammensatte udsagn.

Derudover giver kontraposition (brug af contrapose) os mulighed for at transformere et udsagn af formen A → B til ¬B → ¬A, hvilket er nyttigt, når vi arbejder med beviser, der involverer modsigelse eller indirekte argumentation. Kontrapose! (med et udråbstegn) er en udvidelse, der anvender push_neg automatisk på både mål og relevante hypoteser.

Når vi når til principperne om falsum (ex falso), møder vi en af de mest kraftfulde metoder i matematik: alt følger fra en kontradiktion. Denne idé er fundamentet for mange matematiske beviser, hvor vi opdeler vores bevis i flere tilfælde og nogle gange opdager, at et af tilfældene fører til en modsigelse. I sådanne tilfælde kan vi bruge False.elim i Lean, som afslutter beviset ved at afsløre, at noget følger direkte fra den opnåede modsigelse. Denne teknik viser, hvordan man kan lukke et mål, når vi har fundet en åbenlys konflikt i vores hypoteser.

En interessant bemærkning i denne sammenhæng er brugen af tactic-kommandoer som exfalso, absurd og contradiction, som hver især tillader os at lukke et mål baseret på en kontradiktion. De fungerer alle ved at identificere, at vi har to modsatrettede udsagn, og derefter etablere enhver anden proposition som gyldig.

Når vi arbejder med sammensatte udsagn som konjunktioner og disjunktioner, er det nødvendigt at forstå, hvordan man håndterer disse gennem både direkte og indirekte beviser. Lean giver os de nødvendige værktøjer, som constructor og rcases, som kan anvendes til at adskille og manipulere beviser for disse komplekse udsagn.

Endelig er det vigtigt at huske på, at matematisk bevisførelse ikke kun handler om at finde én løsning, men om at vælge de rette teknikker og værktøjer til at forenkle og konstruere gyldige argumenter. Når man arbejder med negationer og klassisk logik, er det afgørende at forstå, hvordan negationer ændrer betydningen af udsagn, og hvordan vi kan bruge værktøjer som bevis ved kontradiktion, push_neg, og contrapose til at håndtere disse udsagn effektivt.

Hvordan beviser vi identiteter i algebraiske strukturer?

I algebraiske strukturer som ringe, er det ikke nødvendigt at tilføje aksiomer som add_zero eller add_neg_cancel, da disse følger direkte fra de øvrige aksiomer. For eksempel, i Lean kan vi vise, at addition af nul til et element ikke ændrer elementet, og at et element plus dets additive invers giver nul. Disse grundlæggende identiteter er essentielle for at arbejde med ringe og deres egenskaber.

Som et første eksempel, kan vi formulere teoremene for add_zero og add_neg_cancel som følger:

lean
theorem add_zero (a : R) : a + 0 = a := by rw [add_comm, zero_add] theorem add_neg_cancel (a : R) : a + -a = 0 := by rw [add_comm, neg_add_cancel]

Dette viser, at vi ikke behøver at definere disse egenskaber direkte, da de følger af de grundlæggende aksiomer for ringen. I stedet kan vi bruge disse teoremer i videre beviser og udledninger.

I Lean er der også en mulighed for at "midlertidigt" bevise en sætning fra biblioteket, for så at fortsætte med at bruge den eksisterende version af sætningen. Det er dog vigtigt at undgå at snyde i sine beviser, og man bør kun bruge de generelle fakta om ringe, som er blevet bevist tidligere i afsnittet.

For at illustrere dette, kan vi se på et nyttigt teorem som neg_add_cancel_left, som beskriver, hvordan et element minus sig selv plus et andet element forenkles:

lean
theorem neg_add_cancel_left (a b : R) : -a + (a + b) = b := by rw [← add_assoc, neg_add_cancel, zero_add]

Når vi arbejder med algebraiske strukturer, er det ikke kun muligt at anvende sætninger på objekter, men også på hypoteser og facts. For eksempel, hvis vi har hypotesen h:a+b=a+ch : a + b = a + c, kan vi bruge add_left_cancel teoremet til at udlede, at b=cb = c:

lean
theorem add_left_cancel {a b c : R} (h : a + b = a + c) : b = c := by sorry

Lean understøtter implicitte argumenter, hvilket betyder, at vi kan undgå at skrive de samme argumenter flere gange, hvis de allerede er givet gennem hypoteser. For eksempel, i stedet for at skrive a,b,ca, b, c eksplicit, kan vi bruge den mere kompakte notation:

lean
add_left_cancel h

Denne tilgang gør det lettere at arbejde med komplekse udtryk og beviser, da man undgår redundans og sparer tid på at skrive de samme elementer flere gange. Det er især nyttigt, når man arbejder med større algebraiske strukturer, hvor der kan være mange variabler og hypoteser.

En anden vigtig egenskab ved Lean er muligheden for at arbejde med flere bevismetoder, f.eks. ved at bruge "exact" eller "apply" til at afslutte beviset. Forskellen mellem disse metoder er, at "exact" kræver et fuldstændigt bevis, mens "apply" kan anvende et ufuldstændigt bevis, der derefter kan føre til nye mål, som skal bevises.

Når vi arbejder med ringe, skal vi også være opmærksomme på, at multiplikation ikke nødvendigvis er kommutativ. For at vise, at a0=0a \cdot 0 = 0, kan vi anvende de tidligere etablerede beviser om addition og negation, som hjælper med at udlede dette resultat.

lean
theorem mul_zero (a : R) : a * 0 = 0 := by have h : a * 0 + a * 0 = a * 0 + 0 := by rw [← mul_add, add_zero, add_zero] rw [add_left_cancel h]

I dette eksempel introducerer vi en ny mål med "have"-taktikken, som gør det muligt at bevise en del af sætningen og derefter bruge resultatet til at afslutte beviset for den oprindelige påstand.

Desuden er det værd at bemærke, at subtraktion i en ring kan defineres som addition af den additive invers:

lean
example (a b : R) : a - b = a + -b := sub_eq_add_neg a b

I realtalsmængden er dette definitionen af subtraktion, og Lean kan genkende, at begge sider af ligningen er identiske, hvilket gør det muligt at bruge ab=a+ba - b = a + -b uden yderligere bevis.

Når man arbejder med algebraiske strukturer, er det vigtigt at huske, at nogle af de fakta, vi har etableret om addition og negation, ikke nødvendigvis kræver hele styrken af ringaksioomerne. For eksempel kan en gruppe defineres med færre krav, som kun kræver et additivt eller multiplicativt gruppeoperativ. Det er en god idé at være opmærksom på forskellen mellem disse strukturer og forstå, hvordan de forskellige aksiomer og egenskaber spiller ind.

Når man bygger på de grundlæggende beviser og metoder, kan man gradvist udvide sin viden om algebraiske strukturer som grupper, ringe og kroppe, og hvordan man effektivt arbejder med dem i matematiske beviser. Det er gennem denne grundlæggende forståelse, at man kan begynde at anvende Lean og andre værktøjer til at bevise mere komplekse algebraiske identiteter og udlede nye resultater.

Hvordan arbejde med undermoduler, direkte summer og kvotientrum i Lean?

I Lean er arbejdet med undermoduler af vektorrum en grundlæggende del af den lineære algebra. Lean tilbyder kraftfulde værktøjer til at håndtere strukturer som undermoduler, direkte summer og kvotientrum, som er essentielle i mange teoretiske områder som algebra og funktionalanalyse. For at forstå disse begreber, er det nødvendigt at se på, hvordan Lean implementerer dem og udnytter den matematiske struktur til at lave præcise og effektive beviser.

Et af de vigtigste aspekter ved Lean's håndtering af undermoduler er den måde, hvorpå undermoduler implementeres som typer snarere end som sætspecifikke udsagn. Dette giver Lean mulighed for at bygge komplekse algebraiske strukturer, der arver egenskaber fra deres overordnede vektorrum. For eksempel, et undermodul af et vektorrum VV over en ring KK er i sig selv et vektorrum, og Lean sørger for automatisk at tildele det nødvendige modulstruktur via typeklasser.

Når man arbejder med undermoduler i Lean, anvender man typisk operationer som \cap (snit) og \cup (forening) til at konstruere nye undermoduler. Snitoperationen, som omdanner et snit af to undermoduler til et undermodul, er for eksempel en del af en komplet lattice-struktur, som Lean udnytter til at levere effektive beviser. Et eksempel på dette er, hvordan intersection (snit) af to undermoduler HH og HH' i et vektorrum VV kan skrives som:

(HH:SubmoduleKV)=(H:SetV)(H:SetV)(H \cap H' : Submodule K V) = (H : Set V) \cap (H' : Set V)

Her ser vi, hvordan Lean's notation og den matematiske konstruktion af undermoduler fungerer på en præcis og effektiv måde. Denne tilgang sparer tid ved at tillade brugen af generelle lemmas og teorier om latticer og undermoduler.

En vigtig pointe i arbejdet med undermoduler er, hvordan direkte summer (direct sums) af undermoduler fungerer. Når to undermoduler UU og VV er i direkte sum, betyder det, at deres union danner det fulde vektorrum, og deres snit kun indeholder den nulvektor. Dette kan udtrykkes i Lean som:

UV=ogUV=U \oplus V = \top \quad \text{og} \quad U \cap V = \bot

Her repræsenterer \top det fulde vektorrum og \bot nulvektorrummet. Lean giver mulighed for at arbejde med direktesummer af undermoduler og dermed sikre, at deres kombinatoriske egenskaber overholdes.

Derudover er det muligt at definere direkte summer for familier af undermoduler. Dette gør det muligt at arbejde med vilkårlige samlinger af undermoduler i et givet vektorrum, og man kan bruge den nødvendige teori som DirectSum.IsInternalDirectSum.IsInternal for at sikre, at betingelserne for en intern direkte sum er opfyldt. Denne teori tillader, at man uden videre kan beskrive, når et sæt undermoduler er i direkte sum, og det hjælper med at bevise, at den samlede sum danner det fulde vektorrum.

En anden essentiel komponent i linear algebra i Lean er håndteringen af kvotientrum. Kvotientrum er en naturlig udvidelse af undermoduler, og de spiller en vigtig rolle i teorien om modulære rum og quotient spaces. Kvotientrum i Lean kan håndteres ved hjælp af den generelle kvotientnotation, som gør det muligt at definere projektioner og analyzere relationer mellem undermoduler i forhold til kvotientrum.

Yderligere er det nødvendigt at forstå, hvordan man håndterer homomorfier og lineære transformationer mellem undermoduler og vektorrum. Lean tilbyder de nødvendige værktøjer til at definere og arbejde med funktioner som map\text{map} og comap\text{comap}, der henholdsvis skubber og trækker undermoduler under lineære funktioner. For eksempel, når man arbejder med en lineær funktion φ\varphi, kan man anvende operationen map\text{map} til at flytte et undermodul EE fra et vektorrum VV til et andet vektorrum WW:

Submodule.mapφE\text{Submodule.map} \, \varphi \, E

Dette giver mulighed for at forstå, hvordan undermoduler ændrer sig under lineære transformationer, og det er fundamentalt for at arbejde med kvotientrum og homomorfier i vektor- og modulrum.

Endelig er det vigtigt at forstå, hvordan Lean's type system understøtter den algebraiske struktur af undermoduler. Dette giver en solid teoretisk baggrund for at arbejde med lineære rum og undermoduler på en formel og præcis måde. Lean's brug af typeklasser og dets evne til at automatisere visse algebraiske operationer gør det muligt at gennemføre komplicerede beviser effektivt og præcist, uden at man behøver at tænke på de underliggende detaljer.

Hvordan kan basis og dimension hjælpe med at forstå vektorrum i algebra?

Når man arbejder med abstrakte matematiske strukturer, som f.eks. vektorrum, er det vigtigt at forstå de fundamentale begreber, der er nødvendige for at kunne konstruere og manipulere med sådanne rum. Et af de centrale begreber her er basis og dimension, som spiller en uundværlig rolle i forståelsen af, hvordan vektorer repræsenteres og hvordan lineære transformationer udføres.

I matematik og i den formelle software-ramme Lean bliver begrebet linearCombination brugt som et praktisk redskab til at udtrykke lineære kombinationer af vektorer. Funktionen Finsupp.linearCombination, som er baseret på en mere generel funktion kaldet Finsupp.sum, tager en funktion c fra en mængde ι til det grundlæggende felt K og en funktion f fra ι til V, og skaber en sum over støttepunktet for c, multipliceret med f. Denne funktion tillader at udtrykke en hvilken som helst lineær kombination af vektorer i et givet vektorrum ved at summere produkterne af de passende koefficienter og vektorer.

Et eksempel på brugen af linearCombination kan være, at hvis man har en funktion c, der er nul overalt undtagen på et begrænset antal steder, kan man bruge summationer over en endelig mængde, som indeholder støttepunktet for c, for at beregne en lineær kombination af de tilsvarende vektorer. Dette er grundlæggende for arbejdet med basis i et vektorrum, da det giver os en metode til at udtrykke vektorer som en lineær kombination af basisvektorer.

Når det kommer til baser af et vektorrum, er det væsentligt at forstå, hvordan de kan bruges til at konstruere lineære transformationer. I algebraens verden er en basis en samling af vektorer, der kan bruges til at repræsentere alle andre vektorer i rummet ved hjælp af lineære kombinationer. I formel matematik, som i Lean, kan man bruge baser til at konstruere lineære funktioner ved at definere, hvordan basisvektorerne bliver transformeret. Dette gøres gennem en funktion kaldet Basis.constr, som etablerer en lineær isomorfi fra en funktion ι → W til en lineær funktion fra V →ₗ[K] W. Denne isomorfi gør det muligt at oversætte lineære transformationer fra et vektorrum til et andet.

For at forstå hvordan lineære transformationer fungerer, er det vigtigt at vide, at de kan identificeres med matricer, hvis man også har en basis på målrummet. Dette giver os en direkte måde at arbejde med lineære funktioner på, da man kan bruge matriceoperationer til at udføre transformationer. Idéen om at knytte baser til matricer er grundlæggende for at forstå dimensionsteori og matrixalgebra, som er dybt forbundet med forståelsen af lineære systemer.

Dimensionen af et vektorrum er et andet centralt begreb i lineær algebra. I tilfælde af et finit-dimensionelt vektorrum er dimensionen et naturligt tal, der repræsenterer antallet af basisvektorer, der kræves for at spænde hele rummet. Denne dimension, som kan beregnes gennem Module.finrank, afhænger af det grundlæggende felt K, da et givet abelisk gruppe kan være et vektorrum over forskellige felter. For eksempel, når man betragter et vektorrum som Fin n → K, vil det have dimensionen n over K. Det er også vigtigt at bemærke, at dimensionen kan være 0 for uendeligt dimensionelle rum.

Dimensionen af et subspace (underindfald) er også et vigtigt begreb. For at beregne dimensionen af et underindfald, bruges begreber som finrank i Lean. Det er muligt at finde dimensionen af en union eller snit af to subspaces, hvilket hjælper med at forstå deres relationer. For eksempel, når man har et underindfald E og et andet F, så vil den totale dimension af deres union og snit være relateret på en bestemt måde.

Når det kommer til teoretiske beviser, er det ofte nyttigt at bruge den egenskab, at lineære transformationer er bestemt af deres værdier på basisvektorerne. Det betyder, at hvis man ved, hvordan en lineær transformation virker på basisvektorerne, kan man beregne transformationens værdi for alle andre vektorer i rummet. Denne egenskab gør arbejdet med lineære transformationer meget mere overskueligt.

For at sammenfatte, hjælper begreber som basis og dimension ikke kun med at forstå de strukturelle egenskaber ved vektorrum, men også med at konstruere og manipulere lineære funktioner og transformationer. De er grundlæggende byggesten i både teoretisk algebra og i de formelle matematiske rammer, der bruges til at udvikle og bevise de underliggende resultater i lineær algebra.