首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Coq中流中提取有限的证据

从Coq中流中提取有限的证据
EN

Stack Overflow用户
提问于 2020-05-08 20:25:39
回答 1查看 45关注 0票数 2

我正在努力实现Some Domain Theory and Denotational Semantics in Coq,但是遇到了一些技术问题。

首先,我定义了stream,定义为

代码语言:javascript
复制
CoInductive Stream (D : Type) := 
  Eps : Stream D -> Stream D |
  Val : D -> Stream D.

使用有限命题

代码语言:javascript
复制
Inductive Finite (D : Type) : Stream D -> Prop :=
  | Finite_Val : forall d, Finite D (Val D d)
  | Finite_Eps : forall d, Finite D (d) -> Finite D (Eps D d).

我的目标是找到一些有限流实际上是有限的证据,这是在下面的引理中构造返回n和d‘的函数。

代码语言:javascript
复制
Lemma finite_pred_nth (D : Type) :
  forall d, Finite D d -> exists n d', pred_nth d n = Val D d'.
Proof.
  intros. induction H.
  - exists 0. exists d. reflexivity.
  - destruct IHFinite as [n [d' IHF]].
    exists (S n). exists d'. simpl. apply IHF.
  Qed.

并且pred_nth被定义为

代码语言:javascript
复制
Fixpoint pred_nth {D : Type} (x : Stream D) (n : nat) : Stream D :=
  match x, n with
  | Eps _ x', S n' => pred_nth x' n'
  | Val _ d, _ => x
  | Eps _ x', 0 => x
  end.

这些是我的一些方法。

使用记录作为返回类型

代码语言:javascript
复制
Record fin_evid := mk_fin_evid 
  { 
    T :> Type;
    d : Stream T;
    n : nat;
    v : T;
    H : pred_nth d n = Val T d' }.

在这种情况下,我无法构造函数。

使用类型类作为返回类型

代码语言:javascript
复制
Class finite_evidence (D : cpo) (d : Stream D) := {pred_n : nat; pred_d' : D; pred : pred_nth d pred_n = Val D pred_d'}.

Fixpoint extract_evidence (D : cpo) (d : Stream D) (H : Finite D d) : finite_evidence D d.
Proof.
  destruct d.
- apply eps_finite_finite in H. apply extract_evidence in H.
  destruct H.
  exists (S pred_n0) (pred_d'0). simpl. apply pred0.
- exists 0 t. reflexivity.
Defined.

这个函数创建得很好,但是我找不到如何匹配类型类的方法,所以我可以在定义其他函数时提取pred_n,pred_d‘。

这些是最小的例子,完整的代码可以在here中查看,在598行(流的定义)和817行(使用类型类)附近。使用此技术可以创建最小上限(716行),而不会破坏coq对停止的保证。更具体地说,给定流的单调递增序列并证明第一个元素是有限的(大于有限流的流也是有限的),为每个元素提取封装元素,然后返回提取的封装元素的lub。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-08 20:47:33

你的extract_evidence函数在我看来没问题。您可以直接使用类方法pred_npred_d'来提取这些见证者。例如:

代码语言:javascript
复制
Definition get_evidence (D : cpo) (d : Stream D) (H : Finite D d) :=
  @pred_n _ _ (extract_evidence D d H).

请注意@,它允许您指定您正在讨论的类实例。在这里,您可能不需要类型类解析机制,因此将finite_evidence声明为Record而不是Class是安全的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61679118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档