【发布时间】:2017-08-04 08:09:36
【问题描述】:
我在这里和 Coq 一起研究我定义的两种类型之间的关系。第一个类似于nat 的有限子集,只有三个元素:
Inductive N3 := zero | one | two.
第二个是 sigma 类型,其元素满足{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.
感谢您的帮助。
【问题讨论】:
标签: coq coq-tactic