Я здесь с Coq изучаю отношения между двумя типами, которые я определил. Первый - это что-то вроде конечного подмножества nat
, состоящего всего из трех элементов:
Inductive N3 := zero | one | two.
Второй - это сигма-тип с элементами, удовлетворяющими предложению {x: nat | x < 3}
. Вот его определение:
Definition less_than_3 := {x| x < 3}.
Я хочу доказать, что эти два типа изоморфны. Я определил две задействованные функции следующим образом:
Definition lt3_to_N3 (n: less_than_3) : N3 :=
match n with
| exist 0 _ => zero
| exist 1 _ => one
| exist 2 _ => two
| exist _ _ => two
end.
Definition N3_to_lt3 (n: N3) : less_than_3 :=
match n with
| zero => exist _ 0 l_0_3
| one => exist _ 1 l_1_3
| two => exist _ 2 l_2_3
end.
Где l_0_3
, l_1_3
и l_2_3
- просто аксиомы:
Axiom l_0_3 : 0 < 3.
Axiom l_1_3 : 1 < 3.
Axiom l_2_3 : 2 < 3.
Мне удается определить первую часть изоморфизма
Definition eq_n3_n3 (n: N3) : lt3_to_N3 (N3_to_lt3 n) = n.
Proof.
by case n.
Defined.
Но я не могу определить другую сторону. Вот что я сделал до сих пор:
Definition eq_lt3_lt3 (x: less_than_3) : eq x (N3_to_lt3 (lt3_to_N3 x)).
Proof.
case: x.
move=> n p.
simpl.
???
Я не совсем уверен в остальном определении. Я также пробовал сопоставить шаблон на x
и (N3_to_lt3 (lt3_to_N3 x))
, но не уверен, что возвращать.
Definition eq_lt3_lt3 (x: less_than_3) : eq x (N3_to_lt3 (lt3_to_N3 x)) :=
match N3_to_lt3 (lt3_to_N3 x) with
| x => ???
end.
Спасибо за помощь.