Theory Sequent2

theory Sequent2 imports Sequent begin

section ‹Completeness Revisited›

lemma ‹∃p. q = compl p›
  by (metis compl.simps(1))

definition compl' where
  ‹compl' = (λq. (SOME p. q = compl p))›

lemma comp'_sem:
  ‹eval e f g (compl' p) ⟷ ¬ eval e f g p›
  by (smt (z3) compl'_def compl.simps(1) compl eval.simps(7) someI_ex)

lemma comp'_sem_list: ‹list_ex (λp. ¬ eval e f g p) (map compl' ps) ⟷ list_ex (eval e f g) ps›
  by (induct ps) (use comp'_sem in auto)

theorem SC_completeness':
  fixes ps :: ‹(nat, nat) form list›
  assumes ‹∀(e :: nat ⇒ nat hterm) f g. list_ex (eval e f g) (p # ps)›
  shows ‹⊢ p # ps›
proof -
  define ps' where ‹ps' = map compl' ps›
  then have ‹ps = map compl ps'›
    by (induct ps arbitrary: ps') (simp, smt (verit) compl'_def compl.simps(1) list.simps(9) someI_ex)
  from assms have ‹∀(e :: nat ⇒ nat hterm) f g. (list_ex (eval e f g) ps) ∨ eval e f g p›
    by auto
  then have ‹∀(e :: nat ⇒ nat hterm) f g. (list_ex (λp. ¬ eval e f g p) ps') ∨ eval e f g p›
    unfolding ps'_def using comp'_sem_list by blast
  then have ‹∀(e :: nat ⇒ nat hterm) f g. list_all (eval e f g) ps' ⟶ eval e f g p›
    by (metis Ball_set Bex_set)
  then have ‹⊢ p # map compl ps'›
    using SC_completeness by blast
  then show ?thesis
    using ‹ps = map compl ps'› by auto
qed

corollary
  fixes ps :: ‹(nat, nat) form list›
  assumes ‹∀(e :: nat ⇒ nat hterm) f g. list_ex (eval e f g) ps›
  shows ‹⊢ ps›
  using assms SC_completeness' by (cases ps) auto

end