Voici une autre version, qui utilise Ltac et sa capacité à motif match sur les types de termes:
Tactic Notation "assign" "rhs" "of" ident(H) "to" ident(u) "in" ident(H') :=
match type of H with _ = ?rhs => set (u := rhs) in H' end.
Tactic Notation "assign" "rhs" "of" ident(H) "to" ident(u) "in" "*" :=
match type of H with _ = ?rhs => set (u := rhs) in * end.
Nous pouvons créer plus de variantes ci-dessus (voir, par exemple here). Voici comment l'utiliser:
Lemma example {T} (ce1 ce2 ce3 : T) (H1 : ce1 = ce2) (H2 : ce2 = ce3) : ce1 = ce3.
Proof.
assign rhs of H1 to u in *.
état Preuve:
u := ce2 : T
H1 : ce1 = u
H2 : u = ce3
============================
ce1 = ce3
Encore une fois:
Undo.
assign rhs of H1 to u in H1.
état Preuve:
u := ce2 : T
H1 : ce1 = u
H2 : ce2 = ce3
============================
ce1 = ce3