Theory MiniSC_HC

subsubsection‹SC to HC›
theory MiniSC_HC
imports MiniSC HC
begin

inductive_set AX1 where
"F  AX0  F  AX1" |
"((F  )  )  F  AX1"
lemma AX01: "AX0  AX1" by (simp add: AX1.intros(1) subsetI)
lemma AX1_away: "AX1  Γ = AX0  (Γ  AX1)" using AX01 by blast

lemma Deduction1: "F  (AX1  Γ ) H   (AX1  Γ) H (F  )" unfolding AX1_away by (metis Deduction_theorem HC.simps HC_mono Un_commute Un_insert_left insertI1 subset_insertI)
lemma Deduction2: "(F  )  (AX1  Γ) H   (AX1  Γ) H F" (is "?l  ?r")
proof
  assume l: ?l
  with Deduction_theorem[where Γ="AX1  Γ" and F="F  " and G=]
  have "AX1  Γ H (F  )  " unfolding AX1_away by(simp add: Un_commute)
  moreover have "AX1  Γ H ((F  )  )  F" using AX1.intros(2) HC.Ax by blast
  ultimately show ?r using HC.MP by blast
next
  assume r: ?r thus ?l by (meson HC.simps HC_mono insertI1 subset_insertI)
qed

lemma 
  "Γ  Δ  is_mini_mset Γ  is_mini_mset Δ 
  (set_mset Γ  (λF. F  ) ` set_mset Δ  AX1) H "
proof(induction "Γ" "Δ" rule: SCp.induct)
  case (ImpL Γ F Δ G)
  from ImpL.prems have "is_mini_mset Γ" "is_mini_mset (F, Δ)" by simp_all
  with ImpL.IH(1) have IH1: "set_mset Γ  (λF. F  ) ` set_mset (F, Δ)  AX1 H " .
  hence IH1: "F    set_mset Γ  (λF. F  ) ` set_mset Δ  AX1 H " by simp
  from ImpL.prems have "is_mini_mset (G, Γ)" "is_mini_mset Δ" by simp_all
  with ImpL.IH(2) have IH2: "set_mset (G, Γ)  (λF. F  ) ` set_mset Δ  AX1 H " .
  hence IH2: "G  (set_mset Γ  (λF. F  ) ` set_mset Δ  AX1) H " by simp
  have R: "F  G  AX1  Γ H " if "G  AX1  Γ H " "F    AX1  Γ H " for Γ 
    using that by (metis Ax Deduction1 Deduction2 HC_mono MP insertI1 subset_insertI)
    (* I don't construct the actual proofs for the Rs. Sledgehammer is doing all the interesting work. :/ *)
  from R[where Γ="set_mset Γ  (λF. F  ) ` set_mset Δ"]
  have "F  G  (set_mset Γ  (λF. F  ) ` set_mset Δ  AX1) H " using IH2 IH1 by(simp add: Un_commute)
  thus ?case by simp
next
  case (ImpR F Γ G Δ)
  hence "is_mini_mset (F, Γ)" "is_mini_mset (G, Δ)" by simp_all
  with ImpR.IH have IH: "F  G    set_mset Γ  (λF. F  ) ` set_mset Δ  AX1 H " by(simp add: insert_commute)
  have R: "(F  G)    Γ  AX1 H " if "F  G    Γ  AX1 H " for Γ using that
    by (metis AX1_away Deduction2 Deduction_theorem Un_commute Un_insert_right)
  thus ?case using IH by simp
next
  case (Ax k Γ Δ)
  have R: "F  F    Γ  AX1 H " for F :: "'a formula" and Γ by (meson HC.simps insert_iff)
  from R[where F="Atom k" and Γ="set_mset Γ  (λF. F  ) ` set_mset Δ"] show ?case using Ax.hyps
    by (simp add: insert_absorb)
next
  case BotL thus ?case by (simp add: HC.Ax)
qed simp_all

end