Up to index of Isabelle/HOL/sHowe
theory Expr = Main(* File: Expr.thy Author: Simon Ambler (sja4@mcs.le.ac.uk) Copyright: Leicester University, 2001. Time-stamp: <2002-04-08 16:27:18 sja4> A de Bruijn representation of expressions in the untyped lambda-calculus. *) Expr = Main + types var = nat (* an enumerable set of free variable names *) bnd = nat (* indices for bound variables *) datatype 'a expr = CON 'a | VAR var | BND bnd | APP ('a expr) ('a expr) ("(_) /$$ (_)" [200,201] 200) | ABS ('a expr) consts (* level predicate determines expressions which are well-formed at each de Bruijn level. `level i s' holds if and only if the addition of i enclosing ABS constructors results in an expression which is well-formed and has no dangling references. *) levelSet :: "(bnd * 'a expr) set" (* instantiation of a bound variable by an expression *) inst :: "[bnd, 'a expr, 'a expr] => 'a expr" (* simultaneous instantiation of consecutive bound variables *) insts :: "[bnd, ('a expr) list, 'a expr] => 'a expr" (* variable name does not occur in expression *) newFor :: "[var, 'a expr] => bool" (* function to generate fresh variable names *) gV :: "'a expr => var" (* substitution for a free variable *) subst :: "['a expr, var, 'a expr] => 'a expr" syntax level :: "[bnd, 'a expr] => bool" translations "level i s" == "(i,s) : levelSet" constdefs free :: "[var, 'a expr] => bool" "free == % n s. ~newFor n s" closed :: "'a expr => bool" "closed == % s. (! n. newFor n s)" proper :: 'a expr => bool "proper == % s. level 0 s" inductive levelSet intrs level_CON "level i (CON a)" level_VAR "level i (VAR n)" level_BND "j<i ==> level i (BND j)" level_APP "[| level i s; level i t |] ==> level i (s $$ t)" level_ABS "level (Suc i) s ==> level i (ABS s)" primrec "inst k u (CON a) = CON a" "inst k u (VAR i) = VAR i" "inst k u (BND i) = (if i=k then u else BND i)" "inst k u (s $$ t) = inst k u s $$ inst k u t" "inst k u (ABS s) = ABS (inst (Suc k) u s)" primrec (* simultaneous instantiation of consecutive bound variables, starting from level i, by expressions in the list xs *) "insts i xs (CON a) = CON a" "insts i xs (VAR n) = VAR n" "insts i xs (BND j) = (if i<=j & j-i < length xs then xs!(j-i) else BND j)" "insts i xs (s $$ t) = insts i xs s $$ insts i xs t" "insts i xs (ABS s) = ABS (insts (Suc i) xs s)" primrec "newFor j (CON a) = True" "newFor j (VAR i) = (j~=i)" "newFor j (BND i) = True" "newFor j (s $$ t) = (newFor j s & newFor j t)" "newFor j (ABS s) = (newFor j s)" primrec "gV (CON a) = 0" "gV (VAR i) = Suc i" "gV (BND i) = 0" "gV (s $$ t) = max (gV s) (gV t)" "gV (ABS s) = (gV s)" primrec "subst (CON a) n u = CON a" "subst (VAR m) n u = (if n=m then u else VAR m)" "subst (BND i) n u = BND i" "subst (s $$ t) n u = subst s n u $$ subst t n u" "subst (ABS s) n u = ABS (subst s n u)" end
theorem level_le_level:
[| level i s; i <= j |] ==> level j s
theorem level_0_level:
level 0 s ==> level i s
theorem gV_newFor:
gV s <= j ==> newFor j s
theorem newFor_gV:
newFor (gV s) s
theorem level_inst_id:
[| level i s; i <= j |] ==> inst j u s = s
theorem proper_inst:
proper s ==> inst j u s = s
theorem proper_CON:
proper (CON a)
theorem proper_VAR:
proper (VAR n)
theorem proper_APP:
[| proper s; proper t |] ==> proper (s $$ t)
theorem proper_APP_E:
[| proper (s $$ t); [| proper s; proper t |] ==> P |] ==> P
theorem proper_APPD1:
proper (s $$ t) ==> proper s
theorem proper_APPD2:
proper (s $$ t) ==> proper t
theorem proper_BND_E:
proper (BND j) ==> P
theorem not_proper_BND:
¬ proper (BND j)
theorem inst_swap:
[| level 0 s; level 0 t; i ~= j |] ==> inst i s (inst j t u) = inst j t (inst i s u)
theorem newFor_subst:
newFor n (subst s m t) = ((newFor n s | n = m) & (newFor n t | newFor m s))
theorem subst_VAR_id:
subst s n (VAR n) = s
theorem newFor_subst_id:
newFor n s ==> subst s n u = s