我坚持一个关于归纳谓词的简单证据。我必须证明自然0不是正数,其中自然是一个位列表,0是任何只有0位的列表。
H1: pos Empt
____________ (1/1)
Nat
This的Certified 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.
答案 0 :(得分:1)
您的Theorem T1
不等同于Obligation
。在后者中,你应该构建一个Nat
的元素,它本身就是Type
(顺便说一下,你为什么不在这里使用Set
?你似乎不是在这个开发中操纵高阶类型)。
正如错误消息所示,您无法对inversion
的元素执行案例分析(Prop
建立在此基础上)(请参阅{{3的4.5.4节) }})。但是,在这种情况下,您对构建实际Nat
不感兴趣,您只想证明此案例是不可能的。为此,您可以apply False_rect
(或False_rec
,如果您选择使用Set
而不是Type
),这将让您证明False
。 False
为Prop
,您可以使用inversion H1
。
请注意,pred
定义的第二个分支中存在问题:您无法使用(pred nat2 H1)
,因为H1
不是pos nat2
的证明。最简单的方法可能是在这里留下一个漏洞:(pred nat2 _)
,这可以通过inversion
轻松解决(这次,你必须建立一个pos nat2
类型的术语,即住在Prop
)。