End Inclusion.
Definition inclp (X : Type) (A : list X) (p : X -> Prop) : Prop :=
forall x, x el A -> p x.
(** *** Setoid rewriting with list inclusion and list equivalence *)
Instance incl_preorder X :
PreOrder (@incl X).
Instance equi_Equivalence X :
Equivalence (@equi X).
Instance incl_equi_proper X :
Proper (@equi X ==> @equi X ==> iff) (@incl X).
Instance cons_incl_proper X x :
Proper (@incl X ==> @incl X) (@cons X x).
Instance cons_equi_proper X x :
Proper (@equi X ==> @equi X) (@cons X x).
Instance in_incl_proper X x :
Proper (@incl X ==> Basics.impl) (@In X x).
Instance in_equi_proper X x :
Proper (@equi X ==> iff) (@In X x).
Instance app_incl_proper X :
Proper (@incl X ==> @incl X ==> @incl X) (@app X).
Instance app_equi_proper X :
Proper (@equi X ==> @equi X ==> @equi X) (@app X).
Section Equi.
Variable X : Type.
Implicit Types A B : list X.

(* Specifications: *)
Lemma equi_push x A :
x el A -> A === x::A.
Lemma equi_dup x A :
x::A === x::x::A.
Lemma equi_swap x y A:
x::y::A === y::x::A.
Lemma equi_shift x A B :
x::A++B === A++x::B.
Lemma equi_rotate x A :
x::A === A++[x].
Lemma equi_push x A :
x el A -> A === x::A.
Lemma equi_dup x A :
x::A === x::x::A.
Lemma equi_swap x y A:
x::y::A === y::x::A.
Lemma equi_shift x A B :
x::A++B === A++x::B.
Lemma equi_rotate x A :
x::A === A++[x].