首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coq案例分析与函数返回子集类型重写

Coq案例分析与函数返回子集类型重写
EN

Stack Overflow用户
提问于 2015-03-21 01:10:09
回答 1查看 359关注 0票数 3

我的工作是关于使用子集类型编写认证函数的简单练习。其思想是首先编写一个前置函数。

代码语言:javascript
复制
pred : forall  (n : {n : nat | n > 0}), {m : nat | S m = n.1}.

然后用这个定义给出一个函数

代码语言:javascript
复制
pred2 : forall (n : {n : nat | n > 1}), {m : nat | S (S m) = n.1}.

我对第一个没有意见。这是我的密码

代码语言:javascript
复制
Program Definition pred (n : {n : nat | n > 0}) : {m : nat | S m = n.1} :=
  match n with
  | O => _
  | S n' => n'
  end.
Next Obligation. elimtype False. compute in H. inversion H. Qed.

但我无法解决第二个定义。我试着写这些定义

代码语言:javascript
复制
Program Definition pred2 (n : {n : nat | n > 1}) : {m : nat | S (S m) = n.1} 
:= pred (pred n).

我设法证明了两项首要义务

代码语言:javascript
复制
Next Obligation. apply (gt_trans n 1 0). assumption. auto. Qed.
Next Obligation. 
  destruct pred.  
  simpl.
  simpl in e. 
  rewrite <- e in H.
  apply gt_S_n in H; assumption.
Qed.

但对于最后一项义务,我会陷入困境,因为当我试图对回归类型的pred进行案例分析时,新的低能量并不会在目标中被重构。

我尝试了以下策略,但没有结果。

代码语言:javascript
复制
destruct (pred (n: pred2_obligation_1 (n ; H))).

destruct (pred (n; pred2_obligation_1 (n ; H))) eqn:?.
rewrite Heqs.

我知道我可以直接编写pred2,但其思想是使用和编写函数pred。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-21 14:58:23

destruct没有任何效果的原因可能是因为您试图对其进行案例分析的内容没有发生在目标中。该术语的隐含参数可能与目标中该术语的隐含参数不匹配。无论哪种方式,你都不可能在不把目标打错的情况下对这个词进行案例分析。

但您可以通过n的案例分析来证明这一义务。

代码语言:javascript
复制
Next Obligation.
destruct n.
inversion H.
destruct n.
inversion H.
subst.
inversion H1.
cbn.
eauto.
Qed.

我还能证明一些辅助定理,但由于所有类型依赖关系,我无法使用它们。

代码语言:javascript
复制
Theorem T1 : forall s1, S (` (pred s1)) = ` s1.
Proof. intros [[| n1] H1]. inversion H1. cbn. eauto. Qed.

Theorem T2 : forall T1 (P1 : T1 -> Prop) s1 H1, (forall x1 (H1 H2 : P1 x1), H1 = H2) -> exist P1 (` s1) H1 = s1.
Proof. intros ? ? [x1 H1] H2 H3. cbn in *. rewrite (H3 _ H1 H2). eauto. Qed.

我从未见过在函数上使用destruct。我很惊讶Coq没有抱怨这个函数没有被归纳定义。

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

https://stackoverflow.com/questions/29178128

复制
相关文章

相似问题

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