Nominal/Ex/Multi_Recs.thy
changeset 2481 3a5ebb2fcdbf
parent 2480 ac7dff1194e8
child 2615 d5713db7e146
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Nominal/Ex/Multi_Recs.thy	Wed Sep 22 14:19:48 2010 +0800
@@ -0,0 +1,49 @@
+theory Multi_Recs
+imports "../Nominal2"
+begin
+
+(* 
+  multiple recursive binders
+
+  example 7 from Peter Sewell's bestiary 
+
+*)
+
+atom_decl name
+
+nominal_datatype multi_recs: exp =
+  Var name
+| Unit
+| Pair exp exp
+| LetRec l::"lrbs" e::"exp"  bind (set) "bs l" in l e
+and lrb =
+  Assign name exp
+and lrbs =
+  Single lrb
+| More lrb lrbs
+binder
+  b :: "lrb \<Rightarrow> atom set" and
+  bs :: "lrbs \<Rightarrow> atom set"
+where
+  "b (Assign x e) = {atom x}"
+| "bs (Single a) = b a"
+| "bs (More a as) = (b a) \<union> (bs as)"
+
+thm multi_recs.distinct
+thm multi_recs.induct
+thm multi_recs.inducts
+thm multi_recs.exhaust
+thm multi_recs.fv_defs
+thm multi_recs.bn_defs
+thm multi_recs.perm_simps
+thm multi_recs.eq_iff
+thm multi_recs.fv_bn_eqvt
+thm multi_recs.size_eqvt
+thm multi_recs.supports
+thm multi_recs.fsupp
+thm multi_recs.supp
+
+end
+
+
+