2017-11-20 3 views
2

나는 coq에서 뭔가를 증명하려고 노력하고 있으며 같은 문제가 계속 발생합니다. 유도의 재귀 적 (nil이 아닌) 단계에서 Fixpoint의 정의를 펼치고 싶습니다.유도의 재귀 적 단계에서 Fixpoint를 '펼치기'사용하기

목록 역 (REV)을 전개하기 전에 정의 :

n : nat 
    l' : natlist 
    IHl' : rev (rev l') = l' 
    ============================ 
    rev (rev (n :: l')) = n :: l' 

후 : 지금까지

n : nat 
    l' : natlist 
    IHl' : rev (rev l') = l' 
    ============================ 
    (fix rev (l : natlist) : natlist := match l with 
             | [ ] => [ ] 
             | h :: t => rev t ++ [h] 
             end) 
    ((fix rev (l : natlist) : natlist := match l with 
             | [ ] => [ ] 
             | h :: t => rev t ++ [h] 
             end) l' ++ [n]) = n :: l' 

좋지 예상대로 작품을 펼쳐, 여기에 예입니다. 이제는 simpl이 무응답이 아닌 경우입니다. n :: l'은 결코이 될 수 없으므로 일치하지 않는 경우 ([ ] => [ ])가 아닌 nil의 경우 만 단순화합니다. 정의.

불행히도 그것은 암묵적으로 그렇게하지 않습니다. 재귀 고정 점 정의의 unfold을 유도로 잘 재생하려면 어떻게해야합니까? 나는 어떻게합니까 :

n : nat 
    l' : natlist 
    IHl' : rev (rev l') = l' 
    ============================ 
    rev (rev l' ++ [n]) = n :: l' 

내부 rev에 대한 rev 정의에 따르면.

참고 : 목록 사용은 여기에 관계가 없으며 동일한 기술을 유도 식 정의 유형에 사용할 수 있습니다.

편집 : rev의 정의와 의 후속 상태의 증명.

Fixpoint rev (l:natlist) : natlist := 
    match l with 
    | nil => nil 
    | h :: t => rev t ++ [h] 
    end. 

Theorem rev_involutive : forall l : natlist, 
    rev (rev l) = l. 
Proof. 
    intros l. induction l as [| n l']. 
    - reflexivity. 
    - unfold rev. 
+0

[최소 완료 및 검증 가능 예제] (https://stackoverflow.com/help/mcve)를 제출하십시오. 우리가 다른 것을 시험해 볼 수있을 때 대답하기가 훨씬 쉽습니다. – gallais

+0

'rev'의 정의와 After 상태로 연결되는 증명이 추가되었습니다. – rausted

답변

2

귀하의 After:은 기본적으로 rev (rev l' ++ [n]) 감소 당신이 일어나고보고 싶은 것을 의미합니다 (펼쳐진 rev로)이 이미 일어난 것입니다. 이제 rev (xs ++ ys) = rev ys ++ rev xs과 유사한 보조 정리를 증명하려고합니다.

+0

물론, 이미 입증 된 바 있습니다. 그러나이 증명은 예제로 사용됩니다. 필자가 정말로 원하는 것은'rev' 정의에서 전개 된 성가신 'match'를 줄이는 것이다. 패턴 매칭이 불가능한 경우는 불가능하다. 'Forall n : nat, l : natlist, n :: l ~ = []'을 증명하면 어떻게 되겠습니까?하지만 cons의 정의에서 분명해야합니다. – rausted

+1

말했듯이 : 그것은 이미 단순화되었습니다. 'fold rev'를 시도하면, 이제'rev (rev l '++ [n])'로 축소되었음을 알 수 있습니다. – gallais

+0

예! 접어서 내가 원하는거야! 증거에 대한 열쇠가 'unfold rev'라는 슈퍼 카운터 직관적 인 표현입니다. fold rev. '그것은 아무것도하지 않는 것처럼 보입니다. 왜 그렇게 간단하지 않은 첫 번째 전략 중 하나가 아닌가? – rausted