--
-- 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.