Definition stronger (l1 l2 : list Prop) :=
  forall x y, In x l1 -> In y l2 -> (x -> y).Definition all_equiv_under (l1 l2 : list Prop) :=
  forall x y z, In x l1 -> In y l2 -> In z l2 -> (x -> (y <-> z)).

(* Specifications: *)
Lemma all_equiv_under_chara : forall l1 l2, all_equiv_under l1 l2 <-> forall x, In x l1 -> x -> all_equiv l2.
Lemma all_equiv2_impl__stronger : forall l1 l2 x y, all_equiv l1 -> all_equiv l2 -> In x l1 -> In y l2 -> (x -> y) -> stronger l1 l2.
Lemma stronger2__stronger_right : forall l1 l2 l2', stronger l1 l2 -> stronger l1 l2' -> stronger l1 (l2++l2').
Lemma stronger2__stronger_left : forall l1 l1' l2, stronger l1 l2 -> stronger l1' l2 -> stronger (l1++l1') l2.
Lemma stronger_transitivity : forall l1 l2 l3, stronger l1 l2 -> stronger l2 l3 -> l2 <> nil -> stronger l1 l3.
Lemma all_equiv2_stronger2__all_equiv : forall l1 l2, all_equiv l1 -> all_equiv l2 -> stronger l1 l2 -> stronger l2 l1 -> all_equiv (l1++l2).
Lemma all_equiv3_stronger3__all_equiv : forall l1 l2 l3, l1 <> nil -> l2 <> nil -> l3 <> nil -> all_equiv l1 -> all_equiv l2 -> all_equiv l3 -> stronger l1 l2 -> stronger l2 l3 -> stronger l3 l1 -> all_equiv (l1++l2++l3).
Lemma all_equiv2_impl2__all_equiv : forall l1 l2 x y x' y', all_equiv l1 -> all_equiv l2 -> In x l1 -> In y l2 -> (x -> y) -> In x' l2 -> In y' l1 -> (x' -> y') -> all_equiv (l1++l2).
Lemma all_equiv3_impl3__all_equiv : forall l1 l2 l3 x y x' y' x'' y'', all_equiv l1 -> all_equiv l2 -> all_equiv l3 -> In x l1 -> In y l2 -> (x -> y) -> In x' l2 -> In y' l3 -> (x' -> y') -> In x'' l3 -> In y'' l1 -> (x'' -> y'') -> all_equiv (l1++l2++l3).
Lemma all_equiv_trivial : forall x, all_equiv (x::nil).
Lemma incl_preserves_all_equiv : forall l1 l2, incl l1 l2 -> all_equiv l2 -> all_equiv l1.
Lemma incl_preserves_stronger : forall l1 l2 l1' l2', incl l1 l1' -> incl l2 l2' -> stronger l1' l2' -> stronger l1 l2.