2017-04-26 12 views
0

私は以下に示す接尾辞のような誘導関係を持っています。私は関連する定理を証明しようとしています suffix_app。私の一般的なアイデアは、xsがysと等しいか、それが何らかの一連の要素であることを示すために接尾辞xs ysというその事実を使用することです。 cons '無限反転ループ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 : forall (X: Type) (x:X) (xs ys: list X), 
    suffix xs ys -> 
    exists ws, xs = ws ++ ys. 
Proof. 
    intros. 
    inversion H. 
    - exists []. reflexivity. 
    - 

はしかし、私は反転を使用する場合、実際にこれまで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]]; [now exists []|]. 
now exists (x :: zs); rewrite zeq. 
Qed. 

サフィックスの異なる、計算バージョンを使用したい場合があり汝実用上の理由:

答えて

1

あなたの証明は、単に例として、構造のいずれかに誘導することにより、以下の。

+0

こんにちは、遅れて申し訳ありません。確かにこれは動作します。しかし、仮説zeqを得るために、誘導節1をas節と呼ぶ必要があるのはなぜですか?私はas節なしで実験していましたが、私はzeqを見つけることを期待していましたが(Coqから自動的に生成された名前で)、そのような仮説は存在せず、したがって証明はas節では解けませんでした。申し訳ありませんが、私はCoqのこの側面をよく理解していません。 –

+1

私はあなたが 'as'節を使うかどうかにかかわらず同じ結果を得なければなりません。あなたは正しいことで誘導を呼んでいることを確認してください!自動生成された名前を使用すると、Coqが命名規則を変更することを決定し、すべての証明がもう有効ではないと判断されると、多くの問題が発生します。 – ejgallego