Up to index of Isabelle/HOL/sHowe
theory Closed = UnLam(*
Closed and open terms
*)
Closed = UnLam +
consts
iwff :: "((var list) * uexp) set"
syntax
"@iwff" :: "var list => uexp => bool" ("((_) |--/ (_))" [50,50] 50)
translations
"l |-- e" == "(l,e) : iwff "
constdefs
wff :: (var list) => uexp => bool ("((_) |-/ (_))" [50,50] 50)
" env |- t == isexp t & (!n. newFor n t | n mem env)"
cloexp :: uexp => bool
"cloexp p == isexp p & Expr.closed p"
open :: uexp => bool
"open p == isexp p & ~ Expr.closed p"
udflt :: uexp
"udflt == (lam x. x)"
cloAbstr :: (uexp => uexp) => bool
"cloAbstr E == abstr E & cloexp (lam x. E x)"
rules
wff_iwff "(env |- s) = (env |-- s)"
sub_biSub "[| abstr N; y # env1 |- N (VAR y)|] ==> biSubst N n a (VAR y) = N (VAR y) "
inductive iwff
intrs
clo_VAR " (n mem env) ==> env |-- (VAR n)"
clo_App "[| env |-- e1; env |-- e2|] ==> env |-- (e1 $ e2)"
clo_Abs "[|abstr E; !n. (n # env) |-- (E (VAR n))|] ==> env |-- (lam x . E x)"
end
theorem cloexp_isexp:
cloexp t ==> isexp t
theorem cloexp_App:
[| cloexp s; cloexp t |] ==> cloexp (s $ t)
theorem clo_sub:
[| cloAbstr E; cloexp p |] ==> cloexp (E p)
theorem cloexp_udflt:
cloexp (lam x. x)
theorem wff_to_iwff:
l |- e ==> l |-- e
theorem iwff_to_wff:
l |-- e ==> l |- e
theorem wff_Nil_cloexp:
([] |- s) = cloexp s
theorem wff_Nil_cloexp1:
[] |- s ==> cloexp s
theorem wff_Nil_cloexp2:
cloexp s ==> [] |- s
theorem iwff_Nil_cloexp2:
cloexp s ==> [] |-- s
theorem iwff_Nil_cloexp1:
[] |-- s ==> cloexp s
theorem wff_isexp:
env |- s ==> isexp s
theorem wff_weak:
list |- s ==> a # list |- s
theorem wff_closed_subst:
[| a # list |- s; cloexp p |] ==> list |- subst s a p
theorem subst_App:
[| isexp s; isexp t |] ==> subst (s $ t) n = (%x. subst s n x $ subst t n x)
theorem subst_App1:
[| isexp s; isexp t |] ==> subst (s $ t) n p = subst s n p $ subst t n p
theorem subst_lam:
abstr e ==> subst (lam y. e y) n = (%x. lam y. biSubst e n x y)
theorem cloexp_subst_id:
cloexp s ==> subst s n p = s