关于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
    作为一个假设。现在修好了。虽然你写的那本书也很有用。