关于Coq上我的归纳型的平凡定理
我定义了依赖类型和平凡引理,如下所示关于Coq上我的归纳型的平凡定理,coq,Coq,我定义了依赖类型和平凡引理,如下所示 Require Import Coq.Reals.Reals. Inductive Euc :nat -> Type:= |RO : Euc 0 |Rn : forall {n:nat}, R -> Euc n -> Euc (S n). Lemma ROEuc : forall t:(Euc 0), t = RO. Proof. intros. Admitted. 我不知道如何证明这一点。 Euc 0不是归纳类型,因此我不能使用de
Require Import Coq.Reals.Reals.
Inductive Euc :nat -> Type:=
|RO : Euc 0
|Rn : forall {n:nat}, R -> Euc n -> Euc (S n).
Lemma ROEuc : forall t:(Euc 0), t = RO.
Proof.
intros. Admitted.
我不知道如何证明这一点。
Euc 0
不是归纳类型,因此我不能使用destruct t
或inclusion t
请告诉我如何证明它。你会发现证明更简单的类型定理很容易
Lemma ROEuc' : forall n (t : Euc n), n = 0 -> existT Euc n t = existT Euc 0 RO.
你可以简单地解构t
,给你一个简单的例子,一个荒谬的例子,它可以通过同余
释放
要从这个引理导出引理,需要四个工具:
inversion\u sigma
策略,将existT
s的等式转化为从属等式UIP_dec
从证明0=0
的所有证明都等于eq_refl
,前提是nat
的等式是可判定的nat
的等式是可判定的,这一事实可以从Coq.Arith.Arith
中的一些引理中获得(在之后使用搜索需要导入Coq.Arith.Arith
以找到具有正确类型的引理的名称),或者使用判定等式策略从头开始证明
subst
+siml
以查看从属等式现在将简化为要证明的定理或者,您可以
要求导入Coq.Program.tractics
并使用依赖销毁t
,但请注意,这通常会引入对公理的不必要依赖(使用打印假设可见)在这种情况下,Coq实际上足够聪明,可以为您进行依赖模式匹配。
这里使用的神奇策略是refine(将Euc 0中的t与RO=>\ucode>匹配)
,这就给您留下了一个简单的目标(可能有一种析构函数变体可以做到这一点,但我不知道它会是什么)。在这里,Euc 0
中的子句告诉Coq,您只对0长度向量感兴趣,并且由于0是从构造函数构建的nat
,Coq能够通过构造函数的不相交性计算出RS
情况是不可能的
充分证明:
Lemma ROEuc : forall t:(Euc 0), t = RO.
Proof.
intros.
refine (match t in Euc 0 with RO => _ end).
reflexivity.
Qed.
此匹配生成的证明项实际上相当复杂,但如果您需要编写有关依赖类型的其他证明,而Coq的模式匹配功能不足以帮助您,那么理解它可能会有所帮助。Jason,您编写的引理是不可证明的。你的意思是为所有(t:Euc 0)编写,…
?哎呀,我忘了把n=0
作为一个假设。现在修好了。虽然你写的那本书也很有用。