Nominal/Ex/NoneExamples.thy
author Christian Urban <urbanc@in.tum.de>
Wed, 08 Dec 2010 17:07:08 +0000
changeset 2603 90779aefbf1a
parent 2454 9ffee4eb1ae1
child 2622 e6e6a3da81aa
permissions -rw-r--r--
first tests about exhaust

theory NoneExamples
imports "../Nominal2"
begin

text {*
  This example is not covered by our binding 
  specification.
*}

atom_decl name

text {* 
  "Weirdo" example from Peter Sewell's bestiary. 

  p2 occurs in two bodies
*}

(*
nominal_datatype weird =
  Foo_var "name"
| Foo_pair "weird" "weird" 
| Foo x::"name" y::"name" p1::"weird" p2::"weird" p3::"weird"
    bind x in p1 p2, 
    bind y in p2 p3
*)

text {* 
  this example binds bound names and therefore the 
  fv-function is not respectful - the proof just fails.
*}

(*
nominal_datatype trm =
  Var "name"
| Lam x::"name" t::"trm"         bind x in t
| Let left::"trm" right::"trm"   bind (set) "bv left" in right
binder
  bv
where
  "bv (Var n) = {}"
| "bv (Lam n t) = {atom n} \<union> bv t"
| "bv (Let l r) = bv l \<union> bv r"
*)

text {* 
  this example uses "-" in the binding function; 
  at the moment this is unsupported 
*}

(*
nominal_datatype trm' =
  Var "name"
| Lam l::"name" r::"trm'"   bind l in r
| Let l::"trm'" r::"trm'"   bind (set) "bv' l" in r
binder
  bv'
where
  "bv' (Var n) = {atom n}"
| "bv' (Lam n t) = bv' t - {atom n}"
| "bv' (Let l r) = bv' l \<union> bv' r"
*)

text {* 
  again this example binds bound names - so not respectful
*}

(*
nominal_datatype trm =
  Var "name"
| Lam n::"name" l::"trm" bind n in l
and bla =
  Bla f::"trm" s::"trm" bind (set) "bv f" in s
binder
  bv :: "trm \<Rightarrow> atom set"
where
  "bv (Vam x) = {}"
| "bv (Lam x b) = {atom x}"
*)

end