Coq에서 coinductive 유형을 사용하여 몇 가지 기본 속성을 증명하려고 시도하는 동안 다음과 같은 문제가 계속 발생하여 해결할 수 없습니다. 다음과 같이 문제를 간단한 Coq 스크립트로 정리했습니다.
유형 트리는 유형 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))
나는 isuniv 를 적용 할 수 있도록 (노드 무언가) 생산 목표 에서 cofix 를 제거하기 위해 적용 할 전술을 모른다 .
누구든지이 보조 정리를 증명할 수 있습니까? 그러한 상황에서 cofix
를 제거하는 표준 방법은 무엇입니까 ?
1
"interactive-proofs"태그는 일반적으로 복잡한 이론적 의미에서 대화 형 증명 시스템을 나타내므로 적절하지 않습니다. 내가 생각하는 올바른 용어는 "대화식 정리 증명"또는 "정리 입증"입니다.
—
Iddo Tzameret
"내성 지원"을 사용하여 수정 됨
—
Dave Clarke