(* Autor(s): Andrej Dudenhefner (1) Affiliation(s): (1) Saarland University, Saarbrücken, Germany *)
(* evaluates predicate p on all free variables *)
Fixpoint allfv_pure_term (p: nat -> Prop) (M: pure_term) :=
match M with
| pure_var x => p x
| pure_app M N => allfv_pure_term p M /\ allfv_pure_term p N
| pure_abs M => allfv_pure_term (scons True p) M
end.

Lemma allfv_pure_term_impl {p1 p2: nat -> Prop} {M}:
(forall x, p1 x -> p2 x) -> allfv_pure_term p1 M -> allfv_pure_term p2 M.