Skip to content
JeffVaughan edited this page May 10, 2008 · 4 revisions

These tactic definitions can be used to fold multiple instances of negations:

{{{#!coq Tactic Notation "fold" "any" "not" := repeat ( match goal with | |- context [?P -> False] => fold (~ P) end).

Tactic Notation "fold" "any" "not" "in" ident(H) "|-" := repeat ( match goal with | J: context [?P -> False] |- _ => fold (~ P) in H end).

Tactic Notation "fold" "any" "not" "in" ident(H) := fold any not in H |-.

Tactic Notation "fold" "any" "not" "in" "*" "|-" := repeat ( match goal with | H: context [?P -> False] |- _ => fold (~ P) in H end).

Tactic Notation "fold" "any" "not" "in" "*" := fold any not in * |-; fold any not.

Tactic Notation "fold" "any" "not" "in" "" "|-" "" := fold any not in *. }}}

Similarly, these tactics can be uses to fold logical equivalences:

{{{#!coq Tactic Notation "fold" "any" "iff" := repeat ( match goal with | |- context [(?P -> ?Q) /\ (?Q -> ?P)] => fold (P <-> Q) end).

Tactic Notation "fold" "any" "iff" "in" ident(H) "|-" := repeat ( match goal with | J: context [(?P -> ?Q) /\ (?Q -> ?P)] |- _ => fold (P <-> Q) in H end).

Tactic Notation "fold" "any" "iff" "in" ident(H) := fold any iff in H |-.

Tactic Notation "fold" "any" "iff" "in" "*" "|-" := repeat ( match goal with | H: context [(?P -> ?Q) /\ (?Q -> ?P)] |- _ => fold (P <-> Q) in H end).

Tactic Notation "fold" "any" "iff" "in" "*" := fold any iff in * |-; fold any iff.

Tactic Notation "fold" "any" "iff" "in" "" "|-" "" := fold any iff in *. }}}

Clone this wiki locally