Coqの共誘導型を使用していくつかの基本的なプロパティを証明しようとすると、次の問題にぶつかり続け、回避できません。次のように、単純なCoqスクリプトに問題を抽出しました。
タイプTreeは、タイプAの要素でラベル付けされたブランチを持つ無限ツリーを定義します。ブランチは、すべての要素のために定義する必要はありませんA。値Univは、すべてのAブランチが常に定義されている無限ツリーです。isUnivは、指定されたツリーがUnivと等しいかどうかをテストします。補題は、UnivがisUnivを実際に満たしていると述べています。
Parameter A : Set.
CoInductive Tree: Set := Node : (A -> option Tree) -> Tree.
Definition derv (a : A) (t: Tree): option Tree :=
match t with Node f => f a end.
CoFixpoint Univ : Tree := Node (fun _ => Some Univ).
CoInductive isUniv : Tree -> Prop :=
isuniv : forall (nf : A -> option Tree) (a : A) (t : Tree),
nf a = Some t ->
isUniv t ->
isUniv (Node nf).
Lemma UnivIsUniv : isUniv Univ.
Proof.
cofix CH. (* this application of cofix is fine *)
unfold Univ.
Admitted.
この時点で、証拠を放棄します。現在の目標は次のとおりです。
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
私は排除するために適用するためにどの戦術を知らないcofix生産する目的での(ノードの何か)私が適用できるようにisuniv。
誰もこの補題を証明するのを助けることができますか?そのような状況でcofix
を排除する標準的な方法は何ですか?
1
タグ「interactive-proofs」は適切ではありません。一般に、複雑性理論的な意味でのインタラクティブな証明システムを指します。私が思う正しい用語は、「対話式定理証明」または「定理証明」です。
—
Iddo Tzameret
修正、「校正助手」を使用
—
デイブクラーク