Існує кілька способів визначення математичної структури залежно від того, які властивості ви вважаєте визначенням. Між еквівалентними характеристиками, яке саме ви будете визначати, а яке - для альтернативної характеристики, не важливо.
У конструктивній математиці бажано вибрати визначення, яке спрощує конструктивне міркування. Для натуральних чисел основна форма міркування - індукція, що робить традиційне визначення нуля чи наступника дуже підходящим. Інші набори номерів не мають такої переваги.
Розмірковуючи про коефіцієнти, у неконструктивних умовах прийнято говорити "вибрати члена класу еквівалентності". У конструктивній обстановці необхідно описати, як вибрати члена. Це полегшує пошук визначень, що будують один об'єкт для кожного члена типу, а не побудову класів еквівалентності.
Наприклад, щоб визначити , математик може бути задоволений рівнянням різниць натуральних чисел:
Хоча це має сприятливе почуття до цього (ні "те чи інше"), для конструктивних міркувань простіше, якщо рівність об'єктів збігається з рівністю уявлень , тож ми можемо визначити відносні цілі числа як натуральне число, або як від’ємне натуральне число мінус одне:Z
Z:=N2/{((x,y),(x′,y′))∣x+y′=x′+y}
Inductive Z1 :=
| Nonnegative : nat -> Z1 (* ⟦Nonnegative x⟧ = ⟦x⟧ *)
| Negative : nat -> Z1. (* ⟦Negative x⟧ = -⟦x⟧-1 *)
Однак це визначення дивно несиметричне, завдяки чому бажано визнати два різних подання для нуля:
Inductive Z2 :=
| Nonnegative : nat -> Z2 (* ⟦Nonnegative x⟧ = ⟦x⟧ *)
| Nonpositive : nat -> Z2. (* ⟦Nonpostitive x⟧ = -⟦x⟧ *)
Або ми можемо побудувати відносні цілі числа, не використовуючи натурали як будівельний блок:
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⟧ *)
Стандартна бібліотека використовує Coq ще одне визначення: він створює позитивні цілі числа від їх позначень є базою 2, як цифра 1 , за яким слід послідовність цифр 0 або 1. Потім він будує , Z
як Z3
з Pos3
вище. Це визначення також має унікальне подання для кожного цілого числа. Вибір використання двійкової нотації не для легшого міркування, а для створення більш ефективного коду, коли програми витягуються з доказів.
Простота міркування є мотивацією для вибору визначення, але це ніколи не є непереборним фактором. Якщо деяка конструкція полегшує певний доказ, можна використовувати це визначення в цьому конкретному доказі і довести, що конструкція еквівалентна іншій конструкції, яка була обрана як визначення спочатку.
Для раціональних чисел важко уникнути коефіцієнтів, якщо ми не почнемо з подання цілих чисел як добутку факторів (що ускладнює визначення деяких фундаментальних операцій, таких як додавання та загальне впорядкування на ). Стандартна бібліотека Coq визначає як (чисельник і знаменник), і визначає оператора для перевірки еквівалентності двох елементів . Це визначення досить поширене, тому що це так просто, як це стає.NQ
N×N∗=?=
Q
Справжні цифри - це зовсім інший чайник з рибою, оскільки їх не можна сконструювати. Неможливо визначити реальні числа як індуктивний тип (усі індуктивні типи є численними). Натомість будь-яке визначення реальних чисел повинно бути аксіоматичним, тобто неконструктивним. Можна побудувати численні підмножини реальних чисел; спосіб зробити це залежить від того, який підмножина ви хочете побудувати.