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_before : forall l, before_func f g l -> forall y, g y = true -> exists x : A, f x = true /\ before x y l.