Theory SC_Depth_Limit
theory SC_Depth_Limit
imports SC_Sema SC_Depth
begin
  
lemma SC_completeness: "⊨ Γ ⇒ Δ ⟹ Γ ⇒ Δ ↓ sequent_cost Γ Δ"
proof(induction "sequent_cost Γ Δ" arbitrary: Γ Δ)
  case 0 hence False by(simp add: sequent_cost_def) thus ?case by clarify
next
  case (Suc n)
  from Suc(3) show ?case
    using SCc.cases[OF Suc.hyps(1)]
oops
text‹Making this proof of completeness go through should be possible,
  but finding the right way to split the cases could get verbose.
The variant with the search procedure is a lot more elegant.›
  
lemma sc_sim_depth:
  assumes "sc Γ A Δ B = {}"
  shows "image_mset Atom (mset A) + mset Γ ⇒ image_mset Atom (mset B) + mset Δ ↓ sum_list (map size (Γ@Δ)) + (if set A ∩ set B = {} then 0 else 1)"
proof -
  have [simp]: "image_mset Atom (mset A) ⇒ image_mset Atom (mset B) ↓ Suc 0" (is ?k) if "set A ∩ set B ≠ {}" for A B 
  proof -
    from that obtain a where "a ∈ set A" "a ∈ set B" by blast
    thus ?k by(force simp: in_image_mset intro: SCc.Ax[where k=a])
  qed
  note SCc.intros(3-)[intro]
  have [elim!]: "Γ ⇒ Δ ↓ n ⟹ n ≤ m ⟹ Γ ⇒ Δ ↓ m" for Γ Δ n m using dec_induct by(fastforce elim!: deeper_suc) 
  from assms show ?thesis
    by(induction Γ A Δ B rule: sc.induct)
      (auto
      simp add: list_sequent_cost_def add.assoc deeper_suc weakenR'
      split: if_splits option.splits)
qed
corollary sc_depth_complete:
  assumes s: "⊨ Γ ⇒ Δ"
  shows "Γ ⇒ Δ ↓ sum_mset (image_mset size (Γ+Δ))"
proof -
  obtain Γ' Δ' where p: "Γ = mset Γ'" "Δ = mset Δ'" by (metis ex_mset)
  with s have sl: "⊨ mset Γ' ⇒ mset Δ'" by simp
  let ?d = "sum_mset (image_mset size (Γ+Δ))"
  have d: "?d = sum_list (map size (Γ'@Δ'))"
    unfolding p by (metis mset_append mset_map sum_mset_sum_list)
  have "mset Γ' ⇒ mset Δ' ↓ ?d"
  proof cases
    assume "sc Γ' [] Δ' [] = {}"
    from sc_sim_depth[OF this] show "mset Γ' ⇒ mset Δ' ↓ ?d" unfolding d by auto
  next
    assume "sc Γ' [] Δ' [] ≠ {}"
    with SC_counterexample have "¬ ⊨ mset Γ' ⇒ mset Δ'" by fastforce
    moreover note s[unfolded p]
    ultimately have False ..
    thus "mset Γ' ⇒ mset Δ' ↓ ?d" ..
  qed
  thus ?thesis unfolding p .
qed
end