End MonoTheorems.
Section AssocTheorems.
Context {L: Language}
{minL: MinimunLanguage L}
{Gamma: ProofTheory L}
{minAX: MinimunAxiomatization L Gamma}
{prodp: expr -> expr -> expr}
{e: expr}
{Mono: Monotonicity L Gamma prodp}
{Assoc: Associativity L Gamma prodp}
{LU: LeftUnit L Gamma e prodp}
{RU: RightUnit L Gamma e prodp}.
(* Since the left unit and right unit can only be identical, we can just assume that directly. *)

(* Specifications: *)
Lemma assoc_fold_left_cons: forall x xs,
|-- fold_left prodp xs (prodp e x) --> prodp x (fold_right prodp e xs).
Lemma assoc_fold_right_cons: forall x xs,
|-- prodp x (fold_right prodp e xs) --> fold_left prodp xs (prodp e x).
Lemma assoc_fold_left_fold_right: forall xs,
|-- fold_left prodp xs e --> fold_right prodp e xs.
Lemma assoc_fold_right_fold_left: forall xs,
|-- fold_right prodp e xs --> fold_left prodp xs e.
Lemma assoc_prodp_fold_left: forall xs1 xs2,
|-- prodp (fold_left prodp xs1 e) (fold_left prodp xs2 e) --> fold_left prodp (xs1 ++ xs2) e.
Lemma assoc_fold_left_app: forall xs1 xs2,
|-- fold_left prodp (xs1 ++ xs2) e --> prodp (fold_left prodp xs1 e) (fold_left prodp xs2 e).