Coq 用共导假设证明共导定理

Coq 用共导假设证明共导定理,coq,theorem-proving,coinduction,Coq,Theorem Proving,Coinduction,我有一个简单的惰性二叉树实现: 共导树(A:Set):集合:= |LLeaf:LTree A |LBin:A->(树A)->(树A)->树A。 以及以下特性: (*具有无限分支*) 共导SomeInfinite{A}:LTree A->Prop:= 某种无限的力量: 对于所有(a:a)(lr:LTree a),(SomeInfinite l\/SomeInfinite r)-> 无限的某物(LBin ul r)。 (*只有有限分支(即有限)*) 归纳AllFinite{A}:LTree A->

我有一个简单的惰性二叉树实现:

共导树(A:Set):集合:= |LLeaf:LTree A |LBin:A->(树A)->(树A)->树A。 以及以下特性:

(*具有无限分支*)
共导SomeInfinite{A}:LTree A->Prop:=
某种无限的力量:
对于所有(a:a)(lr:LTree a),(SomeInfinite l\/SomeInfinite r)->
无限的某物(LBin ul r)。
(*只有有限分支(即有限)*)
归纳AllFinite{A}:LTree A->Prop:=
|AllFinite_LLeaf:AllFinite(LLeaf A)
|所有有限公司:
对于所有(a:a)(l-r:l树a),(所有有限l/\所有有限r)->
全有限(LBin ulr)。
我想证明一个定理,即有限树没有无限分支:

定理allfinite\u noinfinite:forall{A}(t:LTree A),allfinite t->not(SomeInfinite t)。

…但我在开始几次战术后就迷路了。这个假设本身似乎很琐碎,但我甚至不能从它开始。证明这样一个定理会是什么样子?

证明其实并不难(但你偶然发现了一些令人讨厌的怪癖):首先,证明的主要思想是你有一个归纳证人,证明t是有限的,因此,你可以对证人进行归纳,当
t
只是一片叶子时,得出一个矛盾的结论,当它是一个二进制节点时,重复使用归纳假设

现在令人恼火的问题是Coq没有为
AllFinite
推导出正确的归纳原理,因为
/\
:比较

Inductive AllFinite {A} : LTree A -> Prop :=
  | AllFinite_LLeaf : AllFinite (LLeaf A)
  | AllFinite_LBin :
      forall (a : A) (l r : LTree A), AllFinite l /\ AllFinite r ->
                                 AllFinite (LBin _ a l r).
Check AllFinite_ind.
(* AllFinite_ind *)
(*      : forall (A : Set) (P : LTree A -> Prop), *)
(*        P (LLeaf A) -> *)
(*        (forall (a : A) (l r : LTree A), *)
(*         AllFinite l /\ AllFinite r -> P (LBin A a l r)) -> *)
(*        forall l : LTree A, AllFinite l -> P l *)

在归纳的情况下,第一个版本并没有给出预期的归纳假设。因此,您可以将
AllFinite
更改为
AllFinite'
,或者您需要手动重新编写归纳原理

Inductive AllFinite' {A} : LTree A -> Prop :=
  | AllFinite'_LLeaf : AllFinite' (LLeaf A)
  | AllFinite'_LBin :
      forall (a : A) (l r : LTree A), AllFinite' l -> AllFinite' r ->
                                 AllFinite' (LBin _ a l r).
Check AllFinite'_ind.
(* AllFinite'_ind *)
(*      : forall (A : Set) (P : LTree A -> Prop), *)
(*        P (LLeaf A) -> *)
(*        (forall (a : A) (l r : LTree A), *)
(*         AllFinite' l -> P l -> AllFinite' r -> P r -> P (LBin A a l r)) -> *)
(*        forall l : LTree A, AllFinite' l -> P l *)