2017-05-21 8 views
1

를 생성하지 :COQ 아래와 같이 나는 다음과 같은 정리에 대한 해결책을 받았다 유도 가설

Require Import Coq.Lists.List. 
Import ListNotations. 

Inductive suffix {X : Type} : list X -> list X -> Prop := 
    | suffix_end : forall xs, 
      suffix xs xs 
    | suffix_step : forall x xs ys, 
      suffix xs ys -> 
      suffix (x :: xs) ys. 

Theorem suffix_app (X: Type) (xs ys: list X) : 
    suffix xs ys -> exists ws, xs = ws ++ ys. 
Proof. 
    induction 1 as [|x xsp ysp hs [zs zeq]]. 
    - exists []. reflexivity. 
    - now exists (x :: zs); rewrite zeq. 
Qed. 

내가 빨리 다른 컴퓨터에 복제하는 것을 시도했다, 따라서 그것을 시도 :

Theorem suffix_app (X: Type) (xs ys: list X) : 
    suffix xs ys -> exists ws, xs = ws ++ ys. 
Proof. 
    induction 1. 
    - exists []. reflexivity. 
    - (* Stuck here! *) 
Abort. 

ie "as"절없이. 그러나, 나는 "zeq"의 자동 - 명명 된 동등 물로 인해 내가 밖으로 운동 할 수없는 이유로 생성되지 않는 붙어있어. 왜 두 번째 경우에 Coq가 생성 한 "zeq"의 (자동으로 명명 된) 동등 물이 아닌가?

as 절은 소위 소개-패턴을 허용하기 때문에이 코멘트에 @ejgallego에서 언급 한 바와 같이
+2

을 참조하십시오. 첫 번째 예에서는 패턴에 '파괴'가 있다는 점에 유의하십시오. 그러므로''IHsuffix를 [zs zeq]로 파괴하라 .''는 게임에서 다시 당신을 얻을 것입니다. – ejgallego

+0

나는 그걸 발견하지 못했다고 충격을 받았다. 그러나 ... c'est la vie. 고마워, 내 질문에 완전히 대답했다. 자유롭게 답해 주시면 받아 들일 것입니다. –

+0

파괴 외에도,'intros'는 재 작성을 할 수 있습니다 ('->') :'induction 1 as [| x? ? ? [zs ->]]; [존재 [] | 존재 (x :: zs)]; 사소한 .' –

답변