per*_*ror 4 coq dependent-type
我尝试在Coq中定义一个归纳依赖类型来表示位向量逻辑中的位向量变量.
我阅读了Xavier Leroy撰写的这篇博文,其中他定义了如下结构:
Require Import Vector.
Inductive bitvector : Type := Bitvector (n: nat) (v: Vector.t bool n).
Run Code Online (Sandbox Code Playgroud)
然后,为了测试这种做法,我尝试定义按位求反运算符如下:
Definition bv_neg (v : bitvector) :=
match v with
Bitvector n w => Bitvector n (Vector.map negb w)
end.
Run Code Online (Sandbox Code Playgroud)
并且,开始证明应用两次否定相当于身份:
Lemma double_neg :
forall (v : bitvector), (bv_neg (bv_neg v) = v).
Run Code Online (Sandbox Code Playgroud)
但是,当我试图进行证明时,我意识到拥有零大小的位向量对于处理n = 0每个证明中的特殊情况毫无意义和力量.
所以,我想知道如何强制归纳依赖型参数严格为正.
任何暗示都是受欢迎的!
一种方法是确保存储Vector的大小S n.
Inductive bitvector : Type := Bitvector (n: nat) (v: Vector.t bool (S n)).
Run Code Online (Sandbox Code Playgroud)
但是,我不明白你为什么要在这种特殊情况下这样做,因为这个引理是完全可证明的:它是一个相当简单的推论,可能是你以后可能需要的更普遍的引理.
你的定义(没有S n改动):
Require Import Vector.
Inductive bitvector : Type := Bitvector (n: nat) (v: Vector.t bool n).
Definition bv_neg (v : bitvector) :=
match v with
Bitvector n w => Bitvector n (Vector.map negb w)
end.
Run Code Online (Sandbox Code Playgroud)
一些结果Vector.map:
Lemma map_fusion :
forall {A B C} {g : B -> C} {f : A -> B} {n : nat} (v : Vector.t A n),
Vector.map g (Vector.map f v) = Vector.map (fun x => g (f x)) v.
Proof.
intros A B C g f n v ; induction v.
- reflexivity.
- simpl; f_equal; assumption.
Qed.
Lemma map_id :
forall {A} {n : nat} (v : Vector.t A n), Vector.map (@id A) v = v.
Proof.
intros A n v ; induction v.
- reflexivity.
- simpl; f_equal; assumption.
Qed.
Lemma map_extensional :
forall {A B} {f1 f2 : A -> B}
(feq : forall a, f1 a = f2 a) {n : nat} (v : Vector.t A n),
Vector.map f1 v = Vector.map f2 v.
Proof.
intros A B f1 f2 feq n v ; induction v.
- reflexivity.
- simpl; f_equal; [apply feq | assumption].
Qed.
Run Code Online (Sandbox Code Playgroud)
最后,你的结果:
Lemma double_neg :
forall (v : bitvector), (bv_neg (bv_neg v) = v).
Proof.
intros (n, v).
simpl; f_equal.
rewrite map_fusion, <- map_id.
apply map_extensional.
- intros []; reflexivity.
Qed.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |