81 lines
2.7 KiB
Coq
Executable File
81 lines
2.7 KiB
Coq
Executable File
Require Export Coq.Bool.Bool.
|
|
Require Export Coq.Arith.Arith.
|
|
Require Export Coq.Arith.EqNat.
|
|
Require Export Coq.omega.Omega.
|
|
Require Export Coq.Lists.List.
|
|
Require Export Coq.ZArith.ZArith.
|
|
Require Export Coq.Numbers.Natural.Peano.NPeano.
|
|
Require Export Coq.Setoids.Setoid.
|
|
Require Export Coq.Program.Equality. (**r Necessary for 'dependent induction'. *)
|
|
|
|
Require Export LibTactics.
|
|
|
|
|
|
Ltac autoinjection :=
|
|
repeat match goal with
|
|
| h: ?f _ = ?f _ |- _ => injection h; intros; clear h; subst
|
|
| h: ?f _ _ = ?f _ _ |- _ => injection h; intros; clear h; subst
|
|
| h: ?f _ _ _ = ?f _ _ _ |- _ => injection h; intros; clear h; subst
|
|
| h: ?f _ _ _ _ = ?f _ _ _ _ |- _ => injection h; intros; clear h; subst
|
|
| h: ?f _ _ _ _ _ = ?f _ _ _ _ _ |- _ => injection h; intros; clear h; subst
|
|
end.
|
|
|
|
Ltac go :=
|
|
simpl in *;
|
|
repeat match goal with
|
|
| h: ?x = _ |- context[match ?x with _ => _ end] => rewrite h
|
|
end;
|
|
autoinjection;
|
|
try (congruence);
|
|
try omega;
|
|
subst;
|
|
eauto 4 with zarith datatypes;
|
|
try (econstructor ; (solve[go])).
|
|
|
|
Tactic Notation "go" := try (go; fail).
|
|
|
|
Ltac go_with b :=
|
|
simpl in *;
|
|
repeat match goal with
|
|
| h: ?x = _ |- context[match ?x with _ => _ end] => rewrite h
|
|
end;
|
|
autoinjection;
|
|
try (congruence);
|
|
try omega;
|
|
subst;
|
|
eauto 4 with zarith datatypes b;
|
|
try (econstructor ; (solve[go])).
|
|
|
|
Ltac inv H := inversion H; try subst; clear H.
|
|
|
|
Tactic Notation "flatten" ident(H) :=
|
|
repeat match goal with
|
|
| H: context[match ?x with | left _ => _ | right _ => _ end] |- _ => destruct x
|
|
| H: context[match ?x with | _ => _ end] |- _ => let E := fresh "Eq" in destruct x eqn:E
|
|
end; autoinjection; try congruence.
|
|
|
|
Tactic Notation "flatten" :=
|
|
repeat match goal with
|
|
| |- context[match ?x with | left _ => _ | right _ => _ end] => destruct x
|
|
| |- context[match ?x with | _ => _ end] => let E := fresh "Eq" in destruct x eqn:E
|
|
end; autoinjection; try congruence.
|
|
|
|
(*Tactic Notation "induction" ident(x) := dependent induction x.*)
|
|
|
|
Definition admit {T: Type} : T. Admitted.
|
|
|
|
Tactic Notation "solve_by_inversion_step" tactic(t) :=
|
|
match goal with
|
|
| H : _ |- _ => solve [ inversion H; subst; t ]
|
|
end
|
|
|| fail "because the goal is not solvable by inversion.".
|
|
|
|
Tactic Notation "solve" "by" "inversion" "1" :=
|
|
solve_by_inversion_step idtac.
|
|
Tactic Notation "solve" "by" "inversion" "2" :=
|
|
solve_by_inversion_step (solve by inversion 1).
|
|
Tactic Notation "solve" "by" "inversion" "3" :=
|
|
solve_by_inversion_step (solve by inversion 2).
|
|
Tactic Notation "solve" "by" "inversion" :=
|
|
solve by inversion 1.
|