Istnieje wiele sposobów definiowania struktury matematycznej, w zależności od właściwości, które uznajesz za definicję. Pomiędzy równoważnymi charakterystykami, które przyjmujesz za definicję, a którą bierzesz za alternatywną, nie jest ważne.
W konstruktywnej matematyce lepiej jest wybrać definicję, która ułatwia konstruktywne rozumowanie. W przypadku liczb naturalnych podstawową formą rozumowania jest indukcja, co sprawia, że tradycyjna definicja zera lub następcy jest bardzo odpowiednia. Inne zestawy liczb nie mają takich preferencji.
Rozważając iloraz, w niekonstruktywnych ustawieniach często mówi się „wybierz członka klasy równoważności”. W konstruktywnym otoczeniu konieczne jest opisanie sposobu wyboru członka. Ułatwia to posługiwanie się definicjami konstruującymi jeden obiekt dla każdego elementu typu, zamiast konstruowania klas równoważności.
Na przykład, aby zdefiniować Zmatematyk może być zadowolony z wyrównania różnic liczb naturalnych:
Z:=N2/{((x,y),(x′,y′))∣x+y′=x′+y}
Chociaż ma to schludne odczucie (bez „tego czy tamtego”), dla konstruktywnego rozumowania, łatwiej jest, jeśli równość obiektów pokrywa się z równością reprezentacji, więc możemy zdefiniować względne liczby całkowite jako liczbę naturalną lub ujemną liczba naturalna minus jeden:
Inductive Z1 :=
| Nonnegative : nat -> Z1 (* ⟦Nonnegative x⟧ = ⟦x⟧ *)
| Negative : nat -> Z1. (* ⟦Negative x⟧ = -⟦x⟧-1 *)
Jednak ta definicja jest dziwnie asymetryczna, co może sprawić, że lepiej będzie przyjąć dwie różne reprezentacje dla zera:
Inductive Z2 :=
| Nonnegative : nat -> Z2 (* ⟦Nonnegative x⟧ = ⟦x⟧ *)
| Nonpositive : nat -> Z2. (* ⟦Nonpostitive x⟧ = -⟦x⟧ *)
Lub możemy zbudować względne liczby całkowite bez użycia elementów naturalnych jako elementu budulcowego:
Inductive Pos3 :=
| I : Pos3 (* ⟦I⟧ = 1 *)
| S3 : Pos3 -> Pos3 (* ⟦S3 x⟧ = ⟦x⟧+1 *)
Inductive Z3 :=
| N3 : Pos3 -> Z3 (* ⟦N3 x⟧ = -⟦x⟧ *)
| O3 : Z3 (* ⟦O3⟧ = 0 *)
| P3 : Pos3 -> Z3 (* ⟦P3 x⟧ = ⟦x⟧ *)
Standardowa biblioteka Coq używa jeszcze innej definicji: konstruuje dodatnie liczby całkowite z ich notacji to podstawa 2, ponieważ cyfra 1, po której następuje ciąg cyfr 0 lub 1. Następnie konstruuje Z
jak Z3
z Pos3
góry. Ta definicja ma również unikalną reprezentację dla każdej liczby całkowitej. Wybór zapisu binarnego nie służy łatwiejszemu uzasadnieniu, ale produkuje bardziej wydajny kod, gdy programy są pobierane z proofów.
Łatwość rozumowania jest motywacją do wyboru definicji, ale nigdy nie jest czynnikiem nie do pokonania. Jeśli jakaś konstrukcja ułatwia konkretny dowód, można użyć tej definicji w tym konkretnym dowodzie i udowodnić, że konstrukcja jest równoważna z inną konstrukcją, która została pierwotnie wybrana jako definicja.
W przypadku liczb wymiernych trudno jest uciec od ilorazów, chyba że zaczniemy od przedstawienia liczb całkowitych jako iloczynu czynników (co powoduje pewne podstawowe operacje, takie jak dodawanie i całkowite uporządkowanie na Ntrudne do zdefiniowania). Standardowa biblioteka Coq definiuje Q
jakoN×N∗(licznik i mianownik) i definiuje operator =?=
do testowania równoważności dwóch elementów Q
. Ta definicja jest dość powszechna, ponieważ jest tak prosta, jak to tylko możliwe.
Liczby rzeczywiste to zupełnie inny czajnik ryb, ponieważ nie można ich zbudować. Nie można zdefiniować liczb rzeczywistych jako typu indukcyjnego (wszystkie typy indukcyjne są policzalne). Zamiast tego każda definicja liczb rzeczywistych musi być aksjomatyczna, tzn. Niekonstruktywna. Możliwe jest konstruowanie znacznych podzbiorów liczb rzeczywistych; sposób na zrobienie tego zależy od tego, jaki podzbiór chcesz zbudować.