Theory Functional_Substitution_Typing
theory Functional_Substitution_Typing
imports Typed_Functional_Substitution
begin
locale subst_is_typed_abbreviations =
is_typed: typed_functional_substitution where
base_typed = base_typed and is_typed = expr_is_typed +
is_welltyped: typed_functional_substitution where
base_typed = base_welltyped and is_typed = expr_is_welltyped
for
base_typed base_welltyped :: "('var, 'ty) var_types ⇒ 'base ⇒ 'ty ⇒ bool" and
expr_is_typed expr_is_welltyped :: "('var, 'ty) var_types ⇒ 'expr ⇒ bool"
begin
abbreviation is_typed_on where
"is_typed_on ≡ is_typed.base.is_typed_on"
abbreviation is_welltyped_on where
"is_welltyped_on ≡ is_welltyped.base.is_typed_on"
abbreviation is_typed where
"is_typed ≡ is_typed.base.is_typed_on UNIV"
abbreviation is_welltyped where
"is_welltyped ≡ is_welltyped.base.is_typed_on UNIV"
end
locale functional_substitution_typing =
is_typed: typed_functional_substitution where
base_typed = base_typed and is_typed = is_typed +
is_welltyped: typed_functional_substitution where
base_typed = base_welltyped and is_typed = is_welltyped
for
base_typed base_welltyped :: "('var, 'ty) var_types ⇒ 'base ⇒ 'ty ⇒ bool" and
is_typed is_welltyped :: "('var, 'ty) var_types ⇒ 'expr ⇒ bool" +
assumes typing: "⋀𝒱. typing (is_typed 𝒱) (is_welltyped 𝒱)"
begin
sublocale base: typing "is_typed 𝒱" "is_welltyped 𝒱"
by (rule typing)
sublocale subst: subst_is_typed_abbreviations
where expr_is_typed = is_typed and expr_is_welltyped = is_welltyped
by unfold_locales
end
locale base_functional_substitution_typing =
typed: explicitly_typed_functional_substitution where typed = typed +
welltyped: explicitly_typed_functional_substitution where typed = welltyped
for
welltyped typed :: "('var, 'ty) var_types ⇒ 'expr ⇒ 'ty ⇒ bool" +
assumes
explicit_typing: "⋀𝒱. explicit_typing (typed 𝒱) (welltyped 𝒱)"
begin
sublocale base: explicit_typing "typed 𝒱" "welltyped 𝒱"
using explicit_typing .
lemmas typed_id_subst = typed.typed_id_subst
lemmas welltyped_id_subst = welltyped.typed_id_subst
lemmas is_typed_id_subst = typed.is_typed_id_subst
lemmas is_welltyped_id_subst = welltyped.is_typed_id_subst
lemmas is_typed_on_subset = typed.is_typed_on_subset
lemmas is_welltyped_on_subset = welltyped.is_typed_on_subset
sublocale functional_substitution_typing where
is_typed = base.is_typed and is_welltyped = base.is_welltyped and base_typed = typed and
base_welltyped = welltyped and base_vars = vars and base_subst = subst
by unfold_locales
sublocale subst: typing "subst.is_typed_on X 𝒱" "subst.is_welltyped_on X 𝒱"
using base.typed_if_welltyped
by unfold_locales blast
end
end