我正在学习Coq而且我偶然发现了一个练习,要求为bool和nat创建选项类型的函数(即bool到/从选项X,nat到选项nat),然后证明它们通勤。我可以很容易地通过bool / nat的归纳证明,但我似乎无法使其适用于选项类型。我遇到的bool问题中的主要问题是,在某些时候,目标是证明:
a : nat_iter 1 option Empty_set
============================
Some None = Some a
然而,我不知道告诉它nat_iter 1 option Empty_set
唯一的可能性是None
(我有一个引理证明,但不能重写a
)。
对于nat,我不认为nat和option nat之间存在双射,因为我无法证明,给定fromNat (toNat x) = x
,Some 0 = None
。也许有一种定义toNat
的方法可以使它发挥作用。
Definition fromBool (b : bool) : fin 2 :=
match b with
| true => Some None
| false => None
end.
Definition toBool (x : fin 2) : bool :=
match x with
| None => false
| Some _ => true
end.
Lemma bool_fin b :
toBool (fromBool b) = b.
Proof. induction b ; reflexivity. Qed.
Lemma fin_bool x :
fromBool (toBool x) = x.
Proof. induction x ; simpl. Abort.
Definition fromNat (n : nat) : option nat :=
match n with
| 0 => None
| S n => Some (S n)
end.
Definition toNat (n : option nat) : nat :=
match n with
| None => 0
| Some x => x
end.
Lemma nat_option x :
toNat (fromNat x) = x.
Proof. induction x ; reflexivity. Qed.
Lemma option_nat x :
fromNat (toNat x) = x.
Proof. induction x. Abort.
感谢。