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.