Fixpoint before_func {A: Type} (f : A -> bool) (g : A -> bool) (l : list A) : Prop :=
  match l with
  | [] => False
  | a :: l' =>
    f a = true \/
    (g a = false /\ before_func f g l')
  end.Definition before_func_dec : forall l, {before_func f g l} + {~ before_func f g l}.

Lemma before_func_app_necessary : forall l l', ~ before_func f g l -> before_func f g (l ++ l') -> (forall x, In x l -> g x = false) /\ before_func f g l'.