Propositional Logic #

Now, let's see how to study logic within the logic of Lean.

namespace PropLogic
inductive Proposition : Type where
  | var (name: String): Proposition
  | top : Proposition
  | and (p q : Proposition) : Proposition
  | imp (p q : Proposition) : Proposition
  | bot : Proposition
  | or (p q : Proposition) : Proposition

def Proposition.not (p : Proposition) : Proposition := p.imp .bot

abbrev Context := List Proposition

abbrev Context.add (p : Proposition) (Γ : Context) : Context := p :: Γ

Classical provability relation.

inductive Context.provesC: Context -> Proposition -> Prop where
  | ax {Γ: Context} {p} : p  Γ -> Γ.provesC p
  | impI {Γ: Context} {p q} : (Γ.add p).provesC q -> Γ.provesC (Proposition.imp p q)
  | andI {Γ: Context} {p q} : Γ.provesC p -> Γ.provesC q -> Γ.provesC (Proposition.and p q)
  | andE1 {Γ: Context} {p q} : Γ.provesC (Proposition.and p q) -> Γ.provesC p
  | andE2 {Γ: Context} {p q} : Γ.provesC (Proposition.and p q) -> Γ.provesC q
  | orI1 {Γ: Context} {p q} : Γ.provesC p -> Γ.provesC (Proposition.or p q)
  | orI2 {Γ: Context} {p q} : Γ.provesC q -> Γ.provesC (Proposition.or p q)
  | orE {Γ: Context} {p q r} : Γ.provesC (Proposition.or p q) -> (Γ.add p).provesC r -> (Γ.add q).provesC r -> Γ.provesC r
  | botE {Γ: Context} {p} : Γ.provesC Proposition.bot -> Γ.provesC p
  | em {Γ: Context} {p} : Γ.provesC (Proposition.or p p.not)

end PropLogic