考虑以下相互归纳命题
Inductive TypeA : Prop :=
| ConstructorA : TypeB -> TypeA
with TypeB : Prop :=
| ConstructorB : TypeA -> TypeB.
以下是~TypeA
函数式风格的证明
Fixpoint TypeA_is_empty' (a : TypeA) : False :=
match a with
| ConstructorA b' => TypeB_is_empty' b'
end
with TypeB_is_empty' (b : TypeB) : False :=
match b with
| ConstructorB a' => TypeA_is_empty' a'
end.
战术风格上如何证明~TypeA
?
如果 Coq 中存在类似的东西,我希望能够将它们证明为相互定理
Theorem TypeA_is_empty : ~ TypeA.
Theorem TypeB_is_empty : ~ TypeB.
Proof.
unfold not.
intros b.
inversion b as [a].
apply (TypeA_is_empty a).
Qed.
Proof.
unfold not.
intros a.
inversion a as [b].
apply (TypeB_is_empty b).
Qed.
编辑:发现 Coq 有这样的相互定理语法,但它会抛出错误
Lemma TypeA_is_empty : ~ TypeA
with TypeB_is_empty : ~ TypeB.
**Cannot find common (mutual) inductive premises or coinductive conclusions in the statements.**
(为了方便起见,我已更改了名字。)
首先,您不能
not
在语句中使用,这个语句可以编译:也就是说,这段代码似乎可以做到这一点。请参阅注释以获取解释:
使用
Fixpoint
而不是Lemma
因为你需要TypeA_is_empty
里面的证明。