W matematyce, szczególnie w kontekście programowania matematycznego, struktury takie jak monoidy i grupy odgrywają kluczową rolę. Stosowanie tych struktur pozwala na formalizację i systematyzację operacji, które na pierwszy rzut oka mogą wydawać się intuicyjne, ale w głębszej analizie wymagają precyzyjnych definicji i dowodów. W tym kontekście jednym z narzędzi, które wspierają takie podejście, jest Mathlib — biblioteka matematyczna dla systemu Lean. Aby zrozumieć, w jaki sposób monoidy i grupy są wykorzystywane w tym środowisku, warto przyjrzeć się ich właściwościom oraz zastosowaniom.

Monoid to struktura algebraiczna, która składa się z zbioru, na którym zdefiniowana jest operacja łączna, posiadająca element neutralny. Operacja ta jest asocjacyjna, co oznacza, że zmiana grupowania elementów nie wpływa na wynik. Przykładami monoidów są liczby naturalne z dodawaniem (gdzie operacja to dodawanie, a elementem neutralnym jest 0) lub liczby całkowite z mnożeniem. W bardziej formalnym kontekście, takie struktury jak grupy i pierścienie mogą być postrzegane jako rozszerzenia monoidów, gdzie dodatkowo wymagane są inne właściwości, takie jak istnienie odwrotności.

W praktyce, gdy używamy narzędzi takich jak Mathlib, monoidy rzadko są bezpośrednio weryfikowane, ponieważ z reguły są one wykorzystywane w szerszym kontekście, na przykład w ramach teorii grup czy algebr. Niemniej jednak znajomość pojęcia monoidów jest istotna, zwłaszcza kiedy szukamy określonych lematu w bibliotekach, co może nas prowadzić do wyników dotyczących monoidów, a nie grup — pomimo podobieństw, grupy wymagają odwrotności dla wszystkich swoich elementów, podczas gdy monoidy tego nie wymagają.

Monoidy w Lean są zdefiniowane za pomocą klasy typów, a ich zastosowanie jest dość powszechne. Z kolei funkcja Monoid M to klasa typów, która pozwala na pracę z monoidami, w której operacja mnożenia domyślnie używa notacji mnożenia (np. *). Dla operacji dodawania stosuje się typ AddMonoid, który jest analogiczną klasą do Monoid, ale z operacją dodawania zamiast mnożenia. Jeśli mówimy o wersjach przemiennych tych struktur, wówczas przedrostek Comm dodaje się do nazwy typu, tworząc na przykład CommMonoid, czyli monoid przemienny.

Warto zrozumieć, że w przypadku morphizmów między monoidami, Lean stosuje pojęcie MonoidHom, które jest funkcją między dwoma monoidami, zachowującą operację. Umożliwia to przeprowadzanie przekształceń elementów między różnymi monoidami. Co ważne, MonoidHom jest obiektem, który łączy funkcję i pewne właściwości tej funkcji. Dodatkowo, w kontekście monoidów, funkcje takie jak map_mul i map_zero są wykorzystywane do przekształcania elementów z jednego monoidu do innego, zachowując strukturę operacji.

Z kolei grupy są rozszerzeniem monoidów, które oprócz operacji łącznej i elementu neutralnego wymagają, by każdy element miał swój odwrotność. W Lean grupy są modelowane za pomocą struktur typu Group, które oferują dodatkowe operacje, takie jak mul_inv_cancel, zapewniające, że mnożenie elementu przez jego odwrotność daje element neutralny. Grupy pozwalają na formułowanie bardziej zaawansowanych twierdzeń, jak np. f.map_inv, które pozwalają na zachowanie odwrotności elementów przy zastosowaniu morphizmów grupowych.

Warto zauważyć, że w Lean można również tworzyć morphizmy między grupami za pomocą funkcji, które zachowują operacje grupowe, co prowadzi do konstrukcji grupowych homomorfizmów. Umożliwia to bardzo precyzyjne modelowanie struktur grupowych oraz badanie ich właściwości za pomocą narzędzi algebraicznych dostępnych w Lean.

Przechodząc do subgrup, należy pamiętać, że subgrupa grupy G to podzbiór G, który jest samodzielnie grupą, posiadającą wszystkie właściwości grupy. W Lean subgrupa jest reprezentowana przez strukturę typu Subgroup G, która, podobnie jak grupy, jest wyposażona w odpowiednie operacje, takie jak mul_mem czy inv_mem, gwarantujące, że wyniki operacji na elementach subgrupy pozostają w tej samej subgrupie. Ciekawym aspektem jest to, że w Lean subgrupy są traktowane jako podtypy zbiorów, co umożliwia ich łatwe manipulowanie i łączenie w bardziej skomplikowane struktury.

Praca z tymi strukturami w Lean wymaga dogłębnego zrozumienia, jak różne operacje i pojęcia algebraiczne są formalizowane w tym narzędziu. Aby skutecznie korzystać z Mathlib, należy nie tylko znać definicje struktur, ale także zrozumieć, jak te struktury współdziałają w szerszym kontekście matematycznym. Kluczowym aspektem jest także zrozumienie, jak poszczególne pojęcia — takie jak homomorfizmy, subgrupy, czy różne wersje monoidów i grup — są ze sobą powiązane, co pozwala na efektywne wykorzystanie narzędzi dostępnych w Lean do dowodzenia i formalizacji twierdzeń matematycznych.

Jak skutecznie wykorzystać taktyki w Lean do dowodzenia nierówności i równości?

W pracy z Lean, a szczególnie przy dowodzeniu nierówności, warto znać odpowiednie techniki oraz narzędzia, które pozwalają na skrócenie i uproszczenie procesów dowodzenia. Nierówności, takie jak 2aba2+b22ab \leq a^2 + b^2, stanowią doskonały przykład sytuacji, gdzie wykorzystanie odpowiednich twierdzeń i taktyk automatycznych pozwala na sprawne rozwiązanie problemu.

W omawianym przykładzie, zaczynamy od przekształcenia wyrażenia 2aba2+b22ab \leq a^2 + b^2, poprzez zastosowanie taktyki calc, która jest wygodnym narzędziem do pracy z wyrażeniami arytmetycznymi w Lean. W pierwszym kroku używamy faktu, że a22ab+b2=(ab)2a^2 - 2ab + b^2 = (a - b)^2, co następnie pozwala na zastosowanie nierówności, że kwadrat dowolnej liczby jest zawsze większy lub równy zeru. Dzięki temu uzyskujemy wynik, który może być obsłużony przez taktykę linarith, narzędzie do pracy z liniowymi nierównościami. Tego rodzaju dowody są często stosowane w matematyce formalnej, gdzie kluczową rolę odgrywa zarówno sprawność obliczeniowa, jak i przejrzystość dowodu.

Kiedy przyjrzymy się kolejnej nierówności: aba2+b22|a*b| \leq \frac{a^2 + b^2}{2}, zauważymy, że wymaga ona pewnego wyobrażenia o stosowaniu twierdzenia abs_le’\text{abs\_le'}, które stanowi fundament dla manipulacji wartościami bezwzględnymi. Aby podejść do rozwiązania, należy użyć odpowiednich taktyk do manipulacji wyrażeniami i podzielić dowód na bardziej przystępne kroki. Na przykład, pomocne będzie stosowanie taktyki constructor, która umożliwia dzielenie koniunkcji na dwie oddzielne części do udowodnienia.

Z perspektywy bardziej zaawansowanej matematyki formalnej, stosowanie odpowiednich twierdzeń, takich jak le_antisymm\text{le\_antisymm}, pomaga w udowodnieniu równości dwóch liczb rzeczywistych, jeżeli każda z nich jest mniejsza lub równa drugiej. Przykład udowodnienia przemienności funkcji min\text{min}, gdzie udowadniamy, że min(a,b)=min(b,a)\text{min}(a, b) = \text{min}(b, a), może być wykonany przy pomocy taktyki le_antisymm oraz stosowania zagnieżdżonych taktyk jak apply i show. Warto zauważyć, że powtarzanie tego typu dowodów może być uproszczone za pomocą taktyki repeat, która wielokrotnie stosuje tę samą strategię w różnych miejscach dowodu.

Znajomość takich narzędzi, jak abs_add\text{abs\_add}, który jest używany do dowodzenia nierówności trójkąta, staje się szczególnie istotna, gdy przechodzimy do bardziej skomplikowanych twierdzeń związanych z wartościami bezwzględnymi. Zastosowanie go do dowodu nierówności abab|a| - |b| \leq |a - b| jest bardzo praktyczne, zwłaszcza gdy chcemy zaoszczędzić czas na skrócenie dowodu do kilku linii kodu w Lean.

W kontekście równości min(a,b)+cmin(a+c,b+c)\text{min}(a, b) + c \leq \text{min}(a + c, b + c), dowód wymaga zastosowania kilku trików, takich jak dodanie odpowiednich wartości do obu stron nierówności, by przejść do bardziej złożonego wyniku. Warto przy tym pamiętać, że w matematyce formalnej nie zawsze można liczyć tylko na transytywność i refleksyjność relacji \leq, zwłaszcza w bardziej złożonych przypadkach, jak w przypadku działania funkcji minimum i maksimum.

Z kolei w pracy z relacjami dzielności, takim jak xyx \mid y, istotne jest zrozumienie, że symbol dzielności to nie zwykła kreska ułamkowa, lecz specjalny znak Unicode, który w Lean jest reprezentowany jako \mid. Stosowanie odpowiednich twierdzeń związanych z dzielnością pozwala na rozwiązywanie bardziej zaawansowanych problemów związanych z arytmetyką naturalną i algebraiczną, jak pokazuje przykład, gdzie używamy twierdzenia dvd_trans\text{dvd\_trans} w celu przeprowadzenia dowodu dla dzielności w łańcuchu.

Jednak to, co często umyka początkującym formalistom, to konieczność starannego rozumienia porządku operacji w Lean, szczególnie w kontekście aplikacji funkcji i operacji infiksowych. Na przykład, w przypadku funkcji min(a,b)+c\text{min}(a, b) + c, Lean traktuje to jako (min(a,b))+c(\text{min}(a, b)) + c, co może prowadzić do błędów w rozumowaniu, jeśli nie zrozumie się pełnej semantyki aplikacji funkcji.

Praca z Lean wymaga także znajomości konwencji, takich jak kurrowanie (currying), które pozwala na operowanie funkcjami o wielu argumentach, jak w przypadku funkcji minimum. Dzięki tej konwencji można łatwo manipulować funkcjami, traktując je jako funkcje przyjmujące jeden argument, a następnie zwracające kolejne funkcje, co jest kluczowe w bardziej złożonych dowodach formalnych.

Wszystkie te umiejętności – od manipulacji nierównościami, przez przekształcenia algebraiczne, aż po wykorzystanie narzędzi Lean do rozwiązywania równości i nierówności – są fundamentem, który pozwala na swobodne poruszanie się po bardziej zaawansowanych aspektach matematyki formalnej w Lean. Kiedy opanujemy te techniki, będziemy w stanie udowadniać skomplikowane twierdzenia w sposób efektywny i elegancki.