を失うことなく、次の展開を考えてみましょう:コック:破壊(コ)誘導仮説情報
Require Import Relation RelationClasses.
Set Implicit Arguments.
CoInductive stream (A : Type) : Type :=
| scons : A -> stream A -> stream A.
CoInductive stream_le (A : Type) {eqA R : relation A}
`{PO : PartialOrder A eqA R} :
stream A -> stream A -> Prop :=
| le_step : forall h1 h2 t1 t2, R h1 h2 ->
(eqA h1 h2 -> stream_le t1 t2) ->
stream_le (scons h1 t1) (scons h2 t2).
私は仮説stream_le (scons h1 t1) (scons h2 t2)
を持っている場合destruct
戦術は、仮説のペアにそれを回すためには、それが合理的であるR h1 h2
およびeqA h1 h2 -> stream_le t1 t2
。しかし、それは何も起こりません。destruct
は何か重要でないことを行うたびに情報を失います。代わりに、新しい用語h0
、h3
、t0
、t3
は、それらがそれぞれh1
に等しいことがないリコール、h2
、t1
、t2
で、文脈に導入されています。
この種の「スマートdestruct
」をすばやく簡単に行う方法があるかどうかを知りたいと思います。ここで私が今持っているものです:destruct
を呼び出す
Theorem stream_le_destruct : forall (A : Type) eqA R
`{PO : PartialOrder A eqA R} (h1 h2 : A) (t1 t2 : stream A),
stream_le (scons h1 t1) (scons h2 t2) ->
R h1 h2 /\ (eqA h1 h2 -> stream_le t1 t2).
Proof.
intros.
destruct H eqn:Heq.
remember (scons h1 t1) as s1 eqn:Heqs1;
remember (scons h2 t2) as s2 eqn:Heqs2;
destruct H;
inversion Heqs1; subst; clear Heqs1;
inversion Heqs2; subst; clear Heqs2.
split; assumption.
Qed.
ニースの回答、私はupvoted。途中で3Kを打つことにおめでとう。 – EJoshuaS