2016-11-08 2 views
2

문자열이 목록의 동의어 인 부분 문자열의 귀납적 한정자를 원한다고 가정합니다. 여기귀납적 Coq 정의에서 실존 적 한정사와 일반 한정사 사이의 관계

Inductive substring {A : Set} (w : string A) : 
        (string A) -> Prop := 
    | SS_substr : forall x y z : string A, 
        x ++ y ++ z = w -> 
        substring w y. 

내가 예를 들어 다음과 같은 증명할 수 :

Theorem test : substring [3;4;1] [4]. 
Proof. 
    eapply SS_substr. 
    cbn. 
    instantiate (1:=[1]). 
    instantiate (1:=[3]). 
    reflexivity. 
Qed. 

그러나 증거는 사실에도 불구하고, 오히려 "보편적"이 아닌 "존재"입니다 유도 정의 상태 forall x y z 만 그들의 모양을 제한한다. 이것은 다소 비현실적입니다. 뭐라 구요?

또한 유도 정의를 exists x : string A, exists y : string A, exists z : string, x ++ y ++ z = w -> substring w y을 사용하여 만들 수 있습니까?

답변

2

참고로 중요한 점은 exists은 Coq의 기본 제공 기능 (forall과 반대)이라는 점입니다. 실제로는 exists 자체가 표기이지만 뒤에는 ex이라는 유도 형이 있습니다. 표기법과 유도 형은 Coq standard library에 정의되어 있습니다. 여기 ex의 정의는 다음과 같습니다

그것은 하나의 생성자와 substring 유형과 같은 보편적 인 정량을 사용하여 정의됩니다, 그래서 당신의 susbtring 유형은 어떤 점에서 "존재"가 될 것으로 보인다 것은 놀라운 일이 아니다
Inductive ex (A:Type) (P:A -> Prop) : Prop := 
    ex_intro : forall x:A, P x -> ex (A:=A) P. 

.

물론 exists을 사용하여 유형을 정의 할 수 있으며 Inductive도 필요하지 않습니다.

Definition substring' {A : Set} (w y : string A) : Prop := 
    exists x z, x ++ y ++ z = w. 
+0

감사합니다. (Jibadiba podajiba brm brm brm - 더 많은 문자가 필요함) – AntlerM

+0

@AntlerM 초기 질문에 답해도 해결책으로 내 게시물을 선택하기 전에 기다려야합니다. 다른 사용자가 주제에 대해 흥미로운 것을 게시하지 못하게 할 수 있습니다. – eponier

+0

글쎄요, 제 목적을 위해서, 보편적 인 것에서 확실하게 실존한다는 것이 확실합니다. (물론 A에있는 x는 P이면 x는 존재합니다 : A, P x '는 A가 공백이 아니라고 가정하고) 제가 궁금해하는 모든 것을 설명합니다 약; 어떤 사람들은 다른 사람들이 이것을 우연히 발견 할 수 있기 때문에 주제에 대한 "관심"이 더 많이 생길 수있는 여지를 남겨 두었다. 슬프게도 나는 13 명으로 당신을 배가시킬 수 없다. :). – AntlerM