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}.

(* Specifications: *)
Lemma provable_impp_refl: forall (x: expr), |-- x --> x.
Lemma aux_minimun_rule00: forall (x y: expr), |-- x -> |-- y --> x.
Lemma aux_minimun_theorem00: forall (x y z: expr), |--  (y --> z) --> (x --> y) --> (x --> z).
Lemma aux_minimun_rule01: forall (x y z: expr), |-- x --> y -> |-- (z --> x) --> (z --> y).
Lemma aux_minimun_rule02: forall (x y z: expr), |-- x --> y -> |-- y --> z -> |-- x --> z.
Lemma aux_minimun_theorem01: forall (x y z: expr), |-- (x --> z) --> (x --> y --> z).
Lemma aux_minimun_theorem02: forall (x y: expr), |-- x --> (x --> y) --> y.
Lemma aux_minimun_theorem03: forall (x y z: expr), |--  y --> (x --> y --> z) --> (x --> z).
Lemma aux_minimun_theorem04: forall (x y: expr), |-- (x --> x --> y) --> x --> y.
Lemma provable_impp_arg_switch: forall (x y z: expr), |-- (x --> y --> z) --> (y --> x --> z).
Lemma provable_impp_trans: forall (x y z: expr), |-- (x --> y) --> (y --> z) --> (x --> z).
End DerivableRulesFromAxiomatization.