2013-12-23 3 views
0

저는 Coq을 처음 접했고 완전히 잘못된 길을 가고있을 수도 있습니다. 인간이 읽을 수있는 형태로 구문을 너무 많이 숨기고 자동 전술이 실패하기 때문에 인간이 읽을 수있는 공리/정리 인 공리/정리 (공리/정리) 중에서 힌트로 유용한 정리를 선택해야합니다. 그들을 사용합니다. 나는 두 세계의 장점을 누릴 수있는 방법이 있는지 알고 싶습니다.Coq : 의미있는 힌트를 추가하는 방법?

나는 조금 더 정교한 예를 제시 할 것이다. 그렇지 않다면 나는 내 뜻을 전달할 수 없을 것이라고 두려워하기 때문이다.

학습 운동으로 나는 그룹 이론을 시도하고 있습니다. 여기 내 정의는 다음과 같습니다.

Variable G: Set. 
Variable op: G -> G -> G. 
Variable inv: G -> G. 
Variable e:G. 
Infix "+" := op. 
Notation "- x" := (inv x). 

Definition identity x := forall a:G, a + x = a /\ x + a = a. 

Definition associative_law := forall a b c:G, a + (b + c) = (a + b) + c. 
Definition identity_law := identity e. 
Definition inverse_law := forall a:G, a + (-a) = e /\ -a + a = e. 
Definition group_laws:= associative_law /\ identity_law /\ inverse_law. 
Axiom group_laws_hold: group_laws. 

나는 모든 것을 사람이 읽을 수 있도록하려고 시도했다. 그래서 전자가 정체성이라고 말하는 공리는 "group_laws"와 "identity"라는 두 추상화 계층 뒤에 숨어 있습니다.

나는이 공리를 작성할 수

직접 (물론, 나는 그것의 절반이 필요합니다) :

Axiom identity_law_holds: forall a:G, a + e = a. 

을 지금, 힌트로 우리 그룹 - 공리를 보자 :

Hint Resolve group_laws_hold. 

을 지금 나는 그룹에 대한 단순한 진술을 증명하려고한다. 정체성은 유일하다 :

지금까지는 그렇게 좋았다. 이제 나의 현재 목표는 "x + e = x"입니다. 내가 지금한다면

apply group_laws_hold. 

이 목표는 해결 될 것입니다. 그러나 "auto"를 수행하는 것은 아무 것도하지 않습니다. 아마도 "group_laws_hold"가 "x + e"와 같은 구문이 아니기 때문에 Coq는 "group_laws_hold"가 "x + e = x" = x ". 내가 힌트를 추가하는 경우

그러나

Hint Resolve identity_law_holds.  

그런 다음 "자동"물론, 작동합니다. 나는 약간 좀 더 일반적인 (더 정확한) 뭔가 "identity_law_holds"로 변경한다면

Axiom identity_law_holds: forall a:G, a + e = a /\ e + a = a. 

그런 다음 "자동"다시 실패합니다.

내 질문은 : "자동"작동하지만 내 "일반 공감 identity_law_holds : forall a : G, a + e = a"보다 일반적인 힌트와 같은 코드를 수정하는 방법이 있습니까?

답변

1

eauto은 정규화를 수행 할 수 있습니다. and_ind과 같은 유도 원리의 결론은 너무 일반적이므로 은 eauto을 거의 멈추게 할 것이기 때문에 eauto이 유도 할 수없는 것은 유도입니다 ( ). 어쨌든 은 을 사용하기 전에 intros 을 사용합니다. 을 도입하기 전에 유도가 필요한 경우가 종종 있습니다.

당신은 자신의 덜 일반적인 투영법을 정의해야합니다.

Lemma l1 : group_laws -> identity_law. 
Proof. intros [? [? ?]]. eauto. Qed. 

Lemma l2 : identity_law -> identity e. 
Proof. eauto. Qed. 

Lemma l3 : forall x, identity x -> forall a, a + x = a. 
Proof. intros. einduction H. eauto. Qed. 

Lemma l4 : forall x, identity x -> forall a, x + a = a. 
Proof. intros. einduction H. eauto. Qed. 

Hint Resolve eq_sym eq_trans group_laws_hold l1 l2 l3 l4. 

Theorem identity_is_unique: forall x, identity x -> x = e. 
Proof. info_eauto 7. Qed. 

하지만 당신은 and_ind를 사용하는 eauto을 강제 할 수 있습니다.

Hint Extern 1 => eapply and_ind.