Theory Semantics
section ‹Semantics›
theory Semantics imports Syntax begin
subsection ‹Definition›
type_synonym 'a var_denot = ‹nat ⇒ 'a›
type_synonym 'a fun_denot = ‹nat ⇒ 'a list ⇒ 'a›
type_synonym 'a pre_denot = ‹nat ⇒ 'a list ⇒ bool›
primrec semantics_tm :: ‹'a var_denot ⇒ 'a fun_denot ⇒ tm ⇒ 'a› (‹⦇_, _⦈›) where
‹⦇E, F⦈ (❙#n) = E n›
| ‹⦇E, F⦈ (❙†f ts) = F f (map ⦇E, F⦈ ts)›
primrec semantics_fm :: ‹'a var_denot ⇒ 'a fun_denot ⇒ 'a pre_denot ⇒ fm ⇒ bool›
(‹⟦_, _, _⟧›) where
‹⟦_, _, _⟧ ❙⊥ = False›
| ‹⟦E, F, G⟧ (❙‡P ts) = G P (map ⦇E, F⦈ ts)›
| ‹⟦E, F, G⟧ (p ❙⟶ q) = (⟦E, F, G⟧ p ⟶ ⟦E, F, G⟧ q)›
| ‹⟦E, F, G⟧ (❙∀p) = (∀x. ⟦x ⨟ E, F, G⟧ p)›
fun sc :: ‹('a var_denot × 'a fun_denot × 'a pre_denot) ⇒ sequent ⇒ bool› where
‹sc (E, F, G) (A, B) = ((∀p [∈] A. ⟦E, F, G⟧ p) ⟶ (∃q [∈] B. ⟦E, F, G⟧ q))›
subsection ‹Substitution›
lemma add_env_semantics [simp]: ‹⦇E, F⦈ ((t ⨟ s) n) = (⦇E, F⦈ t ⨟ λm. ⦇E, F⦈ (s m)) n›
by (induct n) simp_all
lemma lift_lemma [simp]: ‹⦇x ⨟ E, F⦈ (lift_tm t) = ⦇E, F⦈ t›
by (induct t) (auto cong: map_cong)
lemma sub_tm_semantics [simp]: ‹⦇E, F⦈ (sub_tm s t) = ⦇λn. ⦇E, F⦈ (s n), F⦈ t›
by (induct t) (auto cong: map_cong)
lemma sub_fm_semantics [simp]: ‹⟦E, F, G⟧ (sub_fm s p) = ⟦λn. ⦇E, F⦈ (s n), F, G⟧ p›
by (induct p arbitrary: E s) (auto cong: map_cong)
subsection ‹Variables›
lemma upd_vars_tm [simp]: ‹n [∉] vars_tm t ⟹ ⦇E(n := x), F⦈ t = ⦇E, F⦈ t›
by (induct t) (auto cong: map_cong)
lemma add_upd_commute [simp]: ‹(y ⨟ E(n := x)) m = ((y ⨟ E)(Suc n := x)) m›
by (induct m) simp_all
lemma upd_vars_fm [simp]: ‹max_list (vars_fm p) < n ⟹ ⟦E(n := x), F, G⟧ p = ⟦E, F, G⟧ p›
proof (induct p arbitrary: E n)
case (Pre P ts)
moreover have ‹max_list (concat (map vars_tm ts)) < n›
using Pre.prems max_list_concat by simp
then have ‹n [∉] concat (map vars_tm ts)›
using max_list_in by blast
then have ‹∀t [∈] ts. n [∉] vars_tm t›
by simp
ultimately show ?case
using upd_vars_tm by (metis list.map_cong semantics_fm.simps(2))
next
case (Uni p)
have ‹?case = ((∀y. ⟦λm. (y ⨟ E(n := x)) m, F, G⟧ p) = (∀y. ⟦y ⨟ E, F, G⟧ p))›
by (simp add: fun_upd_def)
then show ?case
using Uni by simp
qed (auto simp: max_list_append cong: map_cong)
end