End AdjointTheorems.
Section MonoTheorems.
Context {L: Language}
{minL: MinimunLanguage L}
{Gamma: ProofTheory L}
{minAX: MinimunAxiomatization L Gamma}
{prodp: expr -> expr -> expr}
{Mono: Monotonicity L Gamma prodp}.

(* Specifications: *)
(* TODO: Maybe this should be abstracted to non-logic level about generic "Proper" vs. fold_left? *)
Lemma fold_left_mono: forall x1 x2 xs1 xs2,
(Forall2 (fun x1 x2 => |-- x1 --> x2) xs1 xs2) ->
|-- x1 --> x2 ->
|-- fold_left prodp xs1 x1 --> fold_left prodp xs2 x2.
Lemma fold_right_mono: forall x1 x2 xs1 xs2,
(Forall2 (fun x1 x2 => |-- x1 --> x2) xs1 xs2) ->
|-- x1 --> x2 ->
|-- fold_right prodp x1 xs1 --> fold_right prodp x2 xs2.
Lemma fold_left_mono2: forall x1 x2 xs,
|-- x1 --> x2 ->
|-- fold_left prodp xs x1 --> fold_left prodp xs x2.
Lemma fold_right_mono2: forall x1 x2 xs,
|-- x1 --> x2 ->
|-- fold_right prodp x1 xs --> fold_right prodp x2 xs.