--
-- This file was inspired from our development of -- SimpleTags.prg. -- Here we do away with tags, and use only position -- to represent variables. -- A Shape is a list of types. The poisiton -- in the list tells what variable has what type. data Shape:: *1 where E :: Shape P :: *0 ~> Shape ~> Shape deriving List(s) -- A count is a natural number, which is indexed -- by shapes and types. data Count:: Shape ~> Tag ~> *0 ~> *0 where Zero:: Count (P t b) a t Succ:: Count sh nm ty -> (Count (P ty2 sh)) nm ty deriving Nat(c) -- A Term is indexed by a Shape which determines what -- variables are used in the term, and what type those -- variables have. data Term:: Shape ~> *0 ~> *0 where Iconst :: Int -> Term sh Int Var:: Count i a ty -> Term i ty Pair:: Term sh a -> Term sh b -> Term sh (a,b) -- Comments -- 1) By using position for variable names we get alpha-renaming for free.