Considérer le développement suivant:Coq: destruct (co) hypothèse inductive sans perte d'information
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).
Si j'ai une hypothèse stream_le (scons h1 t1) (scons h2 t2)
, il serait raisonnable que la tactique destruct
pour le transformer en une paire d'hypothèses R h1 h2
et eqA h1 h2 -> stream_le t1 t2
. Mais ce n'est pas ce qui se passe, car destruct
perd des informations chaque fois que vous faites quelque chose de non-trivial. Au lieu de cela, de nouveaux termes h0
, h3
, t0
, t3
sont introduits dans le contexte, sans rappel qu'ils sont respectivement égaux à h1
, h2
, t1
, t2
.
Je voudrais savoir s'il existe un moyen rapide et facile de faire ce genre de "smart destruct
". Voici ce que j'ai en ce moment:
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.
Bonne réponse, je l'a mise à jour. Félicitations de frapper 3K au fait. – EJoshuaS