LhsRhsTactic
LHS
means “left-hand side”. It returns the term on the left hand side of an equality or inequality.
Ltac LHS :=
match goal with
| |-(?a = _) => constr: a
| |-(_ ?a _) => constr: a
end.
For example you can use this to write a tactic that proves the cofixpoint equations of streams:
Ltac decomp_stream := intros; let L := LHS in rewrite (Streams.unfold_Stream L); reflexivity.
RHS
means “right-hand side”. It returns the term on the right hand side of an equality or inequality.
Ltac RHS :=
match goal with
| |-(_ = ?a) => constr: a
| |-(_ _ ?a) => constr: a
end.
We can make special tactics for replace LHS
and replace RHS
that give similar functionality to step
.
Tactic Notation "replace" "LHS" "with" constr (a) "by" tactic (t) :=
match goal with
| |-(?r ?b ?c) =>
let Z := fresh "Z" in
(change (let Z:=b in r Z c);intro Z;setoid_replace Z with a;
[unfold Z; clear Z|unfold Z; clear Z; solve [ t ]])
end.
Tactic Notation "replace" "LHS" "with" constr (a) :=
match goal with
| |-(?r ?b ?c) =>
let Z := fresh "Z" in
(change (let Z:=b in r Z c);intro Z;setoid_replace Z with a;
unfold Z; clear Z)
end.
Tactic Notation "replace" "RHS" "with" constr (a) "by" tactic (t) :=
match goal with
| |-(?r ?b ?c) =>
let Z := fresh "Z" in
(change (let Z:=c in r b Z);intro Z;setoid_replace Z with a;
[unfold Z; clear Z|unfold Z; clear Z; solve [ t ]])
end.
Tactic Notation "replace" "RHS" "with" constr (a) :=
match goal with
| |-(?r ?b ?c) =>
let Z := fresh "Z" in
(change (let Z:=c in r b Z);intro Z;setoid_replace Z with a;
unfold Z; clear Z)
end.
To the extent possible under law, the contributors of “Cocorico!, the Coq wiki” have waived all copyright and related or neighboring rights to their contributions.
By contributing to Cocorico!, the Coq wiki, you agree that you hold the copyright and you agree to license your contribution under the CC0 license or you agree that you have permission to distribute your contribution under the CC0 license.