diff -r d867021d8ac1 -r 3effd5446226 Nominal/Test.thy --- a/Nominal/Test.thy Thu Feb 25 15:40:09 2010 +0100 +++ b/Nominal/Test.thy Thu Feb 25 15:41:23 2010 +0100 @@ -27,7 +27,7 @@ nominal_datatype trm' = Var "name" | App "trm'" "trm'" -| Lam x::"name" t::"trm'" bind x in t +| Lam x::"name" t::"trm'" bind x in t | Let p::"pat'" "trm'" t::"trm'" bind "f p" in t and pat' = PN @@ -195,6 +195,58 @@ "bv9 (Var9 x) = {}" | "bv9 (Lam9 x b) = {atom x}" +(* example form Leroy 96 about modules *) + +nominal_datatype mexp = + Acc path +| Stru body +| Funct x::name sexp m::mexp bind x in m +| FApp mexp path +| Ascr mexp sexp +and body = + Empty +| Seq c::defn d::body bind "cbinders c" in d +and defn = + Type name tyty +| Dty name +| DStru name mexp +| Val name trmtrm +and sexp = + Sig sbody +| SFunc name sexp sexp +and sbody = + SEmpty +| SSeq C::spec D::sbody bind "Cbinders C" in D +and spec = + Type1 name +| Type2 name tyty +| SStru name sexp +| SVal name tyty +and tyty = + Tyref1 name +| Tyref2 path tyty +| Fun tyty tyty +and path = + Sref1 name +| Sref2 path name +and trmtrm = + Tref1 name +| Tref2 path name +| Lam v::name tyty M::trmtrm bind v in M +| App trmtrm trmtrm +| Let body trmtrm +binder + cbinders :: "defn \ atom set" +and Cbinders :: "spec \ atom set" +where + "cbinders (Type t T) = {atom t}" +| "cbinders (Dty t) = {atom t}" +| "cbinders (DStru x s) = {atom x}" +| "cbinders (Val v M) = {atom v}" +| "Cbinders (Type1 t) = {atom t}" +| "Cbinders (Type2 t T) = {atom t}" +| "Cbinders (SStru x S) = {atom x}" +| "Cbinders (SVal v T) = {atom v}" (* core haskell *)