Ltac IF_tac :=
match goal with |- context [IF ?a then _ else _] =>
cut (a \/ ~a);
[ let H := fresh "H" in intro H; destruct H;
[try (rewrite IF_then_else_True;[|auto]) | try (rewrite IF_then_else_False; [|auto])]
| ]
end.
Ltac IF_tac_in H :=
match type of H with context [IF ?a then _ else _] =>
cut (a \/ ~a);
[ let H' := fresh "H" in intro H'; destruct H';
[try (rewrite IF_then_else_True in H ;[|auto]) | try (rewrite IF_then_else_False in H; [|auto])]
| ]
end.

(* Specifications: *)
(* Coerce from values to exprs... *)
Lemma isvNat: forall n,
isValue (Nat n).
Lemma isvLoc: forall l,
isValue (Loc l).
Lemma isvLam: forall e,
closed' 1 e ->
isValue (Lam e).