【发布时间】:2021-02-17 16:26:00
【问题描述】:
我对 Coq 还很陌生,我在 CodeWars 上做了一些 Katas 来娱乐和学习。
我被其中一个困住了,想听听你的一些想法。
所以,我有:
Record iso (A B : Set) : Set :=
bijection {
A_to_B : A -> B;
B_to_A : B -> A;
A_B_A : forall a : A, B_to_A (A_to_B a) = a;
B_A_B : forall b : B, A_to_B (B_to_A b) = b
}.
(* nat_plus_nat : a set having size(nat) more elements than nat. (provided in preloaded) *)
Inductive nat_plus_nat : Set := left (n : nat) | right (n : nat).
Theorem nat_iso_natpnat : iso nat nat_plus_nat.
我有和idea,但是不能实现,不知道是否可行。基本上,我想将每个奇数 nat 映射到一个构造函数(例如,左),并将每个偶数 nat 映射到另一个(例如,右)。这行得通吗?如果没有,怎么办?
现在我坚持这样一个事实,即 A_to_B 定义为 fun n => if odd n then left n else right n 和 B_to_A 定义为 fun n => match n with | left n' => n' | right n' => n' end 不会给我足够的事实来消除某些情况。
【问题讨论】:
-
A_to_B (B_to_A (left 2))是什么? -
是的,你猜对了,它不是
left 2,而是right 2,或者换句话说,这两个函数没有形成双射。 -
一个可能更容易思考问题的提示/提醒是双射函数必须既是单射的(它们不会将两个元素映射到同一个图像)又是满射的(所有元素在每个函数的 codomain 必须有一个先行词)。
标签: coq