Theory Implicational_Logic_Sequent_Calculus

theory Implicational_Logic_Sequent_Calculus imports Main begin

datatype form =
  Pro nat () |
  Imp form form (infixr  100)

primrec semantics (infix  50) where
  I  n = I n |
  I  p  q = (I  p  I  q)

abbreviation sc (_) where I X Y  (p  set X. I  p)  (q  set Y. I  q)

inductive SC (infix  50) where
  Imp_L: p  q # X  Y if X  p # Y and q # X  Y |
  Imp_R: X  p  q # Y if p # X  q # Y |
  Set_L: X'  Y if X  Y and set X' = set X |
  Set_R: X  Y' if X  Y and set Y' = set Y |
  Basic: p # _  p # _

function mp where
  mp A B (p  q # C) [] = (mp A B C [p]  mp A B (q # C) []) |
  mp A B C (p  q # D) = mp A B (p # C) (q # D) |
  mp A B [] [] = (set A  set B  {}) |
  mp A B (n # C) [] = mp (n # A) B C [] |
  mp A B C (n # D) = mp A (n # B) C D
  by pat_completeness simp_all

termination
  by (relation measure (λ(_, _, C, D). 2 * (p  C @ D. size p) + size (C @ D))) simp_all

lemma main: (I. I (map  A @ C) (map  B @ D))  mp A B C D
  by (induct rule: mp.induct) (auto 5 2)

definition prover () where  p  mp [] [] [] [p]

theorem prover_correct:  p  (I. I  p)
  unfolding prover_def by (simp flip: main)

export_code  in SML

lemma MP: mp A B C D  set X  set (map  A @ C)  set Y  set (map  B @ D)  X  Y
proof (induct A B C D arbitrary: X Y rule: mp.induct[case_names Imp_L Imp_R Basic])
  case (Imp_L A B p q C)
  have
    set (map  A @ C)  set X
    set (map  B)  set Y
    using Imp_L(4,5) by auto
  moreover from this have
    set (map  A @ C)  set (q # X)
    set (map  B)  set (p # Y)
    by auto
  ultimately have p  q # X  Y
    using Imp_L(1-3) SC.Imp_L by simp
  then show ?case
    using Imp_L(4) Set_L by fastforce
next
  case (Imp_R A B C p q D)
  have
    set (map  A @ C)  set (p # X)
    set (map  B @ D)  set (q # Y)
    using Imp_R(3,4) by auto
  then have X  p  q # Y
    using Imp_R(1,2) SC.Imp_R by simp
  then show ?case
    using Imp_R(4) Set_R by fastforce
next
  case (Basic A B)
  obtain n where
    n  set A
    n  set B
    using Basic(1) by auto
  then have
    set (n # X) = set X
    set (n # Y) = set Y
    using Basic(2,3) by auto
  then show ?case
    using Set_L Set_R SC.Basic by metis
qed simp_all

theorem OK: (I. I X Y)  X  Y
  by (rule, use MP main[of [] _ [] _] in simp, induct rule: SC.induct) auto

corollary []  [p]  (I. I  p)
  using OK by force

proposition []  [p  p]
proof -
  from Imp_R have ?thesis if [p]  [p]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [p  (p  q)  q]
proof -
  from Imp_R have ?thesis if [p]  [(p  q)  q]
    using that by force
  with Imp_R have ?thesis if [p  q, p]  [q]
    using that by force
  with Imp_L have ?thesis if [p]  [p, q] and [q, p]  [q]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [p  q  q  p]
proof -
  from Imp_R have ?thesis if [p]  [q  q  p]
    using that by force
  with Imp_R have ?thesis if [q, p]  [q  p]
    using that by force
  with Imp_R have ?thesis if [q, q, p]  [p]
    using that by force
  with Set_L have ?thesis if [p, q]  [p]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [(p  q)  p  q]
proof -
  from Imp_R have ?thesis if [p  q]  [p  q]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [p  p  q  q]
proof -
  from Imp_R have ?thesis if [p]  [p  q  q]
    using that by force
  with Imp_R have ?thesis if [p, p]  [q  q]
    using that by force
  with Imp_R have ?thesis if [q, p, p]  [q]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [(p  p  q)  p  q]
proof -
  from Imp_R have ?thesis if [p  p  q]  [p  q]
    using that by force
  with Imp_R have ?thesis if [p, p  p  q]  [q]
    using that by force
  with Set_L have ?thesis if [p  p  q, p]  [q]
    using that by force
  with Imp_L have ?thesis if [p]  [p, q] and [p  q, p]  [q]
    using that by force
  with Imp_L have ?thesis if [p]  [p, q] and [q, p]  [q] and [p]  [p, q]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [p  q  p]
proof -
  from Imp_R have ?thesis if [p]  [q  p]
    using that by force
  with Imp_R have ?thesis if [q, p]  [p]
    using that by force
  with Set_L have ?thesis if [p, q]  [p]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [(p  r)  (r  q)  p  q]
proof -
  from Imp_R have ?thesis if [p  r]  [(r  q)  p  q]
    using that by force
  with Imp_R have ?thesis if [r  q, p  r]  [p  q]
    using that by force
  with Imp_R have ?thesis if [p, r  q, p  r]  [q]
    using that by force
  with Set_L have ?thesis if [r  q, p  r, p]  [q]
    using that by force
  with Imp_L have ?thesis if [p  r, p]  [r, q] and [q, p  r, p]  [q]
    using that by force
  with Basic have ?thesis if [p  r, p]  [r, q]
    using that by force
  with Imp_L have ?thesis if [p]  [p, r, q] and [r, p]  [r, q]
    using that by force
  with Basic show ?thesis
    by force
qed

proposition []  [((p  q)  p)  p]
proof -
  from Imp_R have ?thesis if [(p  q)  p]  [p]
    using that by force
  with Imp_L have ?thesis if []  [p  q, p] and [p]  [p]
    using that by force
  with Basic have ?thesis if []  [p  q, p]
    using that by force
  with Imp_R have ?thesis if [p]  [q, p]
    using that by force
  with Set_R have ?thesis if [p]  [p, q]
    using that by force
  with Basic show ?thesis
    by force
qed

end