不能在归纳谓词上使用反演

时间:2012-11-27 10:30:31

标签: coq dependent-type

我坚持一个关于归纳谓词的简单证据。我必须证明自然0不是正数,其中自然是一个位列表,0是任何只有0位的列表。

H1: pos Empt
____________ (1/1)
Nat
ThisCertified Programming with Dependents Types章似乎建议我使用inversion,但收到错误消息。

Require Import Coq.Program.Program.

Inductive Bit: Type :=
  | Zer: Bit
  | One: Bit.

Inductive List (type1: Type): Type :=
  | Empt: List type1
  | Fill: type1 -> List type1 -> List type1.

Implicit Arguments Empt [[type1]].

Implicit Arguments Fill [[type1]].

Definition Nat: Type := List Bit.

Inductive pos: Nat -> Prop :=
  | pos_1: forall nat1: Nat, pos (Fill One nat1)
  | pos_2: forall nat1: Nat, pos nat1 -> forall bit1: Bit, pos (Fill bit1 nat1).

Program Fixpoint pred (nat1: Nat) (H1: pos nat1): Nat :=
  match nat1 with
  | Empt => _
  | Fill Zer nat2 => Fill One (pred nat2 H1)
  | Fill One nat2 => Fill Zer nat2
  end.

Next Obligation.
inversion H1.

1 个答案:

答案 0 :(得分:1)

您的Theorem T1不等同于Obligation。在后者中,你应该构建一个Nat的元素,它本身就是Type(顺便说一下,你为什么不在这里使用Set?你似乎不是在这个开发中操纵高阶类型)。

正如错误消息所示,您无法对inversion的元素执行案例分析(Prop建立在此基础上)(请参阅{{3的4.5.4节) }})。但是,在这种情况下,您对构建实际Nat不感兴趣,您只想证明此案例是不可能的。为此,您可以apply False_rect(或False_rec,如果您选择使用Set而不是Type),这将让您证明FalseFalseProp,您可以使用inversion H1

请注意,pred定义的第二个分支中存在问题:您无法使用(pred nat2 H1),因为H1不是pos nat2的证明。最简单的方法可能是在这里留下一个漏洞:(pred nat2 _),这可以通过inversion轻松解决(这次,你必须建立一个pos nat2类型的术语,即住在Prop)。