Theory Term_Typing

theory Term_Typing
  imports Typing Context_Extra
begin

type_synonym ('f, 'ty) fun_types = "'f  'ty list × 'ty"

locale context_compatible_typing =
  fixes Fun typed
  assumes
   context_compatible [intro]:
    "t t' c τ τ'.
      typed t τ' 
      typed t' τ' 
      typed (Func; t) τ 
      typed (Func; t') τ"

locale subterm_typing =
  fixes Fun typed
  assumes
    subterm': "f ts τ . typed (Fun f ts) τ  tset ts. τ'. typed t τ'"
begin

lemma subterm: "typed (Func; t) τ  τ. typed t τ"
proof(induction c arbitrary: τ)
  case Hole
  then show ?case
    by auto
next
  case (More f ss1 c ss2)

 then have "typed (Fun f (ss1 @ Func;t # ss2)) τ"
    by simp

  then have "τ. typed (Func;t) τ"
    using subterm'
    by simp

  then obtain τ' where "typed (Func;t) τ'"
    by blast

  then show ?case
    using More.IH
    by simp
qed

end

locale term_typing =
  explicit_typing +
  typed: context_compatible_typing where typed = typed +
  welltyped: context_compatible_typing where typed = welltyped +
  welltyped: subterm_typing where typed = welltyped +
assumes all_terms_are_typed: "t. is_typed t"
begin

sublocale typed: subterm_typing
  by unfold_locales (auto intro: all_terms_are_typed)

end

end