Local Open Scope logic_base.
Local Open Scope syntax.
Definition multi_imp {L: Language} {minL: MinimunLanguage L} (xs: list expr) (y: expr): expr :=
fold_right impp y xs.
Class NormalAxiomatization (L: Language) {minL: MinimunLanguage L} (Gamma: ProofTheory L): Type := {
derivable_provable: forall Phi y, derivable Phi y <->
exists xs, Forall (fun x => Phi x) xs /\ provable (multi_imp xs y)
}.
Class MinimunAxiomatization (L: Language) {minL: MinimunLanguage L} (Gamma: ProofTheory L) := {
modus_ponens: forall x y, |-- (x --> y) -> |-- x -> |-- y;
axiom1: forall x y, |-- (x --> (y --> x));
axiom2: forall x y z, |-- ((x --> y --> z) --> (x --> y) --> (x --> z))
}.
Class MinimunSequentCalculus (L: Language) {minL: MinimunLanguage L} (Gamma: ProofTheory L) := {
deduction_modus_ponens: forall Phi x y, Phi |-- x -> Phi |-- x --> y -> Phi |-- y;
deduction_impp_intros: forall Phi x y, Phi;; x |-- y -> Phi |-- x --> y
}.
Section DerivableRulesFromAxiomatization.
Context {L: Language}
{minL: MinimunLanguage L}
{Gamma: ProofTheory L}
{minAX: MinimunAxiomatization L Gamma}.

Lemma provable_impp_arg_switch: forall (x y z: expr), |-- (x --> y --> z) --> (y --> x --> z).