双射防护和选项类型

时间:2017-12-12 22:41:40

标签: coq

我正在学习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) = xSome 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.

感谢。

0 个答案:

没有答案