Есть несколько способов определить математическую структуру, в зависимости от того, какие свойства вы считаете определением. Между эквивалентными характеристиками, какая из них вы принимаете за определение, а какая за альтернативную характеристику, не важна.
В конструктивной математике предпочтительнее выбрать определение, которое облегчает конструктивное мышление. Для натуральных чисел основной формой рассуждения является индукция, которая делает традиционное определение «ноль или преемник» очень подходящим. Другие наборы чисел не имеют такого предпочтения.
При рассуждении о факторах в неконструктивных настройках принято говорить «выбрать члена класса эквивалентности». В конструктивной обстановке необходимо описать, как выбрать участника. Это облегчает использование определений, которые создают один объект для каждого члена типа, а не создают классы эквивалентности.
Например, чтобы определить , математик может быть доволен приравниванием разностей натуральных чисел:
Z : = N 2 / { ( ( x , y ) , ( x ′ , y ′ ) ) ∣ x + y ′ = x ′ + у }Z
Z : = N2/ {((х,у) , ( х', у') ) ∣ х + у'= х'+ у}
Несмотря на то, что это выглядит аккуратно (без «того или иного»), для конструктивных рассуждений проще, если равенство объектов совпадает с равенством представлений, поэтому мы можем определить относительные целые числа как натуральное число или отрицание натуральное число минус один:
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
выше. Это определение также имеет уникальное представление для каждого целого числа. Выбор использования двоичной записи делается не для упрощения рассуждений, а для создания более эффективного кода, когда программы извлекаются из доказательств.
Простота рассуждений является мотивацией при выборе определения, но это никогда не является непреодолимым фактором. Если какая-то конструкция облегчает конкретное доказательство, можно использовать это определение в этом конкретном доказательстве и доказать, что эта конструкция эквивалентна другой конструкции, которая была первоначально выбрана в качестве определения.
NQ
N × N*=?=
Q
Реальные числа - это совершенно другой котелок рыбы, потому что они не конструируемы. Невозможно определить действительные числа как индуктивный тип (все индуктивные типы являются счетными). Вместо этого любое определение действительных чисел должно быть аксиоматическим, то есть неконструктивным. Можно построить счетные подмножества действительных чисел; способ сделать это зависит от того, какое подмножество вы хотите построить.