我在 ATP 的世界里还是个新手,但肯定很有动力。我开始处理依赖类型。我参与了一个项目,我在其中定义了(有限和无限)序列的类型。
Inductive sequence {X : Type} : Type :=
| FinSeq (x : list X)
| InfSeq (f : nat -> X).
现在我想定义一个非空序列的头部。
Lemma aux_hd : forall {A : Type} (l : list A),
0 < Datatypes.length l -> @hd_error A l = None -> False.
Proof. destruct l.
+ simpl. lia.
+ simpl. intros S. discriminate.
Qed.
Definition Hd {A : Type} (l : list A) : 0 < Datatypes.length l -> A :=
match (hd_error l) with
| Some a => (fun _ => a)
| None => fun pf => match (aux_hd l pf ??) with end
end.
Definition Head {A : Type} (s :sequence) (H : 0 << length s),
match s with
| FinSeq x => Hd x H
| InfSeq f => f 0 end.
我的问题在于 Hd 的定义:我不知道如何证明@hd_error A l = None
,因为我们已经在这样的匹配分支中。我相信这应该很容易。
我在最后一个定义中有一个类似的问题,因为我不知道如何转换 H,对于第一个匹配分支的特殊情况,我知道这一点length s = Datatypes.length x
,因此0 << length s -> 0 < Datatypes.length x
.
最后,我省略了关于 << 和长度序列的细节,因为我认为它与问题无关,但基本上我已经用 Inf 提升了 nat 来表示无限序列的长度,而 << 是 nat 的 < 和编号。
我已经学习了软件基础课程,我目前正在学习更多使用“具有依赖类型的认证编程”,这也非常好。在此先感谢,米格尔