Local Open Scope logic_base.
Local Open Scope syntax.
(* TODO: rename it to IntuitionisticPropositionalAxiomatization. *)
Class IntuitionisticPropositionalLogic (L: Language) {minL: MinimunLanguage L} {pL: PropositionalLanguage L} (Gamma: ProofTheory L) {minAX: MinimunAxiomatization L Gamma} := {
andp_intros: forall x y, |-- x --> y --> x && y;
andp_elim1: forall x y, |-- x && y --> x;
andp_elim2: forall x y, |-- x && y --> y;
orp_intros1: forall x y, |-- x --> x || y;
orp_intros2: forall x y, |-- y --> x || y;
orp_elim: forall x y z, |-- (x --> z) --> (y --> z) --> (x || y --> z);
falsep_elim: forall x, |-- FF --> x
}.
Class IntuitionisticPropositionalSequentCalculus (L: Language) {pL: PropositionalLanguage L} (Gamma: ProofTheory L) := {
deduction_andp_intros: forall Phi x y, Phi |-- x -> Phi |-- y -> Phi |-- x && y;
deduction_andp_elim1: forall Phi x y, Phi |-- x && y -> Phi |-- x;
deduction_andp_elim2: forall Phi x y, Phi |-- x && y -> Phi |-- y;
deduction_orp_intros1: forall Phi x y, Phi |-- x -> Phi |-- x || y;
deduction_orp_intros2: forall Phi x y, Phi |-- y -> Phi |-- x || y;
deduction_orp_elim: forall Phi x y z, Phi;; x |-- z -> Phi ;; y |-- z -> Phi;; x || y |-- z;
deduction_falsep_elim: forall Phi x, Phi |-- FF -> Phi |-- x
}.
Section DerivableRulesFromSequentCalculus1.
Context {L: Language}
{minL: MinimunLanguage L}
{pL: PropositionalLanguage L}
{Gamma: ProofTheory L}
{bSC: BasicSequentCalculus L Gamma}
{minSC: MinimunSequentCalculus L Gamma}
{ipSC: IntuitionisticPropositionalSequentCalculus L Gamma}.

(* Specifications: *)
Lemma derivable_andp_intros: forall (Phi: context) (x y: expr),
Phi |-- x --> y --> x && y.
Lemma derivable_andp_elim1: forall (Phi: context) (x y: expr),
Phi |-- x && y --> x.
Lemma derivable_andp_elim2: forall (Phi: context) (x y: expr),
Phi |-- x && y --> y.
Lemma derivable_orp_intros1: forall (Phi: context) (x y: expr),
Phi |-- x --> x || y.
Lemma derivable_orp_intros2: forall (Phi: context) (x y: expr),
Phi |-- y --> x || y.
Lemma derivable_orp_elim: forall (Phi: context) (x y z: expr),
Phi |-- (x --> z) --> (y --> z) --> (x || y --> z).
Lemma derivable_falsep_elim: forall (Phi: context) (x: expr),
Phi |-- FF --> x.
Lemma deduction_orp_elim': forall (Phi: context) (x y z: expr),
Phi |-- x --> z ->
Phi |-- y --> z ->
Phi |-- x || y --> z.
Lemma derivable_double_negp_intros: forall (Phi: context) (x: expr),
Phi |-- x --> ~~ ~~ x.
Lemma deduction_double_negp_intros: forall (Phi: context) (x: expr),
Phi |-- x ->
Phi |-- ~~ ~~ x.
Lemma derivable_contradiction_elim: forall (Phi: context) (x y: expr),
Phi |-- x --> ~~ x --> y.
Lemma deduction_contradiction_elim: forall (Phi: context) (x y: expr),
Phi |-- x ->
Phi |-- ~~ x ->
Phi |-- y.
Lemma derivable_iffp_refl: forall (Phi: context) (x: expr),
Phi |-- x <--> x.